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