嵌入式Linux编程入门与开发实例-第3章资料课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《嵌入式Linux编程入门与开发实例-第3章资料课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 Linux 编程 入门 开发 实例 资料 课件
- 资源描述:
-
1、 【学习目标】l熟悉嵌入式系统开发环境的构建 l熟悉U-Boot的移植l掌握嵌入式Linux操作系统内核编译 嵌入式系统开发环境的构建嵌入式系统开发环境的构建3.1U-bootU-boot的移植的移植3.2嵌入式Linux操作系统内核编译3.3习题与练习习题与练习3.4 所谓交叉编译,就是利用运行在某台计算所谓交叉编译,就是利用运行在某台计算机(宿主机)上的编译器编译某个源程序,生机(宿主机)上的编译器编译某个源程序,生成在另一台机器(目标机)上运行的目标代码成在另一台机器(目标机)上运行的目标代码的过程。使用交叉编译的原因主要有两个,一的过程。使用交叉编译的原因主要有两个,一是目标平台所需要
2、的是目标平台所需要的Bootloader以及操作系统以及操作系统核心没有建立起来时,需要做交叉编译;二是核心没有建立起来时,需要做交叉编译;二是一般目标板的资源都比较有限,不具备一定的一般目标板的资源都比较有限,不具备一定的处理器能力和存储空间,需要有强大的宿主处理器能力和存储空间,需要有强大的宿主PC机为它完成大部分的调试编译任务。机为它完成大部分的调试编译任务。binutils : 是一组二进制处理工具的集合,包是一组二进制处理工具的集合,包括连接器,汇编器和其他用于目标文件和档案的括连接器,汇编器和其他用于目标文件和档案的工具工具 。binutils的主要工具介绍如下:的主要工具介绍如下
3、: addr2line:把程序地址转换为文件名和行号。在命令:把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。个文件以及行号。 ar:建立、修改、提取档案文件。档案文件是包含多:建立、修改、提取档案文件。档案文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。始文件内容。 as:主要用来编译:主要用来编译GNU C编译器编译器gcc输出的汇编文件
4、,输出的汇编文件,产生的目标文件由连接器产生的目标文件由连接器ld连接。连接。 c+filt:连接器使用它来过滤:连接器使用它来过滤 C+ 和和 Java 符符号,防止重载函数冲突。号,防止重载函数冲突。 gprof: 显示程序调用段的各种数据。显示程序调用段的各种数据。 ld:是连接器,它把一些目标和归档文件结合:是连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用。通常在一起,重定位数据,并链接符号引用。通常,建立一个新编译程序的最后一步就是调用,建立一个新编译程序的最后一步就是调用ld。 nm:列出目标文件中的符号。:列出目标文件中的符号。 objcopy:把一种目标文
5、件中的内容复制到另一:把一种目标文件中的内容复制到另一种类型的目标文件中种类型的目标文件中. objdump: 显示一个或者更多目标文件的信息显示一个或者更多目标文件的信息。使用选项来进行控制。使用选项来进行控制。 ranlib:产生归档文件索引,并将其保存到这:产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。员所定义的可重分配目标文件。 readelf:显示:显示ebf格式可执行文件的信息。格式可执行文件的信息。 size: 列出目标文件每一段的大小以及总体的列出目标文件每一段的大小以及总体的大小。默
6、认情况下,对于每个目标文件或者一大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。个归档文件中的每个模块只产生一行输出。 size: 列出目标文件每一段的大小以及总体的列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。个归档文件中的每个模块只产生一行输出。 strings:打印某个文件的可打印字符串,这些:打印某个文件的可打印字符串,这些字符串最少字符串最少4个字符长,也可以使用选项个字符长,也可以使用选项-n设设置字符串的最小长度。默认情况下,它只打印置字符串的最
7、小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很字符,这个程序对于了解非文本文件的内容很有帮助。有帮助。 strip:丢弃目标文件中的全部或者特定符号。:丢弃目标文件中的全部或者特定符号。 libiberty:包含许多:包含许多GNU程序都会用到的函数程序都会用到的函数,这些程序有:,这些程序有: getopt, obstack, strerror, strtol 和和 strtoul等。等。 libbfd :二进制
8、文件描述库。:二进制文件描述库。 libopcodes: 用来处理用来处理opcodes的库的库, 在生成一在生成一些应用程序的时候也会用到它。些应用程序的时候也会用到它。windres:一个一个windows资源的编译器。资源的编译器。GCC :工具是编译程序的最为主要的工具。工具是编译程序的最为主要的工具。GCC包括以下几个主要的工具:包括以下几个主要的工具:Cpp:C预处理器。预处理器。g+:C+编译器。编译器。gcc:C编译器。编译器。gccbug:创建:创建bug报告的报告的Shell脚本。脚本。gcov:分析在程序中哪里做优化效果好。:分析在程序中哪里做优化效果好。libgcc*:
9、gcc的运行库。的运行库。libstdc+:标准:标准C+库,包含许多常用函库,包含许多常用函数。数。libsupc+:提供支持:提供支持C+语言的库函数。语言的库函数。 Glibe:是提供系统调用和基本函数的是提供系统调用和基本函数的 C 库,库,比如比如open(), malloc(), printf()等等。所有动态连等等。所有动态连接的程序都要用到它接的程序都要用到它 。Glibc 中主要有以下程序:中主要有以下程序:l catchsegv:当程序发生:当程序发生segmentation fault的的时候时候, 用来建立一个堆栈跟踪。用来建立一个堆栈跟踪。l gencat:建立消息列
10、表。:建立消息列表。l getconf:针对文件系统的指定变量显示其系:针对文件系统的指定变量显示其系统设置值。统设置值。l getent:从系统管理数据库获取一个条目。:从系统管理数据库获取一个条目。l glibcbug:建立:建立glibc的的bug报告并且发送到报告并且发送到bug报告的邮件地址。报告的邮件地址。l iconv:转化字符集。:转化字符集。l iconvconfig:建立快速读取的:建立快速读取的iconv模块所使模块所使用的设置文件。用的设置文件。l ldconfig:设置动态链接库的实时绑定。:设置动态链接库的实时绑定。l ldd:列出每个程序或者命令需要的共享库:列出
11、每个程序或者命令需要的共享库。l lddlibc4: 辅助辅助 ldd 操作目标文件。操作目标文件。l locale: 是一个是一个 Perl 程序,可以告诉编译器程序,可以告诉编译器打开或关闭内建的打开或关闭内建的locale支持。支持。l localedef: 编译编译locale标准。标准。l nscd:提供对常用名称设备调用的缓存的守护:提供对常用名称设备调用的缓存的守护进程。进程。l nscd_nischeck:检查在进行:检查在进行NIS+侦查时是否侦查时是否需要安全模式。需要安全模式。l pcprofiledump:打印:打印PC profiling产生的信息产生的信息。l pt
12、_chown:是一个辅助程序,帮助:是一个辅助程序,帮助grantpt设设置子虚拟终端的属主,用户组和读写权限。置子虚拟终端的属主,用户组和读写权限。l rpcgen:产生实现:产生实现RPC协议的协议的C代码。代码。l rpcinfo:对:对RPC服务器产生一个服务器产生一个RPC呼叫。呼叫。l sln:用来创建符号链接,由于它本身是静态:用来创建符号链接,由于它本身是静态连接的,在动态连接不起作用的时候,连接的,在动态连接不起作用的时候,sln仍然仍然可以建立符号链接。可以建立符号链接。l sprof:读取并显示共享目标的特征描述数据:读取并显示共享目标的特征描述数据。l tzselect
13、:对用户提出关于当前位置的问题:对用户提出关于当前位置的问题,并输出时区信息到标准输出。并输出时区信息到标准输出。l xtrace:通过打印当前执行的函数跟踪程序:通过打印当前执行的函数跟踪程序执行情况。执行情况。l zdump:显示时区。:显示时区。l zic:时区编译器。:时区编译器。l ld.so:帮助动态链接库的执行。:帮助动态链接库的执行。l libBrokenLocale:帮助程序处理破损:帮助程序处理破损locale,如,如Mozilla。l libSegFault:处理:处理 segmentation fault 信号,信号,试图捕捉试图捕捉segfaults。l libanl
14、:异步名称查询库。:异步名称查询库。l L ibbsd-compat:为了在:为了在linux下执行一些下执行一些BSD程序程序,libbsd-compat提供了必要的可移植性提供了必要的可移植性。llibc:是主要的:是主要的C库库-常用函数的集成。常用函数的集成。llibcrypt:加密编码库。:加密编码库。llibdl:动态连接接口。:动态连接接口。llibg:g+的运行时。的运行时。llibieee:IEEE浮点运算库。浮点运算库。llibm:数学函数库。:数学函数库。llibmcheck:包括了启动时需要的代码。:包括了启动时需要的代码。llibmemusage:帮助:帮助 memu
15、sage 搜集程序运行搜集程序运行时内存占用的信息。时内存占用的信息。llibnsl:网络服务库。:网络服务库。llibnss*: 是名称服务切换库,包含了解释主机是名称服务切换库,包含了解释主机名,用户名,组名,别名,服务,协议等等的名,用户名,组名,别名,服务,协议等等的函数。函数。llibpcprofile:帮助内核跟踪在函数:帮助内核跟踪在函数, 源码行和源码行和命令中命令中CPU使用时间。使用时间。llibpthread:POSIX 线程库。线程库。llibresolv:创建:创建,发送及解释到互联网域名服务发送及解释到互联网域名服务器的数据包。器的数据包。llibrpcsvc:提供
16、:提供RPC的其他服务。的其他服务。llibrt: 提供了大部分的提供了大部分的POSIX.1b实时扩展的实时扩展的接口。接口。llibthread_db: 对建立多线程程序的调试很有对建立多线程程序的调试很有用。用。llibutil: 包含了在很多不同的包含了在很多不同的 Unix程序中使用程序中使用的的“标准标准”函数。函数。 Bootloader 就是在操作系统内核运行之前运就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个
17、合适的状态,以便为最终的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。调用操作系统内核准备好正确的环境。 针对针对ARM处理器,常见的处理器,常见的Bootloader有有U-Boot、RedBoot、ARMBoot等:等:lU-Boot :它是它是sourceforge上的一个开放源代码的项上的一个开放源代码的项目,可对目,可对PowerPC、ARM、MIPS、x86等处理器提供等处理器提供支持,它支持的嵌入式操作系统有支持,它支持的嵌入式操作系统有Linux、VxWorks、NetBSD、QNX、RTEMS等,是目前支持最广泛、使用等,是目前支持最广泛、使用最多
18、的最多的Bootloader。 3.2.1 Bootloader3.2.1 Bootloader概述概述lRedBoot : RedBoot是是Redhat公司随公司随eCos (Embedded Configurable Operating System)发布的)发布的一个一个Boot方案,是一个开源项目。方案,是一个开源项目。lARMBoot:是是sourceforge上的一个开放源代码的项上的一个开放源代码的项目,它最初的设计只是针对目,它最初的设计只是针对ARM处理器体系结构,所处理器体系结构,所以它可以很容易地被移植到各种以以它可以很容易地被移植到各种以ARM为核心的平台为核心的平台
19、上。上。 图图3-1是一个同时装有是一个同时装有 Bootloader、内核的启动参数、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。间分配结构图。 图3-1 固态存储设备的典型空间分配结构3.2.2 Bootloader3.2.2 Bootloader的启动流程的启动流程 Bootloader 的启动过程有单阶段(的启动过程有单阶段(Single Stage)和多)和多阶段(阶段(Multi-Stage)两种形式。通常多阶段的)两种形式。通常多阶段的 Bootloader 能提供更为复杂的功能,以及更好的可移植性。从
20、固态存能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的储设备上启动的 Bootloader 大多都是大多都是2 阶段的启动过程,阶段的启动过程,也即启动过程可以分为也即启动过程可以分为 stage 1 和和 stage 2 两部分。两部分。 stage1 通常包括以下步骤(按执行的先后顺序):通常包括以下步骤(按执行的先后顺序): (1)硬件设备初始化。)硬件设备初始化。 这是这是 Bootloader 一开始就执行的操作,其目的是为一开始就执行的操作,其目的是为 stage2 的执行以及随后的的执行以及随后的 kernel 的执行准备好一些基本的执行准备好一些基本的硬件环境。
21、它通常包括以下步骤:的硬件环境。它通常包括以下步骤: l屏蔽所有的中断。为中断提供服务通常是屏蔽所有的中断。为中断提供服务通常是OS 设备驱动设备驱动程序的责任,因此在程序的责任,因此在Bootloader 的执行全过程中可以不的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏的中断屏蔽寄存器或状态寄存器(比如蔽寄存器或状态寄存器(比如 ARM 的的 CPSR 寄存器)寄存器)来完成。来完成。 l设置设置 CPU 的速度和时钟频率。的速度和时钟频率。 l RAM 初始化。包括正确地设置系统的内存控初始化。包括正确地设置系统的内存控制器的功
22、能寄存器以及各内存库控制寄存器等制器的功能寄存器以及各内存库控制寄存器等。 l初始化初始化 LED。典型地,通过。典型地,通过 GPIO 来驱动来驱动 LED,其目的是表明系统的状态是,其目的是表明系统的状态是 OK 还是还是 Error。如果板子上没有。如果板子上没有 LED,那么也可以通,那么也可以通过初始化过初始化 UART 向串口打印向串口打印 Bootloader 的的 Logo 字符信息来完成这一点。字符信息来完成这一点。 l 关闭关闭 CPU 内部指令数据内部指令数据 cache。 (2)为加载)为加载 Bootloader 的的 stage2 准备准备 RAM 空间。空间。 为
23、了获得更快的执行速度,通常把为了获得更快的执行速度,通常把 stage2 加载到加载到 R A M 空 间 中 来 执 行 , 因 此 必 须 为 加 载空 间 中 来 执 行 , 因 此 必 须 为 加 载 Bootloader 的的 stage2 准备好一段可用的准备好一段可用的RAM 空空间范围。间范围。 (3)拷贝)拷贝 Bootloader 的的 stage2 到到 RAM 空间中。空间中。 拷贝时要确定拷贝时要确定stage2 的可执行映象在固态的可执行映象在固态存储设备的存放起始地址和终止地址一级存储设备的存放起始地址和终止地址一级RAM 空间的起始地址。空间的起始地址。 (4)
24、设置好堆栈。)设置好堆栈。 堆栈指针的设置是为了执行堆栈指针的设置是为了执行 C 语言代码作好准语言代码作好准备。此外,在设置堆栈指针备。此外,在设置堆栈指针 sp 之前,也可以关闭之前,也可以关闭 LED 灯,以提示用户准备跳转到灯,以提示用户准备跳转到 stage2。经过上述。经过上述这些执行步骤后,系统的物理内存布局应该如下图这些执行步骤后,系统的物理内存布局应该如下图3-2所示。所示。图3-2 Bootloader 的 stage2 可执行映象刚被拷贝到 RAM 空间时的系统内存布局(5)跳转到)跳转到 stage2 的的 C 入口点。入口点。 在上述一切都就绪后,就可以跳转到在上述一
25、切都就绪后,就可以跳转到 Bootloader 的的 stage2 去执行了。比如,在去执行了。比如,在 ARM 系统中,可以通过修改系统中,可以通过修改 PC 寄存器为合寄存器为合适的地址来实现。适的地址来实现。 stage2 通常包括以下步骤(按执行的先后顺序):通常包括以下步骤(按执行的先后顺序):(1)初始化本阶段要使用到的硬件设备。)初始化本阶段要使用到的硬件设备。 通常包括:初始化至少一个串口,以便和终通常包括:初始化至少一个串口,以便和终端用户进行端用户进行 I/O 输出信息;初始化计时器等。在输出信息;初始化计时器等。在初始化这些设备之前,也可以重新把初始化这些设备之前,也可以
展开阅读全文