嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn http://staff.ustc.edu.cn/~xlanchen Spring 2006 中国科学技术大学计算机系
Embedded Operating Systems 上周三 嵌入式系统基本概念 嵌入式硬件的发展 嵌入式软件及其开发 嵌入式操作系统及系统开发 典型嵌入式操作系统介绍 嵌入式操作系统选型 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 上周四 GNU Tools简介 GCC Binutils Gdb make xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 本课的主要内容: 第一部分:开发工具介绍(续) 第二部分:SkyEye介绍 xlanchen@2006.5.24 Embedded Operating Systems
开发工具介绍(续) xlanchen@2006.5.24
Embedded Operating Systems 主要内容 GNU Tools介绍(续) ld 交叉编译环境的安装 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems GNU Tools—ld ld,The GNU Linker Linux上常用的链接器 ld软件的作用是把各种目标文件(.o文件)和库文件链接在一起,并定位数据和函数地址,最终生成可执行程序 gcc可以间接的调用ld,使用gcc的-Wl参数可以传递参数给ld 使用命令:ld --help可以列出ld常用的一些选项 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems ld使用举例(1) 源程序 编译hello.c到hello.o 命令:gcc -c hello.c xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems ld使用举例(2) 链接(演示) 命令:ld –dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o hello.o –lc –o hello 运行 ./hello xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 目标文件 ld通过BFD库可以读取和操作coff、elf、a.out等各种执行文件格式的目标文件 BFD(Binary File Descriptor) 目标文件(object file) 由多个节(section)组成,常见的节有: text节保存了可执行代码, data节保存了有初值的全局标量, bss节保存了无初值的全局变量。 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 使用objdump查看目标文件的信息(演示) objdump –h hello.o 比较hello xlanchen@2006.5.24 Embedded Operating Systems
链接描述文件( Linker script ) 可以使用链接描述文件控制ld的链接过程。 链接描述文件,command file 又称为链接脚本,Linker script 用来控制ld的链接过程 描述各输入文件的各节如何映射到输出文件的各节 控制输出文件中各个节或者符号的内存布局 使用的语言为: The ld command language,链接命令语言 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems ld命令的-T commandfile选项指定了链接描述文件名 如果不指定链接描述文件,ld就会使用一个默认的描述文件来产生执行文件 找到实际项目中的链接描述文件(演示) xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 链接描述文件的命令 链接描述文件的命令主要包括如下几类: 设置入口点命令 处理文件的命令 处理文件格式的命令 其他 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 常用的命令 设置入口点 格式:ENTRY(symbol) 设置symbol的值为执行程序的入口点。 ld有多种方法设置执行程序的入口点,确定程序入口点的顺序如下: ld命令的-e选项指定的值 Entry(symbol)指定的值 .text节的起始地址 入口点为0 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 常用的命令 INCULDE filename 包含其他filename的链接描述文件 INPUT(file,file,…) 指定多个输入文件名 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 常用的命令 OUTPUT_FORMAT(bfdname) 指定输出文件的格式 OUTPUT_ARCH ( bfdname ) 指定目标机器体系结构,例如: OUTPUT_ARCH(arm) xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 常用的命令 MEMORY: 这个命令在用于嵌入式系统的链接描述文件中经常出现,它描述了各个内存块的起始地址和大小。格式如下: MEMORY { name [(attr)]:ORIGIN = origin,LENGTH = len … } 例如: xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems Memory举例 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems SECTIONS命令 SECTIONS 告诉ld如何把输入文件的各个节映射到输出文件的各个节中。 在一个链接描述文件中只能有一个SECTIONS命令 在SECTIONS命令中可以使用的命令有三种: 定义入口点 赋值 定义输出节 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 定义输出节 SECTIONS { ... secname : { contents } ... } 例如: xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 定位计数器 定位计数器,The Location Counter 一个特殊的ld变量,使用“.”表示 总是在SECTIONS中使用 例如: xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 一个简单例子 下面是一个简单的例子: 例中,输出文件包含text,data,bss三个节,而输入文件也只包含这3个节: SECTIONS { .=0x01000000; .text:{*(.text)}; .=0x08000000; .data:{*(.data)}; .bss:{*(.bss)}; } xlanchen@2006.5.24 Embedded Operating Systems
SECTIONS举例(对应于上面的MEMORY例子) xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 实际项目中的链接描述文件 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems GNU tools 交叉开发环境的安装 交叉开发环境 源代码配置安装,or 直接安装二进制工具 第一种方法比较复杂,如果有现成的二进制交叉环境,建议直接使用 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 使用源代码安装交叉开发环境 GNU tools的各个软件包相对独立, 在选择时要注意各个软件包的版本号及其依赖关系 如果全部是最新版本,也并不能保证可以配置并安装成功 在安装GNU tools交叉开发环境之前,首先必须建立本地GNU tools环境 xlanchen@2006.5.24 Embedded Operating Systems
一个可行的GNU tools与 Linux内核之间关系表 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 交叉开发环境的安装顺序 需要5个步骤完成整个GNU Tools的配置/编译/安装: 内核头文件配置 binutils软件包安装 Bootstrap GNU编译器(可完成基本C语言编译工作的编译器) C library的安装,一般是glibc 完整的GNU编译器安装 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 软件包安装步骤 对每个单独的软件包,一般安装过程包括下面4步 下载并解压软件包 配置软件包 编译软件包 安装软件包 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 安装现成的二进制交叉环境 下载arm-elf-tools的最新版本或合适的版本 如:arm-elf-tools-20030314.sh 安装 在root权限下运行 sh ./arm-elf-tools-20030314.sh 这个命令会在开发主机上自动建立一个uClinux-ARM的交叉编译环境 xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 安装成功? 检查一下(演示) 对 arm-elf运用shell的tab功能可以看到一系列arm-elf打头的程序,如 binutils系列、gcc、gdb等等 运行arm-elf-gcc –v xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems xlanchen@2006.5.24 Embedded Operating Systems
Embedded Operating Systems 第一部分结束 GNU Tools之一:ld 安装交叉编译环境 xlanchen@2006.5.24 Embedded Operating Systems