《最新嵌入式Linux编程入门与开发实例-第3章PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新嵌入式Linux编程入门与开发实例-第3章PPT课件.ppt(78页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式嵌入式Linux编程入门与开发编程入门与开发实例实例-第第3章章第第3 3章章 构建嵌入式构建嵌入式LinuxLinux开发环境开发环境 嵌入式系统开发环境的构建嵌入式系统开发环境的构建3.1U-bootU-boot的移植的移植3.2嵌入式Linux操作系统内核编译3.3习题与练习习题与练习3.4 strip:丢弃目标文件中的全部或者特定符号。:丢弃目标文件中的全部或者特定符号。libiberty:包含许多:包含许多GNU程序都会用到的函数,程序都会用到的函数,这些程序有:这些程序有:getopt,obstack,strerror,strtol 和和 strtoul等。等。libbfd:
2、二进制文件描述库。:二进制文件描述库。libopcodes:用来处理用来处理opcodes的库的库,在生成一在生成一些应用程序的时候也会用到它。些应用程序的时候也会用到它。windres:一个一个windows资源的编译器。资源的编译器。GCC:工具是编译程序的最为主要的工具。工具是编译程序的最为主要的工具。GCC包括以下几个主要的工具:包括以下几个主要的工具:Cpp:C预处理器。预处理器。g+:C+编译器。编译器。gcc:C编译器。编译器。gccbug:创建:创建bug报告的报告的Shell脚本。脚本。gcov:分析在程序中哪里做优化效果好。:分析在程序中哪里做优化效果好。libgcc*:g
3、cc的运行库。的运行库。libstdc+:标准:标准C+库,包含许多常用函库,包含许多常用函数。数。libsupc+:提供支持:提供支持C+语言的库函数。语言的库函数。Glibe:是是提提供供系系统统调调用用和和基基本本函函数数的的 C 库库,比比如如open(),malloc(),printf()等等等等。所所有有动动态态连连接的程序都要用到它接的程序都要用到它。Glibc 中主要有以下程序:中主要有以下程序:l catchsegv:当程序发生:当程序发生segmentation fault的的时候时候,用来建立一个堆栈跟踪。用来建立一个堆栈跟踪。l gencat:建立消息列表。:建立消息列
4、表。l getconf:针对文件系统的指定变量显示其系:针对文件系统的指定变量显示其系统设置值。统设置值。l getent:从系统管理数据库获取一个条目。:从系统管理数据库获取一个条目。l glibcbug:建立:建立glibc的的bug报告并且发送到报告并且发送到bug报告的邮件地址。报告的邮件地址。l iconv:转化字符集。:转化字符集。l iconvconfig:建立快速读取的:建立快速读取的iconv模块所使模块所使用的设置文件。用的设置文件。l ldconfig:设置动态链接库的实时绑定。:设置动态链接库的实时绑定。l ldd:列出每个程序或者命令需要的共享库。:列出每个程序或者命
5、令需要的共享库。l lddlibc4:辅助辅助 ldd 操作目标文件。操作目标文件。l locale:是一个是一个 Perl 程序,可以告诉编译器程序,可以告诉编译器打开或关闭内建的打开或关闭内建的locale支持。支持。l localedef:编译编译locale标准。标准。l nscd:提供对常用名称设备调用的缓存的守护:提供对常用名称设备调用的缓存的守护进程。进程。l nscd_nischeck:检查在进行:检查在进行NIS+侦查时是否侦查时是否需要安全模式。需要安全模式。l pcprofiledump:打印:打印PC profiling产生的信息。产生的信息。l pt_chown:是一
6、个辅助程序,帮助:是一个辅助程序,帮助grantpt设设置子虚拟终端的属主,用户组和读写权限。置子虚拟终端的属主,用户组和读写权限。l rpcgen:产生实现:产生实现RPC协议的协议的C代码。代码。l rpcinfo:对:对RPC服务器产生一个服务器产生一个RPC呼叫。呼叫。l sln:用来创建符号链接,由于它本身是静态:用来创建符号链接,由于它本身是静态连接的,在动态连接不起作用的时候,连接的,在动态连接不起作用的时候,sln仍然仍然可以建立符号链接。可以建立符号链接。l sprof:读取并显示共享目标的特征描述数据。:读取并显示共享目标的特征描述数据。l tzselect:对用户提出关于
7、当前位置的问题:对用户提出关于当前位置的问题,并并输出时区信息到标准输出。输出时区信息到标准输出。l xtrace:通过打印当前执行的函数跟踪程序:通过打印当前执行的函数跟踪程序执行情况。执行情况。l zdump:显示时区。:显示时区。l zic:时区编译器。:时区编译器。l ld.so:帮助动态链接库的执行。:帮助动态链接库的执行。l libBrokenLocale:帮助程序处理破损:帮助程序处理破损locale,如,如Mozilla。l libSegFault:处理:处理 segmentation fault 信号,信号,试图捕捉试图捕捉segfaults。l libanl:异步名称查询库
8、。:异步名称查询库。l L ibbsd-compat:为了在:为了在linux下执行一些下执行一些BSD程序程序,libbsd-compat提供了必要的可移植性。提供了必要的可移植性。llibc:是主要的:是主要的C库库-常用函数的集成。常用函数的集成。llibcrypt:加密编码库。:加密编码库。llibdl:动态连接接口。:动态连接接口。llibg:g+的运行时。的运行时。llibieee:IEEE浮点运算库。浮点运算库。llibm:数学函数库。:数学函数库。llibmcheck:包括了启动时需要的代码。:包括了启动时需要的代码。llibmemusage:帮助:帮助 memusage 搜集
9、程序运行搜集程序运行时内存占用的信息。时内存占用的信息。llibnsl:网络服务库。:网络服务库。llibnss*:是名称服务切换库,包含了解释主机是名称服务切换库,包含了解释主机名,用户名,组名,别名,服务,协议等等的名,用户名,组名,别名,服务,协议等等的函数。函数。llibpcprofile:帮助内核跟踪在函数:帮助内核跟踪在函数,源码行和源码行和命令中命令中CPU使用时间。使用时间。llibpthread:POSIX 线程库。线程库。llibresolv:创建:创建,发送及解释到互联网域名服务发送及解释到互联网域名服务器的数据包。器的数据包。llibrpcsvc:提供:提供RPC的其他
10、服务。的其他服务。llibrt:提供了大部分的提供了大部分的POSIX.1b实时扩展的实时扩展的接口。接口。llibthread_db:对建立多线程程序的调试很有对建立多线程程序的调试很有用。用。llibutil:包含了在很多不同的包含了在很多不同的 Unix程序中使用程序中使用的的“标准标准”函数。函数。3.2 3.2 移植移植U-bootU-bootBootloader就就是是在在操操作作系系统统内内核核运运行行之之前前运运行行的的一一段段小小程程序序。通通过过这这段段小小程程序序,可可以以初初始始化化硬硬件件设设备备、建建立立内内存存空空间间的的映映射射图图,从从而而将将系系统统的的软软
11、硬硬件件环环境境带带到到一一个个合合适适的的状状态态,以以便便为为最最终终调用操作系统内核准备好正确的环境。调用操作系统内核准备好正确的环境。针针 对对 ARM处处 理理 器器,常常 见见 的的 Bootloader有有 U-Boot、RedBoot、ARMBoot等:等:lU-Boot:它是它是sourceforge上的一个开放源代码的项上的一个开放源代码的项目,可对目,可对PowerPC、ARM、MIPS、x86等处理器提供等处理器提供支持,它支持的嵌入式操作系统有支持,它支持的嵌入式操作系统有Linux、VxWorks、NetBSD、QNX、RTEMS等,是目前支持最广泛、使用等,是目前
12、支持最广泛、使用最多的最多的Bootloader。3.2.1 Bootloader3.2.1 Bootloader概述概述lRedBoot:RedBoot是是Redhat公司随公司随eCos(Embedded Configurable Operating System)发布的)发布的一个一个Boot方案,是一个开源项目。方案,是一个开源项目。lARMBoot:是是sourceforge上的一个开放源代码的项上的一个开放源代码的项目,它最初的设计只是针对目,它最初的设计只是针对ARM处理器体系结构,所处理器体系结构,所以它可以很容易地被移植到各种以以它可以很容易地被移植到各种以ARM为核心的平台
13、为核心的平台上。上。图图3-1是一个同时装有是一个同时装有 Bootloader、内核的启动参数、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。间分配结构图。图3-1固态存储设备的典型空间分配结构3.2.2 Bootloader3.2.2 Bootloader的启动流程的启动流程 Bootloader 的启动过程有单阶段(的启动过程有单阶段(Single Stage)和多)和多阶段(阶段(Multi-Stage)两种形式。通常多阶段的)两种形式。通常多阶段的 Bootloader 能提供更为复杂的功能,以及更好的可移植
14、性。从固态存能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的储设备上启动的 Bootloader 大多都是大多都是2 阶段的启动过程,阶段的启动过程,也即启动过程可以分为也即启动过程可以分为 stage 1 和和 stage 2 两部分。两部分。stage1 通常包括以下步骤(按执行的先后顺序):通常包括以下步骤(按执行的先后顺序):(1)硬件设备初始化。)硬件设备初始化。这是这是 Bootloader 一开始就执行的操作,其目的是为一开始就执行的操作,其目的是为 stage2 的执行以及随后的的执行以及随后的 kernel 的执行准备好一些基本的执行准备好一些基本的硬件环境。
15、它通常包括以下步骤:的硬件环境。它通常包括以下步骤:l屏蔽所有的中断。为中断提供服务通常是屏蔽所有的中断。为中断提供服务通常是OS 设备驱动设备驱动程序的责任,因此在程序的责任,因此在Bootloader 的执行全过程中可以不的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏的中断屏蔽寄存器或状态寄存器(比如蔽寄存器或状态寄存器(比如 ARM 的的 CPSR 寄存器)寄存器)来完成。来完成。l设置设置 CPU 的速度和时钟频率。的速度和时钟频率。l RAM 初始化。包括正确地设置系统的内存控初始化。包括正确地设置系统的内存控制器的功能寄存
16、器以及各内存库控制寄存器等。制器的功能寄存器以及各内存库控制寄存器等。l初始化初始化 LED。典型地,通过。典型地,通过 GPIO 来驱动来驱动 LED,其目的是表明系统的状态是,其目的是表明系统的状态是 OK 还是还是 Error。如果板子上没有。如果板子上没有 LED,那么也可以通,那么也可以通过初始化过初始化 UART 向串口打印向串口打印 Bootloader 的的 Logo 字符信息来完成这一点。字符信息来完成这一点。l 关闭关闭 CPU 内部指令数据内部指令数据 cache。(2)为加载)为加载 Bootloader 的的 stage2 准备准备 RAM 空间。空间。为为了了获获得
17、得更更快快的的执执行行速速度度,通通常常把把 stage2 加加载载到到 RAM 空空 间间 中中 来来 执执 行行,因因 此此 必必 须须 为为 加加 载载 Bootloader 的的 stage2 准准备备好好一一段段可可用用的的RAM 空空间范围。间范围。(3)拷贝)拷贝 Bootloader 的的 stage2 到到 RAM 空间中。空间中。拷拷贝贝时时要要确确定定stage2 的的可可执执行行映映象象在在固固态态存存储储设设备备的的存存放放起起始始地地址址和和终终止止地地址址一一级级RAM 空空间的起始地址。间的起始地址。(4)设置好堆栈。)设置好堆栈。堆堆栈栈指指针针的的设设置置是
18、是为为了了执执行行 C 语语言言代代码码作作好好准准备备。此此外外,在在设设置置堆堆栈栈指指针针 sp 之之前前,也也可可以以关关闭闭 LED 灯灯,以以提提示示用用户户准准备备跳跳转转到到 stage2。经经过过上上述述这这些些执执行行步步骤骤后后,系系统统的的物物理理内内存存布布局局应应该该如如下下图图3-2所示。所示。图3-2Bootloader的stage2可执行映象刚被拷贝到RAM空间时的系统内存布局(5)跳转到)跳转到 stage2 的的 C 入口点。入口点。在在上上述述一一切切都都就就绪绪后后,就就可可以以跳跳转转到到 Bootloader 的的 stage2 去去执执行行了了。
19、比比如如,在在 ARM 系系统统中中,可可以以通通过过修修改改 PC 寄寄存存器器为为合合适的地址来实现。适的地址来实现。stage2 通常包括以下步骤(按执行的先后顺序):通常包括以下步骤(按执行的先后顺序):(1)初始化本阶段要使用到的硬件设备。)初始化本阶段要使用到的硬件设备。通通常常包包括括:初初始始化化至至少少一一个个串串口口,以以便便和和终终端端用用户户进进行行 I/O 输输出出信信息息;初初始始化化计计时时器器等等。在在初初始始化化这这些些设设备备之之前前,也也可可以以重重新新把把 LED 灯灯点点亮亮,以以表表明明已已经经进进入入 main()函函数数执执行行。设设备备初初始始
20、化化完完成成后后,可可以以输输出出一一些些打打印印信信息息,程程序序名名字字字字符符串串、版本号等。版本号等。(2)检测系统内存映射()检测系统内存映射(memory map)。)。所所谓谓内内存存映映射射就就是是指指在在整整个个 4GB 物物理理地地址址空空间间中中有有哪哪些些地地址址范范围围被被分分配配用用来来寻寻址系统的址系统的 RAM 单元。单元。(3)将)将kernel 映像和根文件系统映像从映像和根文件系统映像从 Flash 上读上读到到 RAM 空间中。空间中。首先规划内存占用的布局,这里包括两个方面:首先规划内存占用的布局,这里包括两个方面:内核映像所占用的内存范围;根文件系统
21、所占用的内核映像所占用的内存范围;根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。地址和映像的大小两个方面。对于内核映像,一般将其拷贝到从基地址开始对于内核映像,一般将其拷贝到从基地址开始的大约的大约1MB大小的内存范围内。大小的内存范围内。(4)为内核设置启动参数。)为内核设置启动参数。在将内核映像和根文件系统映像拷贝到在将内核映像和根文件系统映像拷贝到RAM空间中后,就可以准备启动空间中后,就可以准备启动Linux内核了。但是内核了。但是在调用内核之前,应该作一步准备工作,即设置在调用内核之前,应该作一步准
22、备工作,即设置Linux内核的启动参数。内核的启动参数。(5)调用内核。)调用内核。Bootloader 调调用用 Linux 内内核核的的方方法法是是直直接接跳跳转转到到内内核核的的第第一一条条指指令令处处,也也即即直直接接跳跳转转到到 MEM_START0 x8000 地地址址处处。在在跳跳转转时时,下下列列条件要满足:条件要满足:lCPU 寄寄存存器器的的设设置置:R00;R1机机器器类类型型 ID;关关于于 Machine Type Number,可可以以参参见见 linux/arch/arm/tools/mach-types;R2启启动动参参数标记列表在数标记列表在 RAM 中起始基
23、地址。中起始基地址。lCPU 模模式式:必必须须禁禁止止中中断断(IRQs和和FIQs);CPU 必须必须 SVC 模式。模式。lCache 和和 MMU 的的设设置置:MMU 必必须须关关闭闭;指指令令 Cache 可可以以打打开开也也可可以以关关闭闭;数数据据 Cache 必必须关闭。须关闭。Bootloader的系统启动方案流程如图3-3所示。图3-3Bootloader系统启动方案流图3.2.3 U-Boot 3.2.3 U-Boot 分析与移植分析与移植 U-Boot(Universal Bootloader),即即通通用用Bootloader,是是遵遵循循GPL条条款款的的开开放放
24、源源码码项项目目。从从FADSROM、8xxROM、PPCBOOT逐逐步步发发展展演演化化而而来来。其其前前身身是是由由德德国国DENX软软件件工工程程中中心心的的Wolfgang Denk基基 于于 8xxROM的的 源源 码码 创创 建建 的的PPCBOOT工程。工程。U-Boot不不仅仅仅仅支支持持嵌嵌入入式式Linux系系统统的的引引导导,当当前前,它它还还支支持持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS嵌嵌入入式式操操作作系系统统。其其目目前前要要支支持持的的目目标标操操作作系系统统是是OpenBSD,NetBSD,FreeBSD,4.4BSD,Li
25、nux,SVR4,Esix,Solaris,Irix,SCO,Dell,NCR,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS。U-Boot有如下特性:有如下特性:l开放源码开放源码,支持多种嵌入式操作系统内核,支持多种嵌入式操作系统内核,如如Linux、NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS;l支持多个处理器系列,如支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;l较高的可靠性和稳定性较高的可靠性和稳定性;l高度灵活的功能设置,适合高度灵活的功能设置,适合U-Boot调试、操作调试、操作系统不同引导要求
26、、产品发布等;系统不同引导要求、产品发布等;l丰富的设备驱动源码,如串口、以太网、丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;、键盘等;l较为丰富的开发调试文档与强大的网络技术支较为丰富的开发调试文档与强大的网络技术支持;持;l支持支持NFS挂载、挂载、RAMDISK(压缩或非压缩)(压缩或非压缩)形式的根文件系统;形式的根文件系统;l支持支持NFS挂载、从挂载、从Flash中引导压缩或非压缩系统内核;中引导压缩或非压缩系统内核;l可灵活设置、传递多个关键参数给操作系统,适合系可灵活设置、传递多个关键参数给操作系统,适合系统在不
27、同开发阶段的调试要求与产品发布,尤其对统在不同开发阶段的调试要求与产品发布,尤其对Linux支持最强;支持最强;l支持目标板环境变量多种存储方式,如支持目标板环境变量多种存储方式,如Flash、NVRAM、EEPROM;lCRC32校验,可校验校验,可校验Flash中内核、中内核、RAMDISK镜像文镜像文件是否完好。件是否完好。l上电自检功能:上电自检功能:SDRAM、Flash大小自动检测,大小自动检测,SDRAM故障检测,故障检测,CPU型号。型号。l特殊功能:特殊功能:XIP内核引导。内核引导。U-Boot源码结构:源码结构:从网站上下载得到从网站上下载得到U-Boot源码包,例如:源
28、码包,例如:U-Boot-1.1.26tar.bz2,解压就可以得到全部,解压就可以得到全部U-Boot源程序。在源程序。在顶层目录下有顶层目录下有26个子目录,分别存放和管理不同的源个子目录,分别存放和管理不同的源程序。这些目录中所要存放的文件有其规则,可以分程序。这些目录中所要存放的文件有其规则,可以分为为4类。类。l第第1类目录与处理器体系结构或者开发板硬件直接相关;类目录与处理器体系结构或者开发板硬件直接相关;l第第2类目录是一些通用的函数或者驱动程序;类目录是一些通用的函数或者驱动程序;l第第3类目录是通用的设备驱动程序。类目录是通用的设备驱动程序。l第第4类目录是类目录是U-Boo
29、t的应用程序、工具或者文档。的应用程序、工具或者文档。目录特性解释说明board平台依赖存放电路板相关的目录文件,例如:RPXlite(mpc8xx)、smdk2410(arm920t)、sc520_cdp(x86)等目录cpu平台依赖存放CPU相关的目录文件,例如:mpc8xx、ppc4xx、arm720t、arm920t、xscale、i386等目录lib_ppc平台依赖存放对PowerPC体系结构通用的文件,主要用于实现PowerPC平台通用的函数lib_arm平台依赖存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数lib_i386平台依赖存放对X86体系结构通用的文件,
30、主要用于实现X86平台通用的函数include通用头文件和开发板配置文件,所有开发板的配置文件都在configs目录下common通用通用的多功能函数实现表3-1U-Boot顶层目录说明lib_generic通用通用库函数的实现Net通用存放网络的程序Fs通用存放文件系统的程序Post通用存放上电自检程序drivers通用通用的设备驱动程序,主要有以太网接口的驱动Disk通用硬盘接口程序Rtc通用RTC的驱动程序Dtt通用数字温度测量器或者传感器的驱动examples应用例程一些独立运行的应用程序的例子,例如helloworldtools工具存放制作S-Record或者U-Boot格式的映像等
31、工具,例如mkimageDoc文档开发使用文档U-Boot的编译:的编译:U-Boot的的源源码码是是通通过过GCC和和Makefile组组织织编编译译的的。顶顶层层目目录录下下的的Makefile首首先先可可以以设设置置开开发发板板的的定定义义,然然后后递递归归地地调调用用各各级级子子目目录录下下的的Makefile,最最后后把把编编译译过过的的程程序序链链接接成成U-Boot映像。映像。表3-2U-Boot编译生成的映像文件文件名称说明System.mapU-Boot映像的符号表u-bootU-Boot映像的ELF格式u-boot.binU-Boot映像原始的二进制格式u-boot.sre
32、cU-Boot映像的S-Record格式U-Boot的移植:的移植:U-Boot能能够够支支持持多多种种体体系系结结构构的的处处理理器器,支支持持的的开开发发板板也也越越来来越越多多。因因为为Bootloader是是完完全全依依赖赖硬硬件件平平台台的的,所所以以在在新新电电路路板板上上需需要要移植移植U-Boot程序。程序。移植移植U-Boot的基本步骤如下:的基本步骤如下:(1)在顶层)在顶层Makefile中为开发板添加新的配置选项。中为开发板添加新的配置选项。(2)创建一个新目录存放开发板相关的代码,并且添加)创建一个新目录存放开发板相关的代码,并且添加文件。文件。(3)为开发板添加新的
33、配置文件)为开发板添加新的配置文件(4)配置开发板)配置开发板(5)编译)编译U-Boot(6)添加驱动或者功能选项。在能够编译通过的基础上,)添加驱动或者功能选项。在能够编译通过的基础上,还要实现还要实现U-Boot的以太网接口、的以太网接口、Flash擦写等功能。擦写等功能。(7)调试)调试U-Boot源代码,直到源代码,直到U-Boot在开发板上能够正在开发板上能够正常启动。常启动。3.2.4 VIVI 分析 VIVI是是韩韩国国MIZI Research公公司司为为其其开开发发的的SMDK2410开开发发板板编编写写的的一一款款Bootloader。VIVI也也有有前前面面说说过过的的
34、两两种种工工作作模模式式,启启动动加加载载模模式式可可以以在在一一段段时时间间(这这个个时时间间可可更更改改)后后自自行行启启动动Linux内内核核,这这是是VIVI的的默默认认模模式式。在在下下载载模模式式下下,VIVI为为用用户户提提供供一一个个命命令令行行接接口口,通通过过该该接接口可以使用口可以使用VIVI提供的一些命令,见表提供的一些命令,见表3-3。表3-3VIVI的命令命令功能Load把二进制文件载入Flash或RAMPart操作MTD分区信息Param设置参数Boot启动系统Flash管理Flash配置VIVI使用的命令如下:makedistclean;makemenuconf
35、ig;编 译 之 前,要 先 指 定 Makefile文 件 中 的LINUX_INCLUDE_DIR、CROSS_COMPILE和ARM_GCC_LIBS。配置并保存后,使用make命令开始编译VIVI。VIVI的的 代代 码码 包包 括括 arch,init,lib,drivers和和include等等几几个个目目录录,共共有有200多多个个文文件件。VIVI包括下面几个目录。包括下面几个目录。l arch:此此目目录录包包括括了了所所有有VIVI支支持持的的目目标标板板的子目录,这里只有的子目录,这里只有s3c2410目录。目录。l drivers:其其中中包包括括了了引引导导内内核核需
36、需要要的的设设备备的的驱驱动动程程序序(mtd和和串串口口)。mtd目目录录下下的的maps、nand和和nor三三个个目目录录分分别别是是内内存存映映射射、NAND Flash驱动和驱动和NOR Flash驱动。驱动。linit:这个目录只有:这个目录只有main.c和和version.c两个文件。两个文件。和普通的和普通的C程序一样,程序一样,VIVI将从将从main函数开始函数开始执行。执行。llib:一些平台公共的接口代码,比如:一些平台公共的接口代码,比如time.c里里的的udelay()和和mdelay()。linclude:头文件的公共目录,其中的:头文件的公共目录,其中的s3
37、c2410.h定义了这块处理器的一些寄存器,以及定义了这块处理器的一些寄存器,以及NAND Flash的一些寄存器等。的一些寄存器等。platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往定义了与开发板相关的资源配置参数,我们往往只需修改这个文件就可以配置目标板的参数,往只需修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。如波特率、引导参数、物理内存映射等。3.3 3.3 嵌入式嵌入式LinuxLinux操作系统内核编译操作系统内核编译Linux内内核核是是指指Linux源源代代码码经经过过编编译译和和链链接接生生成成的的映映像像文文件件(Ima
38、ge)。通通常常编编译译嵌嵌入入式式Linux内内核核都都是是通通过过不不同同的的make命命令令来来实实现现的的,它它的的执执行行配配置置文文件件就就是是通通常常所所说说的的Makefile,而而不不同同的的Makefile又又通通过过互互相相的的依依赖赖关关系系构构成成一一个个统统一一的的整整体体去去完完成成建建立立依依存存关关系系、建建立立内内核核等功能。等功能。3.3.1 Linux3.3.1 Linux内核结构内核结构1、进程调度(、进程调度(SCHED)控制进程对控制进程对CPU的访问。当需要选择下一个进程运的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行
39、进程行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待实际上是仅等待CPU资源的进程,如果某个进程在等待资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。其它资源,则该进程是不可运行进程。Linux使用了比使用了比较简单的基于优先级的进程调度算法选择新的进程。较简单的基于优先级的进程调度算法选择新的进程。2、内存管理(、内存管理(MM)允允许许多多个个进进程程安安全全的的共共享享主主内内存存区区域域。Linux的的内内存存管管理理支支持持虚虚拟拟内内存存,即即在在计计算算机机中中运运行行的的程程序序,其其代代码码,数数据据,堆堆栈栈的的总总量量可可以以超超过过实实际际
40、内内存存的的大大小小,操操作作系系统统只只是是把把当当前前使使用用的的程程序序块块保保留留在在内内存存中中,其其余余的的程程序序块块则则保保留留在在磁磁盘盘中中。必必要要时时,操操作作系系统统负负责责在在磁磁盘盘和和内内存存间间交交换换程程序序块块。内内存存管管理理从从逻逻辑辑上上分分为为硬硬件件无无关关部部分分和和硬硬件件有有关关部部分分。硬硬件件无无关关部部分分提提供供了了进进程程的的映映射射和和逻逻辑辑内内存存的的对对换换;硬硬件件相相关关的部分为内存管理硬件提供了虚拟接口。的部分为内存管理硬件提供了虚拟接口。3、虚拟文件系统(、虚拟文件系统(VirtualFileSystem,VFS)
41、隐藏了各种硬件的具体细节,为所有的设隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,备提供了统一的接口,VFS提供了多达数十种提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如所支持的文件系统,如ext2,fat等,设备驱等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。动程序模块。4、网络接口(、网络接口(NET)提供了对各种网络标准的存取和各种网络硬提供了对各种网络标准的存取和各种
42、网络硬件的支持。网络接口可分为网络协议和网络驱件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。设备驱动程序。5、进程间通讯进程间通讯(IPC)支持进程间各种通信机制。支持进程间各种通信机制。各个子系统之间的依赖关系如下:各个子系统之间的依赖关系如下:l 进程调度与内存管理之间的关系:这两进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境
43、下,个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据进程的第一件事情,就是将程序和数据装入内存。装入内存。l进程间通信与内存管理的关系:进程间通信子进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。间,还可以存取共同的内存区域。l虚拟文件系统与网络接口之间的关系:虚拟文虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支
44、持网络文件系统件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持也利用内存管理支持RAMDISK设备。设备。l内内存存管管理理与与虚虚拟拟文文件件系系统统之之间间的的关关系系:内内存存管管理理利利用用虚虚拟拟文文件件系系统统支支持持交交换换,交交换换进进程程(swapd)定定期期由由调调度度程程序序调调度度,这这也也是是内内存存管管理理依依赖赖于于进进程程调调度度的的唯唯一一原原因因。当当一一个个进进程程存存取取的的内内存存映映射射被被换换出出时时,内内存存管管理理向向文文件件系系统统发发出出请请求求,同时,挂起当前正在运行的进程。同时,挂起当前正在运行的进程。3.3.2 内核的
45、配置Linux内核的配置系统由内核的配置系统由3部分组成:部分组成:(1)Makefile:分布在:分布在Linux内核源代码中的内核源代码中的Makefile,定义,定义Linux内核的编译规则;内核的编译规则;(2)配置文件()配置文件(config.in):给用户提供配置):给用户提供配置选择的功能。选择的功能。(3)配置工具,包括配置命令解释器(对配)配置工具,包括配置命令解释器(对配置脚本中使用的命令进行解释)和配置用户界置脚本中使用的命令进行解释)和配置用户界面(提供基于字符界面、基于面(提供基于字符界面、基于Ncurses图形界面图形界面和基于和基于Xwindows图形界面的用户
46、配置界面)。图形界面的用户配置界面)。内核配置方法有以下几种:内核配置方法有以下几种:(1)make config:基于文本的最为传统的配置基于文本的最为传统的配置界面界面,进入命令行进入命令行,可以一行一行的配置可以一行一行的配置,该方法该方法较烦琐。较烦琐。(2)make menuconfig:基于文本菜单的配置界基于文本菜单的配置界面面,是字符终端下常用的方式。是字符终端下常用的方式。(3)make xconfig:基于图形窗口模式的配置界基于图形窗口模式的配置界面面,Xwindow下推荐使用。下推荐使用。(4)make oldconfig:自动读入自动读入“config”配置配置文件文
47、件,并且只要求用户设定前次没有设定过的选并且只要求用户设定前次没有设定过的选项。项。3.3.3 3.3.3 内核编译的过程内核编译的过程#make clean#make dep)#make zImage注意:如果在配置内核时选择了对内核模块的支持,还注意:如果在配置内核时选择了对内核模块的支持,还需要使用如下命令单独地编译内核模块:需要使用如下命令单独地编译内核模块:#make modules3.3.4 3.3.4 内核的移植内核的移植使使某某个个平平台台的的代代码码运运行行在在其其他他平平台台上上的的过过程程就就叫叫做做移移植植。Linux系系统统通通过过移移植植可可以以运运行行在在ARM,
48、PowerPC,M68K等多种平台上。等多种平台上。linux内内核核主主要要由由5个个子子系系统统组组成成:进进程程调调度度、内内存存管管理理、虚虚拟拟文文件件系系统统、网网络络接接口口和和进进程程间间通通信信。一一般般在在Linux系系统统中中的的/usr/src/linux-*.*.*目目录录下下就就是是内内核核源源代代码码。Linux内内核核源源代代码的分布如下。码的分布如下。Linux内核源代码的分布如下。内核源代码的分布如下。larch:这个子目录包含了此核心源代码:这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。所支持的硬件体系结构相关的核心代码。如对于如对于X8
49、6平台就是平台就是i386。linclude:这个目录包括了核心的大多数:这个目录包括了核心的大多数include文件。另外对于每种支持的体系文件。另外对于每种支持的体系结构分别有一个子目录。结构分别有一个子目录。linit:此目录包含核心启动代码。:此目录包含核心启动代码。lmm:此目录包含了所有的内存管理代码。与:此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于目录下,如对应于X86的就是的就是arch/i386/mm/fault.c。ldrivers:系统中所有的设备驱动都位于此目录:系统中所
50、有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于也有对应的子目录,如声卡的驱动对应于drivers/sound。lipc:此目录包含了核心的进程间通讯代码。:此目录包含了核心的进程间通讯代码。lmodules:此目录包含已建好可动态加载的模:此目录包含已建好可动态加载的模块。块。lfs:Linux支持的文件系统代码。不同的文件系支持的文件系统代码。不同的文件系统有不同的子目录对应,如统有不同的子目录对应,如ext2文件系统对应文件系统对应的就是的就是ext2子目录。子目录。lkernel:主要核心代码。