




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式Linux编程入门与开发实例- 第3章 【学习目标】 l熟悉嵌入式系统开发环境的构建 l熟悉U-Boot的移植 l掌握嵌入式Linux操作系统内核编译 嵌入式Linux编程入门与开发实例- 第3章 嵌入式系统开发环境的构建嵌入式系统开发环境的构建 3.1 U-bootU-boot的移植的移植 3.2 嵌入式Linux操作系统内核编译 3.3 习题与练习习题与练习 3.4 嵌入式Linux编程入门与开发实例- 第3章 所谓交叉编译,就是利用运行在某台计算所谓交叉编译,就是利用运行在某台计算 机(宿主机)上的编译器编译某个源程序,生机(宿主机)上的编译器编译某个源程序,生 成在另一台机器(目
2、标机)上运行的目标代码成在另一台机器(目标机)上运行的目标代码 的过程。使用交叉编译的原因主要有两个,一的过程。使用交叉编译的原因主要有两个,一 是目标平台所需要的是目标平台所需要的Bootloader以及操作系统以及操作系统 核心没有建立起来时,需要做交叉编译;二是核心没有建立起来时,需要做交叉编译;二是 一般目标板的资源都比较有限,不具备一定的一般目标板的资源都比较有限,不具备一定的 处理器能力和存储空间,需要有强大的宿主处理器能力和存储空间,需要有强大的宿主PC 机为它完成大部分的调试编译任务。机为它完成大部分的调试编译任务。 嵌入式Linux编程入门与开发实例- 第3章 binutil
3、s : 是一组二进制处理工具的集合,包是一组二进制处理工具的集合,包 括连接器,汇编器和其他用于目标文件和档案的括连接器,汇编器和其他用于目标文件和档案的 工具工具 。 嵌入式Linux编程入门与开发实例- 第3章 binutils的主要工具介绍如下:的主要工具介绍如下: addr2line:把程序地址转换为文件名和行号。在命令:把程序地址转换为文件名和行号。在命令 行中给它一个地址和一个可执行文件名,它就会使用行中给它一个地址和一个可执行文件名,它就会使用 这个可执行文件的调试信息指出在给出的地址上是哪这个可执行文件的调试信息指出在给出的地址上是哪 个文件以及行号。个文件以及行号。 ar:建
4、立、修改、提取档案文件。档案文件是包含多:建立、修改、提取档案文件。档案文件是包含多 个文件内容的一个大文件,其结构保证了可以恢复原个文件内容的一个大文件,其结构保证了可以恢复原 始文件内容。始文件内容。 as:主要用来编译:主要用来编译GNU C编译器编译器gcc输出的汇编文件,输出的汇编文件, 产生的目标文件由连接器产生的目标文件由连接器ld连接。连接。 嵌入式Linux编程入门与开发实例- 第3章 c+filt:连接器使用它来过滤:连接器使用它来过滤 C+ 和和 Java 符符 号,防止重载函数冲突。号,防止重载函数冲突。 gprof: 显示程序调用段的各种数据。显示程序调用段的各种数据
5、。 ld:是连接器,它把一些目标和归档文件结合:是连接器,它把一些目标和归档文件结合 在一起,重定位数据,并链接符号引用。通常在一起,重定位数据,并链接符号引用。通常 ,建立一个新编译程序的最后一步就是调用,建立一个新编译程序的最后一步就是调用ld 。 nm:列出目标文件中的符号。:列出目标文件中的符号。 objcopy:把一种目标文件中的内容复制到另一:把一种目标文件中的内容复制到另一 种类型的目标文件中种类型的目标文件中. 嵌入式Linux编程入门与开发实例- 第3章 objdump: 显示一个或者更多目标文件的信息显示一个或者更多目标文件的信息 。使用选项来进行控制。使用选项来进行控制。
6、 ranlib:产生归档文件索引,并将其保存到这:产生归档文件索引,并将其保存到这 个归档文件中。在索引中列出了归档文件各成个归档文件中。在索引中列出了归档文件各成 员所定义的可重分配目标文件。员所定义的可重分配目标文件。 readelf:显示:显示ebf格式可执行文件的信息。格式可执行文件的信息。 size: 列出目标文件每一段的大小以及总体的列出目标文件每一段的大小以及总体的 大小。默认情况下,对于每个目标文件或者一大小。默认情况下,对于每个目标文件或者一 个归档文件中的每个模块只产生一行输出。个归档文件中的每个模块只产生一行输出。 嵌入式Linux编程入门与开发实例- 第3章 size:
7、 列出目标文件每一段的大小以及总体的列出目标文件每一段的大小以及总体的 大小。默认情况下,对于每个目标文件或者一大小。默认情况下,对于每个目标文件或者一 个归档文件中的每个模块只产生一行输出。个归档文件中的每个模块只产生一行输出。 strings:打印某个文件的可打印字符串,这些:打印某个文件的可打印字符串,这些 字符串最少字符串最少4个字符长,也可以使用选项个字符长,也可以使用选项-n设设 置字符串的最小长度。默认情况下,它只打印置字符串的最小长度。默认情况下,它只打印 目标文件初始化和可加载段中的可打印字符;目标文件初始化和可加载段中的可打印字符; 对于其它类型的文件它打印整个文件的可打印
8、对于其它类型的文件它打印整个文件的可打印 字符,这个程序对于了解非文本文件的内容很字符,这个程序对于了解非文本文件的内容很 有帮助。有帮助。 嵌入式Linux编程入门与开发实例- 第3章 strip:丢弃目标文件中的全部或者特定符号。:丢弃目标文件中的全部或者特定符号。 libiberty:包含许多:包含许多GNU程序都会用到的函数程序都会用到的函数 ,这些程序有:,这些程序有: getopt, obstack, strerror, strtol 和和 strtoul等。等。 libbfd :二进制文件描述库。:二进制文件描述库。 libopcodes: 用来处理用来处理opcodes的库的库
9、, 在生成一在生成一 些应用程序的时候也会用到它。些应用程序的时候也会用到它。 windres:一个一个windows资源的编译器。资源的编译器。 嵌入式Linux编程入门与开发实例- 第3章 GCC :工具是编译程序的最为主要的工具。工具是编译程序的最为主要的工具。 GCC包括以下几个主要的工具:包括以下几个主要的工具: Cpp:C预处理器。预处理器。 g+:C+编译器。编译器。 gcc:C编译器。编译器。 gccbug:创建:创建bug报告的报告的Shell脚本。脚本。 gcov:分析在程序中哪里做优化效果好。:分析在程序中哪里做优化效果好。 嵌入式Linux编程入门与开发实例- 第3章
10、libgcc*:gcc的运行库。的运行库。 libstdc+:标准:标准C+库,包含许多常用函库,包含许多常用函 数。数。 libsupc+:提供支持:提供支持C+语言的库函数。语言的库函数。 嵌入式Linux编程入门与开发实例- 第3章 Glibe:是提供系统调用和基本函数的是提供系统调用和基本函数的 C 库,库, 比如比如open(), malloc(), printf()等等。所有动态连等等。所有动态连 接的程序都要用到它接的程序都要用到它 。 嵌入式Linux编程入门与开发实例- 第3章 Glibc 中主要有以下程序:中主要有以下程序: l catchsegv:当程序发生:当程序发生s
11、egmentation fault的的 时候时候, 用来建立一个堆栈跟踪。用来建立一个堆栈跟踪。 l gencat:建立消息列表。:建立消息列表。 l getconf:针对文件系统的指定变量显示其系:针对文件系统的指定变量显示其系 统设置值。统设置值。 l getent:从系统管理数据库获取一个条目。:从系统管理数据库获取一个条目。 l glibcbug:建立:建立glibc的的bug报告并且发送到报告并且发送到 bug报告的邮件地址。报告的邮件地址。 嵌入式Linux编程入门与开发实例- 第3章 l iconv:转化字符集。:转化字符集。 l iconvconfig:建立快速读取的:建立快速
12、读取的iconv模块所使模块所使 用的设置文件。用的设置文件。 l ldconfig:设置动态链接库的实时绑定。:设置动态链接库的实时绑定。 l ldd:列出每个程序或者命令需要的共享库:列出每个程序或者命令需要的共享库 。 l lddlibc4: 辅助辅助 ldd 操作目标文件。操作目标文件。 l locale: 是一个是一个 Perl 程序,可以告诉编译器程序,可以告诉编译器 打开或关闭内建的打开或关闭内建的locale支持。支持。 l localedef: 编译编译locale标准。标准。 嵌入式Linux编程入门与开发实例- 第3章 l nscd:提供对常用名称设备调用的缓存的守护:提
13、供对常用名称设备调用的缓存的守护 进程。进程。 l nscd_nischeck:检查在进行:检查在进行NIS+侦查时是否侦查时是否 需要安全模式。需要安全模式。 l pcpro:打印:打印PC profiling产生的信息。产生的信息。 l pt_chown:是一个辅助程序,帮助:是一个辅助程序,帮助grantpt设设 置子虚拟终端的属主,用户组和读写权限。置子虚拟终端的属主,用户组和读写权限。 l rpcgen:产生实现:产生实现RPC协议的协议的C代码。代码。 l rpcinfo:对:对RPC服务器产生一个服务器产生一个RPC呼叫。呼叫。 嵌入式Linux编程入门与开发实例- 第3章 l
14、sln:用来创建符号链接,由于它本身是静态:用来创建符号链接,由于它本身是静态 连接的,在动态连接不起作用的时候,连接的,在动态连接不起作用的时候,sln仍然仍然 可以建立符号链接。可以建立符号链接。 l sprof:读取并显示共享目标的特征描述数据:读取并显示共享目标的特征描述数据 。 l tzselect:对用户提出关于当前位置的问题:对用户提出关于当前位置的问题, 并输出时区信息到标准输出。并输出时区信息到标准输出。 l xtrace:通过打印当前执行的函数跟踪程序:通过打印当前执行的函数跟踪程序 执行情况。执行情况。 l zdump:显示时区。:显示时区。 嵌入式Linux编程入门与开
15、发实例- 第3章 l zic:时区编译器。:时区编译器。 l :帮助动态链接库的执行。:帮助动态链接库的执行。 l libBrokenLocale:帮助程序处理破损:帮助程序处理破损locale ,如,如Mozilla。 l libSegFault:处理:处理 segmentation fault 信号,信号, 试图捕捉试图捕捉segfaults。 l libanl:异步名称查询库。:异步名称查询库。 l L ibbsd-compat:为了在:为了在linux下执行一些下执行一些 BSD程序程序,libbsd-compat提供了必要的可移植性提供了必要的可移植性 。 嵌入式Linux编程入门与
16、开发实例- 第3章 llibc:是主要的:是主要的C库库-常用函数的集成。常用函数的集成。 llibcrypt:加密编码库。:加密编码库。 llibdl:动态连接接口。:动态连接接口。 llibg:g+的运行时。的运行时。 llibieee:IEEE浮点运算库。浮点运算库。 llibm:数学函数库。:数学函数库。 嵌入式Linux编程入门与开发实例- 第3章 llibmcheck:包括了启动时需要的代码。:包括了启动时需要的代码。 llibmemusage:帮助:帮助 memusage 搜集程序运行搜集程序运行 时内存占用的信息。时内存占用的信息。 llibnsl:网络服务库。:网络服务库。
17、llibnss*: 是名称服务切换库,包含了解释主机是名称服务切换库,包含了解释主机 名,用户名,组名,别名,服务,协议等等的名,用户名,组名,别名,服务,协议等等的 函数。函数。 llibpcprofile:帮助内核跟踪在函数:帮助内核跟踪在函数, 源码行和源码行和 命令中命令中CPU使用时间。使用时间。 嵌入式Linux编程入门与开发实例- 第3章 llibpthread:POSIX 线程库。线程库。 llibresolv:创建:创建,发送及解释到互联网域名服务发送及解释到互联网域名服务 器的数据包。器的数据包。 llibrpcsvc:提供:提供RPC的其他服务。的其他服务。 llibrt
18、: 提供了大部分的实时扩展的接口。提供了大部分的实时扩展的接口。 llibthread_db: 对建立多线程程序的调试很有对建立多线程程序的调试很有 用。用。 llibutil: 包含了在很多不同的包含了在很多不同的 Unix程序中使用程序中使用 的的“标准标准”函数。函数。 嵌入式Linux编程入门与开发实例- 第3章 Bootloader 就是在操作系统内核运行之前运就是在操作系统内核运行之前运 行的一段小程序。通过这段小程序,可以初始化行的一段小程序。通过这段小程序,可以初始化 硬件设备、建立内存空间的映射图,从而将系统硬件设备、建立内存空间的映射图,从而将系统 的软硬件环境带到一个合适
19、的状态,以便为最终的软硬件环境带到一个合适的状态,以便为最终 调用操作系统内核准备好正确的环境。调用操作系统内核准备好正确的环境。 嵌入式Linux编程入门与开发实例- 第3章 针对针对ARM处理器,常见的处理器,常见的Bootloader有有U-Boot、 RedBoot、ARMBoot等:等: lU-Boot :它是它是sourceforge上的一个开放源代码的项上的一个开放源代码的项 目,可对目,可对PowerPC、ARM、MIPS、x86等处理器提供等处理器提供 支持,它支持的嵌入式操作系统有支持,它支持的嵌入式操作系统有Linux、VxWorks、 NetBSD、QNX、RTEMS等
20、,是目前支持最广泛、使用等,是目前支持最广泛、使用 最多的最多的Bootloader。 嵌入式Linux编程入门与开发实例- 第3章 lRedBoot : RedBoot是是Redhat公司随公司随eCos (Embedded Configurable Operating System)发布的)发布的 一个一个Boot方案,是一个开源项目。方案,是一个开源项目。 lARMBoot:是是sourceforge上的一个开放源代码的项上的一个开放源代码的项 目,它最初的设计只是针对目,它最初的设计只是针对ARM处理器体系结构,所处理器体系结构,所 以它可以很容易地被移植到各种以以它可以很容易地被移植
21、到各种以ARM为核心的平台为核心的平台 上。上。 嵌入式Linux编程入门与开发实例- 第3章 图图3-1是一个同时装有是一个同时装有 Bootloader、内核的启动参数、内核的启动参数、 内核映像和根文件系统映像的固态存储设备的典型空内核映像和根文件系统映像的固态存储设备的典型空 间分配结构图。间分配结构图。 图3-1 固态存储设备的典型空间分配结构 嵌入式Linux编程入门与开发实例- 第3章 Bootloader 的启动过程有单阶段(的启动过程有单阶段(Single Stage)和多)和多 阶段(阶段(Multi-Stage)两种形式。通常多阶段的)两种形式。通常多阶段的 Bootlo
22、ader 能提供更为复杂的功能,以及更好的可移植性。从固态存能提供更为复杂的功能,以及更好的可移植性。从固态存 储设备上启动的储设备上启动的 Bootloader 大多都是大多都是2 阶段的启动过程,阶段的启动过程, 也即启动过程可以分为也即启动过程可以分为 stage 1 和和 stage 2 两部分。两部分。 嵌入式Linux编程入门与开发实例- 第3章 stage1 通常包括以下步骤(按执行的先后顺序):通常包括以下步骤(按执行的先后顺序): (1)硬件设备初始化。)硬件设备初始化。 这是这是 Bootloader 一开始就执行的操作,其目的是为一开始就执行的操作,其目的是为 stage
23、2 的执行以及随后的的执行以及随后的 kernel 的执行准备好一些基本的执行准备好一些基本 的硬件环境。它通常包括以下步骤:的硬件环境。它通常包括以下步骤: l屏蔽所有的中断。为中断提供服务通常是屏蔽所有的中断。为中断提供服务通常是OS 设备驱动设备驱动 程序的责任,因此在程序的责任,因此在Bootloader 的执行全过程中可以不的执行全过程中可以不 必响应任何中断。中断屏蔽可以通过写必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏的中断屏 蔽寄存器或状态寄存器(比如蔽寄存器或状态寄存器(比如 ARM 的的 CPSR 寄存器)寄存器) 来完成。来完成。 嵌入式Linux编程入门与开发实
24、例- 第3章 l设置设置 CPU 的速度和时钟频率。的速度和时钟频率。 l RAM 初始化。包括正确地设置系统的内存控初始化。包括正确地设置系统的内存控 制器的功能寄存器以及各内存库控制寄存器等制器的功能寄存器以及各内存库控制寄存器等 。 l初始化初始化 LED。典型地,通过。典型地,通过 GPIO 来驱动来驱动 LED,其目的是表明系统的状态是,其目的是表明系统的状态是 OK 还是还是 Error。如果板子上没有。如果板子上没有 LED,那么也可以通,那么也可以通 过初始化过初始化 UART 向串口打印向串口打印 Bootloader 的的 Logo 字符信息来完成这一点。字符信息来完成这一
25、点。 l 关闭关闭 CPU 内部指令数据内部指令数据 cache。 嵌入式Linux编程入门与开发实例- 第3章 (2)为加载)为加载 Bootloader 的的 stage2 准备准备 RAM 空间。空间。 为了获得更快的执行速度,通常把为了获得更快的执行速度,通常把 stage2 加载到加载到 R A M 空 间 中 来 执 行 , 因 此 必 须 为 加 载空 间 中 来 执 行 , 因 此 必 须 为 加 载 Bootloader 的的 stage2 准备好一段可用的准备好一段可用的RAM 空空 间范围。间范围。 嵌入式Linux编程入门与开发实例- 第3章 (3)拷贝)拷贝 Boot
26、loader 的的 stage2 到到 RAM 空间中。空间中。 拷贝时要确定拷贝时要确定stage2 的可执行映象在固态的可执行映象在固态 存储设备的存放起始地址和终止地址一级存储设备的存放起始地址和终止地址一级RAM 空间的起始地址。空间的起始地址。 嵌入式Linux编程入门与开发实例- 第3章 (4)设置好堆栈。)设置好堆栈。 堆栈指针的设置是为了执行堆栈指针的设置是为了执行 C 语言代码作好准语言代码作好准 备。此外,在设置堆栈指针备。此外,在设置堆栈指针 sp 之前,也可以关闭之前,也可以关闭 LED 灯,以提示用户准备跳转到灯,以提示用户准备跳转到 stage2。经过上述。经过上述
27、 这些执行步骤后,系统的物理内存布局应该如下图这些执行步骤后,系统的物理内存布局应该如下图 3-2所示。所示。 嵌入式Linux编程入门与开发实例- 第3章 图3-2 Bootloader 的 stage2 可执行映象刚被拷贝到 RAM 空间时 的系统内存布局 嵌入式Linux编程入门与开发实例- 第3章 (5)跳转到)跳转到 stage2 的的 C 入口点。入口点。 在上述一切都就绪后,就可以跳转到在上述一切都就绪后,就可以跳转到 Bootloader 的的 stage2 去执行了。比如,在去执行了。比如,在 ARM 系统中,可以通过修改系统中,可以通过修改 PC 寄存器为合寄存器为合 适的
28、地址来实现。适的地址来实现。 嵌入式Linux编程入门与开发实例- 第3章 stage2 通常包括以下步骤(按执行的先后顺序):通常包括以下步骤(按执行的先后顺序): (1)初始化本阶段要使用到的硬件设备。)初始化本阶段要使用到的硬件设备。 通常包括:初始化至少一个串口,以便和终通常包括:初始化至少一个串口,以便和终 端用户进行端用户进行 I/O 输出信息;初始化计时器等。在输出信息;初始化计时器等。在 初始化这些设备之前,也可以重新把初始化这些设备之前,也可以重新把 LED 灯点亮灯点亮 ,以表明已经进入,以表明已经进入 main()函数执行。设备初始化函数执行。设备初始化 完成后,可以输出
29、一些打印信息,程序名字字符完成后,可以输出一些打印信息,程序名字字符 串、版本号等。串、版本号等。 嵌入式Linux编程入门与开发实例- 第3章 (2)检测系统内存映射()检测系统内存映射(memory map)。)。 所谓内存映射就是指在整个所谓内存映射就是指在整个 4GB 物理物理 地址空间中有哪些地址范围被分配用来寻地址空间中有哪些地址范围被分配用来寻 址系统的址系统的 RAM 单元。单元。 嵌入式Linux编程入门与开发实例- 第3章 (3)将)将kernel 映像和根文件系统映像从映像和根文件系统映像从 Flash 上读上读 到到 RAM 空间中。空间中。 首先规划内存占用的布局,这
30、里包括两个方面:首先规划内存占用的布局,这里包括两个方面: 内核映像所占用的内存范围;根文件系统所占用的内核映像所占用的内存范围;根文件系统所占用的 内存范围。在规划内存占用的布局时,主要考虑基内存范围。在规划内存占用的布局时,主要考虑基 地址和映像的大小两个方面。地址和映像的大小两个方面。 对于内核映像,一般将其拷贝到从基地址开始对于内核映像,一般将其拷贝到从基地址开始 的大约的大约1MB大小的内存范围内。大小的内存范围内。 嵌入式Linux编程入门与开发实例- 第3章 (4)为内核设置启动参数。)为内核设置启动参数。 在将内核映像和根文件系统映像拷贝到在将内核映像和根文件系统映像拷贝到RA
31、M 空间中后,就可以准备启动空间中后,就可以准备启动 Linux 内核了。但是内核了。但是 在调用内核之前,应该作一步准备工作,即设置在调用内核之前,应该作一步准备工作,即设置 Linux 内核的启动参数。内核的启动参数。 嵌入式Linux编程入门与开发实例- 第3章 (5)调用内核。)调用内核。 Bootloader 调用调用 Linux 内核的方法是直接跳内核的方法是直接跳 转到内核的第一条指令处,也即直接跳转到转到内核的第一条指令处,也即直接跳转到 MEM_START0 x8000 地址处。在跳转时,下列地址处。在跳转时,下列 条件要满足:条件要满足: 嵌入式Linux编程入门与开发实例
32、- 第3章 lCPU 寄存器的设置:寄存器的设置:R00;R1机器类型机器类型 ID;关于;关于 Machine Type Number,可以参见,可以参见 linux/arch/arm/tools/mach-types;R2启动参启动参 数标记列表在数标记列表在 RAM 中起始基地址。中起始基地址。 lCPU 模式:必须禁止中断(模式:必须禁止中断(IRQs和和FIQs);); CPU 必须必须 SVC 模式。模式。 lCache 和和 MMU 的设置:的设置:MMU 必须关闭;指必须关闭;指 令令 Cache 可以打开也可以关闭;数据可以打开也可以关闭;数据 Cache 必须关闭。必须关闭
33、。 嵌入式Linux编程入门与开发实例- 第3章 Bootloader的系统启动方案流程如图3-3所示。 图3-3 Bootloader系统启动方案流图 嵌入式Linux编程入门与开发实例- 第3章 U-Boot (Universal Bootloader),即),即 通用通用Bootloader,是遵循,是遵循GPL条款的开放条款的开放 源码项目。从源码项目。从FADSROM、8xxROM、 PPCBOOT逐步发展演化而来。其前身逐步发展演化而来。其前身 是 由 德 国是 由 德 国 D E N X 软 件 工 程 中 心 的软 件 工 程 中 心 的 Wolfgang Denk基于基于8x
34、xROM的源码创建的源码创建 的的PPCBOOT工程。工程。 嵌入式Linux编程入门与开发实例- 第3章 U-Boot不仅仅支持嵌入式不仅仅支持嵌入式Linux系统的系统的 引导,当前,它还支持引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作嵌入式操作 系统。其目前要支持的目标操作系统是系统。其目前要支持的目标操作系统是 OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS
35、, QNX, RTEMS, ARTOS。 嵌入式Linux编程入门与开发实例- 第3章 U-Boot有如下特性:有如下特性: l开放源码开放源码,支持多种嵌入式操作系统内核支持多种嵌入式操作系统内核 ,如,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; l支持多个处理器系列,如支持多个处理器系列,如PowerPC、 ARM、x86、MIPS、XScale; l较高的可靠性和稳定性较高的可靠性和稳定性; 嵌入式Linux编程入门与开发实例- 第3章 l高度灵活的功能设置,适合高度灵活的功能设置,适合U-Boot调试、操作调试、操作 系统不同引
36、导要求、产品发布等;系统不同引导要求、产品发布等; l丰富的设备驱动源码,如串口、以太网、丰富的设备驱动源码,如串口、以太网、 SDRAM、FLASH、LCD、NVRAM、 EEPROM、RTC、键盘等;、键盘等; l较为丰富的开发调试文档与强大的网络技术支较为丰富的开发调试文档与强大的网络技术支 持;持; l支持支持NFS挂载、挂载、RAMDISK(压缩或非压缩)(压缩或非压缩) 形式的根文件系统;形式的根文件系统; 嵌入式Linux编程入门与开发实例- 第3章 l支持支持NFS挂载、从挂载、从Flash中引导压缩或非压缩系统内核中引导压缩或非压缩系统内核 ; l可灵活设置、传递多个关键参数
37、给操作系统,适合系可灵活设置、传递多个关键参数给操作系统,适合系 统在不同开发阶段的调试要求与产品发布,尤其对统在不同开发阶段的调试要求与产品发布,尤其对 Linux支持最强;支持最强; l支持目标板环境变量多种存储方式,如支持目标板环境变量多种存储方式,如Flash、 NVRAM、EEPROM; lCRC32校验,可校验校验,可校验Flash中内核、中内核、RAMDISK镜像文镜像文 件是否完好。件是否完好。 l上电自检功能:上电自检功能:SDRAM、Flash大小自动检测,大小自动检测, SDRAM故障检测,故障检测,CPU型号。型号。 l特殊功能:特殊功能:XIP内核引导。内核引导。 嵌
38、入式Linux编程入门与开发实例- 第3章 U-Boot源码结构:源码结构: 从网站上下载得到从网站上下载得到U-Boot源码包,例如:,解压源码包,例如:,解压 就可以得到全部就可以得到全部U-Boot源程序。在顶层目录下有源程序。在顶层目录下有26个个 子目录,分别存放和管理不同的源程序。这些目录中子目录,分别存放和管理不同的源程序。这些目录中 所要存放的文件有其规则,可以分为所要存放的文件有其规则,可以分为4类。类。 l第第1类目录与处理器体系结构或者开发板硬件直接相关类目录与处理器体系结构或者开发板硬件直接相关 ; l第第2类目录是一些通用的函数或者驱动程序;类目录是一些通用的函数或者
39、驱动程序; l第第3类目录是通用的设备驱动程序。类目录是通用的设备驱动程序。 l第第4类目录是类目录是U-Boot的应用程序、工具或者文档。的应用程序、工具或者文档。 嵌入式Linux编程入门与开发实例- 第3章 目 录 特 性解 释 说 明 board平台依赖 存放电路板相关的目录文件,例如:RPXlite( mpc8xx)、smdk2410(arm920t)、sc520_cdp( x86) 等目录 cpu平台依赖 存放CPU相关的目录文件,例如:mpc8xx、 ppc4xx、arm720t、arm920t、 xscale、i386等目录 lib_ppc平台依赖 存放对PowerPC体系结构
40、通用的文件,主要用于 实现PowerPC平台通用的函数 lib_arm平台依赖 存放对ARM体系结构通用的文件,主要用于实现 ARM平台通用的函数 lib_i386平台依赖 存放对X86体系结构通用的文件,主要用于实现 X86平台通用的函数 include通用 头文件和开发板配置文件,所有开发板的配置文 件都在configs目录下 common通用通用的多功能函数实现 表3-1 U-Boot顶层目录说明 嵌入式Linux编程入门与开发实例- 第3章 lib_generic通用通用库函数的实现 Net通用存放网络的程序 Fs通用存放文件系统的程序 Post通用存放上电自检程序 drivers通用
41、 通用的设备驱动程序,主要有以太网接口的驱 动 Disk通用硬盘接口程序 嵌入式Linux编程入门与开发实例- 第3章 Rtc通用RTC的驱动程序 Dtt通用数字温度测量器或者传感器的驱动 examples应用例程 一些独立运行的应用程序的例子,例如 helloworld tools工具 存放制作S-Record 或者 U-Boot格式的映像等工 具,例如mkimage Doc文档开发使用文档 嵌入式Linux编程入门与开发实例- 第3章 U-Boot的编译:的编译: U-Boot的源码是通过的源码是通过GCC和和Makefile组织组织 编译的。顶层目录下的编译的。顶层目录下的Makefil
42、e首先可以设置首先可以设置 开发板的定义,然后递归地调用各级子目录下开发板的定义,然后递归地调用各级子目录下 的的Makefile,最后把编译过的程序链接成,最后把编译过的程序链接成U- Boot映像。映像。 嵌入式Linux编程入门与开发实例- 第3章 表3-2 U-Boot编译生成的映像文件 文件名称说明 System.mapU-Boot映像的符号表 u-bootU-Boot映像的ELF格式 u-boot.binU-Boot映像原始的二进制格式 u-boot.srecU-Boot映像的S-Record格式 嵌入式Linux编程入门与开发实例- 第3章 U-Boot的移植:的移植: U-Bo
43、ot能够支持多种体系结构的处理器,能够支持多种体系结构的处理器, 支持的开发板也越来越多。因为支持的开发板也越来越多。因为Bootloader是是 完全依赖硬件平台的,所以在新电路板上需要完全依赖硬件平台的,所以在新电路板上需要 移植移植U-Boot程序。程序。 嵌入式Linux编程入门与开发实例- 第3章 移植移植U-Boot的基本步骤如下:的基本步骤如下: (1)在顶层)在顶层Makefile中为开发板添加新的配置选项。中为开发板添加新的配置选项。 (2)创建一个新目录存放开发板相关的代码,并且添加)创建一个新目录存放开发板相关的代码,并且添加 文件。文件。 (3)为开发板添加新的配置文件
44、)为开发板添加新的配置文件 (4)配置开发板)配置开发板 (5)编译)编译U-Boot (6)添加驱动或者功能选项。在能够编译通过的基础上)添加驱动或者功能选项。在能够编译通过的基础上 ,还要实现,还要实现U-Boot的以太网接口、的以太网接口、Flash擦写等功能。擦写等功能。 (7)调试)调试U-Boot源代码,直到源代码,直到U-Boot在开发板上能够正在开发板上能够正 常启动。常启动。 嵌入式Linux编程入门与开发实例- 第3章 VIVI是韩国是韩国MIZI Research公司为其开发的公司为其开发的 SMDK2410开发板编写的一款开发板编写的一款Bootloader。VIVI
45、也有前面说过的两种工作模式,启动加载模式可也有前面说过的两种工作模式,启动加载模式可 以在一段时间(这个时间可更改)后自行启动以在一段时间(这个时间可更改)后自行启动 Linux内核,这是内核,这是VIVI的默认模式。在下载模式的默认模式。在下载模式 下,下,VIVI为用户提供一个命令行接口,通过该接为用户提供一个命令行接口,通过该接 口可以使用口可以使用VIVI提供的一些命令,见表提供的一些命令,见表3-3。 嵌入式Linux编程入门与开发实例- 第3章 表3-3 VIVI的命令 命令 功能 Load 把二进制文件载入 Flash或RAM Part操作MTD分区信息 Param设置参数 Bo
46、ot启动系统 Flash管理Flash 嵌入式Linux编程入门与开发实例- 第3章 配置VIVI使用的命令如下: make distclean; make menuconfig; 编 译 之 前 , 要 先 指 定 M a k e f i l e 文 件 中 的 LINUX_INCLUDE_DIR、CROSS_COMPILE和 ARM_GCC_LIBS。配置并保存后,使用make命令开始 编译VIVI。 嵌入式Linux编程入门与开发实例- 第3章 VIVI的代码包括的代码包括arch, init, lib, drivers和和 include等几个目录,共有等几个目录,共有200多个文件。
47、多个文件。VIVI 包括下面几个目录。包括下面几个目录。 l arch:此目录包括了所有:此目录包括了所有VIVI支持的目标支持的目标 板的子目录,这里只有板的子目录,这里只有s3c2410目录。目录。 l drivers:其中包括了引导内核需要的设备:其中包括了引导内核需要的设备 的驱动程序(的驱动程序(mtd和串口)。和串口)。mtd目录下的目录下的 maps、nand和和nor三个目录分别是内存映射、三个目录分别是内存映射、 NAND Flash驱动和驱动和NOR Flash驱动。驱动。 嵌入式Linux编程入门与开发实例- 第3章 linit:这个目录只有和两个文件。和普通的:这个目录
48、只有和两个文件。和普通的C程程 序一样,序一样,VIVI将从将从main函数开始执行。函数开始执行。 llib:一些平台公共的接口代码,比如里的:一些平台公共的接口代码,比如里的 udelay( )和和mdelay( )。 linclude:头文件的公共目录,其中的定义了这:头文件的公共目录,其中的定义了这 块处理器的一些寄存器,以及块处理器的一些寄存器,以及NAND Flash的的 一些寄存器等。定义了与开发板相关的资源配一些寄存器等。定义了与开发板相关的资源配 置参数,我们往往只需修改这个文件就可以配置参数,我们往往只需修改这个文件就可以配 置目标板的参数,如波特率、引导参数、物理置目标板
49、的参数,如波特率、引导参数、物理 内存映射等。内存映射等。 嵌入式Linux编程入门与开发实例- 第3章 Linux内核是指内核是指Linux源代码经过编译和链接源代码经过编译和链接 生成的映像文件(生成的映像文件(Image)。通常编译嵌入式)。通常编译嵌入式 Linux内核都是通过不同的内核都是通过不同的make命令来实现的命令来实现的, 它的执行配置文件就是通常所说的它的执行配置文件就是通常所说的Makefile,而而 不同的不同的Makefile又通过互相的依赖关系构成一又通过互相的依赖关系构成一 个统一的整体去完成建立依存关系、建立内核个统一的整体去完成建立依存关系、建立内核 等功能
50、。等功能。 嵌入式Linux编程入门与开发实例- 第3章 1、进程调度(、进程调度(SCHED) 控制进程对控制进程对CPU的访问。当需要选择下一个进程运的访问。当需要选择下一个进程运 行时,由调度程序选择最值得运行的进程。可运行进程行时,由调度程序选择最值得运行的进程。可运行进程 实际上是仅等待实际上是仅等待CPU资源的进程,如果某个进程在等待资源的进程,如果某个进程在等待 其它资源,则该进程是不可运行进程。其它资源,则该进程是不可运行进程。Linux使用了比使用了比 较简单的基于优先级的进程调度算法选择新的进程。较简单的基于优先级的进程调度算法选择新的进程。 嵌入式Linux编程入门与开发
51、实例- 第3章 2、内存管理(、内存管理(MM) 允许多个进程安全的共享主内存区域。允许多个进程安全的共享主内存区域。 Linux的内存管理支持虚拟内存,即在计算机中的内存管理支持虚拟内存,即在计算机中 运行的程序,其代码,数据,堆栈的总量可以运行的程序,其代码,数据,堆栈的总量可以 超过实际内存的大小,操作系统只是把当前使超过实际内存的大小,操作系统只是把当前使 用的程序块保留在内存中,其余的程序块则保用的程序块保留在内存中,其余的程序块则保 留在磁盘中。必要时,操作系统负责在磁盘和留在磁盘中。必要时,操作系统负责在磁盘和 内存间交换程序块。内存管理从逻辑上分为硬内存间交换程序块。内存管理从
52、逻辑上分为硬 件无关部分和硬件有关部分。硬件无关部分提件无关部分和硬件有关部分。硬件无关部分提 供了进程的映射和逻辑内存的对换;硬件相关供了进程的映射和逻辑内存的对换;硬件相关 的部分为内存管理硬件提供了虚拟接口。的部分为内存管理硬件提供了虚拟接口。 嵌入式Linux编程入门与开发实例- 第3章 3、虚拟文件系统(、虚拟文件系统(Virtual) 隐藏了各种硬件的具体细节,为所有的设隐藏了各种硬件的具体细节,为所有的设 备提供了统一的接口,备提供了统一的接口,VFS提供了多达数十种提供了多达数十种 不同的文件系统。虚拟文件系统可以分为逻辑不同的文件系统。虚拟文件系统可以分为逻辑 文件系统和设备
53、驱动程序。逻辑文件系统指文件系统和设备驱动程序。逻辑文件系统指 Linux所支持的文件系统,如所支持的文件系统,如ext2,fat等,设备等,设备 驱动程序指为每一种硬件控制器所编写的设备驱动程序指为每一种硬件控制器所编写的设备 驱动程序模块。驱动程序模块。 嵌入式Linux编程入门与开发实例- 第3章 4、网络接口(、网络接口(NET) 提供了对各种网络标准的存取和各种网络提供了对各种网络标准的存取和各种网络 硬件的支持。网络接口可分为网络协议和网络硬件的支持。网络接口可分为网络协议和网络 驱动程序。网络协议部分负责实现每一种可能驱动程序。网络协议部分负责实现每一种可能 的网络传输协议。网络
54、设备驱动程序负责与硬的网络传输协议。网络设备驱动程序负责与硬 件设备通讯,每一种可能的硬件设备都有相应件设备通讯,每一种可能的硬件设备都有相应 的设备驱动程序。的设备驱动程序。 嵌入式Linux编程入门与开发实例- 第3章 5、 进程间通讯进程间通讯(IPC) 支持进程间各种通信机制。支持进程间各种通信机制。 嵌入式Linux编程入门与开发实例- 第3章 各个子系统之间的依赖关系如下:各个子系统之间的依赖关系如下: l 进程调度与内存管理之间的关系:这两进程调度与内存管理之间的关系:这两 个子系统互相依赖。在多道程序环境下个子系统互相依赖。在多道程序环境下 ,程序要运行必须为之创建进程,而创,
55、程序要运行必须为之创建进程,而创 建进程的第一件事情,就是将程序和数建进程的第一件事情,就是将程序和数 据装入内存。据装入内存。 嵌入式Linux编程入门与开发实例- 第3章 l进程间通信与内存管理的关系:进程间通信子进程间通信与内存管理的关系:进程间通信子 系统要依赖内存管理支持共享内存通信机制,系统要依赖内存管理支持共享内存通信机制, 这种机制允许两个进程除了拥有自己的私有空这种机制允许两个进程除了拥有自己的私有空 间,还可以存取共同的内存区域。间,还可以存取共同的内存区域。 l虚拟文件系统与网络接口之间的关系:虚拟文虚拟文件系统与网络接口之间的关系:虚拟文 件系统利用网络接口支持网络文件
56、系统件系统利用网络接口支持网络文件系统(NFS), 也利用内存管理支持也利用内存管理支持RAMDISK设备。设备。 嵌入式Linux编程入门与开发实例- 第3章 l内存管理与虚拟文件系统之间的关系:内存管理与虚拟文件系统之间的关系: 内存管理利用虚拟文件系统支持交换,内存管理利用虚拟文件系统支持交换, 交换进程交换进程(swapd)定期由调度程序调度,定期由调度程序调度, 这也是内存管理依赖于进程调度的唯一这也是内存管理依赖于进程调度的唯一 原因。当一个进程存取的内存映射被换原因。当一个进程存取的内存映射被换 出时,内存管理向文件系统发出请求,出时,内存管理向文件系统发出请求, 同时,挂起当前
57、正在运行的进程。同时,挂起当前正在运行的进程。 嵌入式Linux编程入门与开发实例- 第3章 Linux内核的配置系统由内核的配置系统由3部分组成:部分组成: (1)Makefile:分布在:分布在Linux内核源代码中的内核源代码中的 Makefile,定义,定义Linux内核的编译规则;内核的编译规则; (2)配置文件():给用户提供配置选择的)配置文件():给用户提供配置选择的 功能。功能。 (3)配置工具,包括配置命令解释器(对配)配置工具,包括配置命令解释器(对配 置脚本中使用的命令进行解释)和配置用户界置脚本中使用的命令进行解释)和配置用户界 面(提供基于字符界面、基于面(提供基于
58、字符界面、基于Ncurses图形界面图形界面 和基于和基于Xwindows图形界面的用户配置界面)。图形界面的用户配置界面)。 嵌入式Linux编程入门与开发实例- 第3章 内核配置方法有以下几种:内核配置方法有以下几种: (1) make config: 基于文本的最为传统的配置基于文本的最为传统的配置 界面界面, 进入命令行进入命令行, 可以一行一行的配置可以一行一行的配置,该方法该方法 较烦琐。较烦琐。 (2) make menuconfig: 基于文本菜单的配置界基于文本菜单的配置界 面面, 是字符终端下常用的方式。是字符终端下常用的方式。 (3) make xconfig: 基于图形窗口模式的配置界基于图形窗口模式的配置界 面面, Xwindow下推荐使用。下推荐使用。 (4) make oldconfig:自动读入自动读入“config”配置文配置文 件件,并且只要求用户设定前次没有设定过的选项并且只要求用户设定前次没有设定过的选项 。 嵌入式Linux编程入门与开发实例- 第3章 # make cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 律师见证授权书3篇
- 安全炊事员责任书3篇
- 夜不归宿的自我反省与誓言3篇
- 售卖猫咪合同范本3篇
- 关于农村房屋赠与合同3篇
- 学生归家安全承诺书3篇
- 叉车操作员工作满意度调查3篇
- 供水工程质量保修协议3篇
- 公司注册委托书应注意哪些问题
- 家长积极参与学校活动的保证书3篇
- 行政管理本科毕业论文-地方政府智慧政府建设问题与对策研究-以G市为例
- 卫星星座设计与组网策略-全面剖析
- (一模)2025年3月济南市2025届高三模拟考试英语试卷(含答案)
- T-CSBT 012-2024 全血及成分血外观检查和处置指南
- 环境应急知识与技能培训
- 2025年矿山救援队技能理论考试题库资料500题(含答案)
- 2024辽宁沈阳水务集团有限公司招聘20人笔试参考题库附带答案详解
- 建筑工地物业服务合同模板7篇
- 《计算机发展史》课件
- 2025年安徽芜湖市阳光电力维修工程有限责任公司招聘笔试参考题库附带答案详解
- 2024-2025学年统编版语文八年级上册期末易错题:现代文阅读(记叙文)(含答案)
评论
0/150
提交评论