嵌入式Linux开发环境及其在ARM上的移植
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.1.2 交叉编译环境的建立
• 匹配Binutils、gcc和glibc的版本
工具链版本 binutils Linux 2.4.x 2.14 Linux 2.6.x 2.14
gcc
glibc glibc-threads gdb
2.95.3
2.2.5 2.2.5 5.3
3.3.2
2.2.5 2.2.5 6.0
Binutils工具包
Binutils工具集里主要包含以下一系列的程 序:addr2line、ar、as、c++filt、gprof、 ld、nm、objcopy、objdump、ranlib、 readelf、size、strings和strip, 它包含的库文件有:libiberty.a、libbfd.a、 libbfd.so、libopcodes.a和libopcodes.so。
ARMV4T平台工具链常用版本
6.1.2 交叉编译环境的建立
• 构建交叉编译环境通常有3种方法: 方法1:分步编译和安装交叉编译环境所需 要的库和源代码,最终生成交叉编译环 境。 方法2:通过Crosstool脚本工具来实现一次 编译生成交叉编译环境。 方法3:使用开发平台供应商提供的开发环 境安装套件建立交叉编译环境,这是最 常用的方法。
GNUmakefile Makefile Makefile
Make命令与Makefile文件
• (1)Makefile基本结构 Makefile中一般包含如下内容: 需要由make工具创建的项目,通常是 目标文件和可执行文件; 要创建的项目所依赖的文件; 创建每个项目时需要运行的命令。
6.1.1 交叉编译工具介绍
• 1.Binutils工具包 GNU Binutils是一套用来构造和使用二进 制所需的工具集。建立嵌入式交叉编译 环境,Binutils工具包是必不可少的,而 且Binutils与GNU的C编译器gcc是紧密集 成的,没有Binutils,gcc也不能正常工作。 GNU Binutils是一组开发工具,包括连接 器、汇编器和其他用于目标文件和档案 的工具。
gcc编译器
• (1)gcc的基本用法 在使用gcc编译器的时候,通常后面跟一些 选项和文件名。 gcc命令的基本用法如下: gcc [options] [filenames]
Gcc选项
选 项 说 明
-ansi
-c -D FOO=BAR -g -ggdb -pg -l FOO -L DIRNAME -O
fs init arm
6.2.1 Linux内核源代码的基本组织情况
• 嵌入式Linux内核按照功能可分为进程管理、 内存管理、文件系统、设备控制和网络。 • 进程管理 • 内存管理 • 文件系统 • 设备控制 • 网络
嵌入式Linux内核功能结构图
系统调用接口
进程管理 并发 多任务 架构相关 代码
内存管理 虚拟内存 内存 管理器
Make命令与Makefile文件
• (4)隐含规则 隐含规则是指由make自定义的规则,这些 规则定义了如何从不同的依赖文件建立 特定类型的目标。 GNU make支持以下2种类型的隐含规则: ① 后缀规则(Suffix Rule) ② 模式规则(Pattern Rules)
Make命令与Makefile文件
2. 制作交叉调试器
• (1)编译交叉调试器 对于交叉调试器,并不是工具链必需的工 具,但是它是与工具链配套使用的。 GDB的调试能力和BUG的修正也因为版 本的不同而不同。 • (2)编译gdbserver 目标板还需要gdbserver工具为目标板交叉 编译gdbserver。
主要内容
• 6.1 嵌入式Linux开发环境
Make命令与Makefile文件
• (3)GNU make的主要预定义变量 GNU make有许多预定义变量,这些变量 具有特殊的含义,可在规则中使用。 在一般情况下,make所预定义的内部规则 可以满足大多数应用要求,如果程序员 认为哪个内部规则还不能满足他的特殊 要求,那么可以通过修改或自定义新的 内部规则使用的变量或者相关的命令来 改变,称为隐含规则。
各种连接方式
HOST 下载内核映像 内核映像 根文件系统 挂接NFS文件系统 内核映像 根文件系统 TARGET
交叉开发模型
6.1 嵌入式Linux开发环境
• TARGET就是目标板,HOST是开发主机 (宿主机)。在开发主机上,可以安装开 发工具,编辑、编译目标板的Linux引导程 序、内核和文件系统,然后在目标板上运 行。通常这种在主机环境下开发,在目标 板上运行的开发模式叫作交叉开发。
Make命令与Makefile文件
• (2)Makefile变量
GNU的make工具除了提供建立目标的基本功能 之外,还有许多便于表达依赖性关系以及建立 目标命令的特色,其中之一就是变量或宏的定 义能力。 如果用户要以相同的编译选项同时编译多个C源 文件,且为每个目标的编译指定冗长的编译选 项的话,利用简单的变量定义,可简化 makefile文件,避免这种乏味的工作。
嵌入式系统设计
第六章 嵌入式Linux开发环境 及其在ARM上的移植
主要内容
• 6.1 嵌入式Linux开发环境
• 6.1.1 交叉编译工具介绍 • 6.1.2 交叉编译环境的建立
• 6.2 嵌入式Linux在ARM平台上的移植
• 6.2.1 Linux内核源代码的基本组织情况 • 6.2.2 嵌入式Linux内核裁剪方法 • 6.2.3 嵌入式Linux内核定制过程 • 6.2.4 内核编译及装载 • 6.2.5 文件系统及其实现
Binutils工具包
• (1)GNU汇编器as as工具主要用来将汇编语言编写的源程序 转换成二进制形式的目标代码。 • (2)GNU链接器ld ld可以将多个目标文件链接成为可执行程 序,同时指定了程序在运行时是如何执 行的。 • (3)GNU库管理器ar ar将多个可重定位的目标模块归档为一个 函数库文件。
• (5)Make选项
选 项 -C DIR -f FILE -h -i -I DIR 说 明 在读取makefile之前改变到指定的目录DIR 以指定的FILE文件作为makefile 显示所有的make选项(-help) 忽略所有的命令执行错误 当包含其他makefile文件时,可利用该选项指定搜索目录
主要内容
• 6.1 嵌入式Linux开发环境
• 6.1.1 交叉编译工具介绍 • 6.1.2 交叉编译环境的建立
• 6.2 嵌入式Linux在ARM平台上的移植
• 6.2.1 Linux内核源代码的基本组织情况 • 6.2.2 嵌入式Linux内核裁剪方法 • 6.2.3 嵌入式Linux内核定制过程 • 6.2.4 内核编译及装载 • 6.2.5 文件系统及其实现
• 6.1.1 交叉编译工具介绍 • 6.1.2 交叉编译环境的建立
• 6.2 嵌入式Linux在ARM平台上的移植
• 6.2.1 Linux内核源代码的基本组织情况 • 6.2.2 嵌入式Linux内核裁剪方法 • 6.2.3 嵌入式Linux内核定制过程 • 6.2.4 内核编译及装载 • 6.2.5 文件系统及其实现
支持ANSI/ISO C的标准语法,取消GUN的语法扩展中与该标准有 冲突部分(但这一选项并不能保证生成ANSI兼容的代码)
只编译不链接 在命令行定义预处理宏FOO,其值为BAR 在可执行程序中包含标准调试信息 在可执行程序中包含只有GUN debugger才能识别的大量调试信息 编译完成之后,额外产生一个性能分析所需的信息 链接名为libFOO的函数库 将DIRNAME加入到库文件的搜索目录列表中。在缺省情况下gcc 只链接共享库 优化编译过的代码
1. 分步建立交叉编译环境
1. 分步建立交叉编译环境
• 建立交叉编译环境可以分为5个步骤: 做好准备工作:下载工具源码包和补丁, 准备内核头文件,创建工作目录等; 编译、安装Binutils; 编译辅助编译器(bootstrap gcc); 建立glibc库,这里要使用交叉编译工具 链,例如arm-linux-gcc等; 编译生成完整的编译器(full gcc),重 新配置gcc功能,使其支持C、C++等语 言。
-I DIRNAME 将DIRNAME加入到头文件的搜索目录列表中
gcc编译器
• (3)函数库和包含文件 如果需要链接不在标准目录下的函数库或 包含(include)文件,可使用-L {DIRNAME}和-I {DIRNAME}选项指定 文件所在的目录,以确保该目录的搜索 顺序在标准目录之前。
gcc编译器
文件系统 文件和目 录VFS 文件系统 类型 块设备
设备控制 tty和 设备访问 字符设备
网络 互连性 网络 子系统
内核子系统 所实现功能
软件支持 drivers
CPU
内存
磁盘和CD
控制台
网络接口
硬件
Linux内核源代码树的组织
• Linux内核源代码包括多个目录。
Linux Kernel
arch i386 ppc
6.1.1 交叉编译工具介绍
• 2.gcc编译器 GUN cc(GUN C Compiler,简称gcc)是 GUN项目的C编译器套件,能够编译用C、 C++、Objective C编写的程序。gcc编译 器是基于命令行的。 gcc的主要目的是为32位GNU系统提供一个 好的编译器,其最终输出的是汇编语言 源程序。想要进一步编译成所需要的机 器代码,需要引入一些新的工具,比如 汇编程序等。
主要内容
• 6.1 嵌入式Linux开发环境
• 6.1.1 交叉编译工具介绍 • 6.1.2 交叉编译环境的建立• 6.Βιβλιοθήκη 嵌入式Linux在ARM平台上的移植
• 6.2.1 Linux内核源代码的基本组织情况 • 6.2.2 嵌入式Linux内核裁剪方法 • 6.2.3 嵌入式Linux内核定制过程 • 6.2.4 内核编译及装载 • 6.2.5 文件系统及其实现
-n
-p
只打印要执行的命令,但不执行这些命令
显示make变量数据库和隐含规则
-s -w
在执行命令时不显示命令 在处理makefile之前和之后,显示工作目录
-W FILE 假定文件FILE已经被修改
6.1.1 交叉编译工具介绍
• 4.glibc库 glibc 是提供系统调用和基本函数的C库, 所有动态连接的程序都要用到它,是编 译Linux系统程序很重要的组成部分。 • 5. gdb调试工具 gdb是一个用来调试C和C++程序的调试器。 gdb的功能主要是监视程序中变量的值, 设置断点以使程序在指定的代码行上停 止执行,以及支持单步执行等。
• (4)gcc的执行过程 使用gcc由C语言源代码文件生成可执行文 件的过程不仅仅是编译的过程,而是要 经历4个相互关联的阶段。 预处理(预编译,Preprocessing) 编译(Compilation) 汇编(Assembly) 链接(Linking)
6.1.1 交叉编译工具介绍
• 3.Make命令与Makefile文件 利用make程序的这种自动编译可大大简化 开发工作,避免不必要的重新编译。 make工具通过makefile的文件来完成并自 动维护编译工作。 在默认情况下,GNU make工具在当前工 作目录中按如下顺序搜索makefile:
Linux系统移植的一般步骤
• 嵌入式系统的开发和应用层软件的开发不 同,有其自身的特点,尤其在开发流程上 有很大的不同。从大体上讲,Linux系统移 植一般分为下面几步: (1)开发环境的搭建 (2)系统引导 (3)内核引导 (4)设备驱动程序 (5)文件系统
6.1 嵌入式Linux开发环境
• 通常的嵌入式系统的软件开发采用一种交 叉开发的方式:
6.1.2 交叉编译环境的建立
• 在建立交叉编译环境之前,当然首先要在 一台PC机(宿主机)上安装Linux操作系 统。一般情况下用定制方式进行完全安装, 即在选择软件包(Package)时选择最后 一项完全安装(everything)。然后再配 置好网络、TFTP服务(为下载烧写所用) 和NFS服务(为交叉开发时mount所用)。