嵌入式操作系统课件2016嵌入式linux_第1页
嵌入式操作系统课件2016嵌入式linux_第2页
嵌入式操作系统课件2016嵌入式linux_第3页
嵌入式操作系统课件2016嵌入式linux_第4页
嵌入式操作系统课件2016嵌入式linux_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4 4章章 嵌入式嵌入式LinuxLinux的构建的构建2主要内容主要内容4.1 嵌入式嵌入式Bootloader技术技术4.2 嵌入式根文件系统构建嵌入式根文件系统构建4.3 Linux内核及启动流程内核及启动流程4.4 基于基于ARM目标板的目标板的Linux系统及应用程序烧定系统及应用程序烧定建立交叉编译环境建立交叉编译环境启动代码启动代码Bootloader的实现的实现/移植移植kernel的配置的配置/移植移植/编译编译根文件系统根文件系统Cramfs的实现的实现嵌入式开发流程嵌入式开发流程44.1 嵌入式嵌入式BootLoader技术技术Bootloader的概念的概念Boot

2、loader引导程序引导程序Vivi简介简介Vivi代码分析代码分析5Bootloader的概念的概念 BootLoader称为引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。也就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通常,BootLoader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader 几乎是不可能的。尽管如此,我们仍然可以对BootLoader 归纳出一些通

3、用的概念来,以指导用户特定的BootLoader 设计与实现。引导加载程序引导加载程序可以初始化硬件可以初始化硬件设备、建立内存空间的映射图设备、建立内存空间的映射图6嵌入式系统离不开嵌入式系统离不开Bootloader 每种CPU 体系结构都有不同的BootLoader。 有些BootLoader 也支持多种体系结构的CPU,比如U-Boot 就同时支持ARM 体系结构和MIPS 体系结构。 除了依赖于CPU 的体系结构外,BootLoader 实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU 而构建的,要想让运行在一块板子上的Bo

4、otLoader 程序也能运行在另一块板子上,通常也都需要修改BootLoader 的源程序。7BootLoader 的安装媒介的安装媒介 系统加电或复位后,所有的CPU 通常都从某个由CPU 制造商预先安排的地址上取指令。比如,基于ARM7TDMI core 的CPU 在复位时通常都从地址0 x00000000 取它的第一条指令。 基于CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行BootLoader 程序。8典型存储空间分配结构典型存储空间分配结构bootloaderbo

5、otloader启动参数内核根文件系统9Bootloader空间结构划分空间结构划分10控制控制BootLoader 的设备或机制的设备或机制 主机和目标机之间一般通过串口建立连接,BootLoader 软件在执行时通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。11BootLoader 的操作模式的操作模式 大多数BootLoader 都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。 最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。12启动加载模式

6、启动加载模式 也称为也称为“自主自主”(Autonomous)模式。也即)模式。也即BootLoader 从目标机上的某个固态存储设备上将操作从目标机上的某个固态存储设备上将操作系统加载到系统加载到RAM 中运行,整个过程并没有用户的介入。中运行,整个过程并没有用户的介入。这种模式是这种模式是BootLoader 的正常工作模式,因此在嵌入的正常工作模式,因此在嵌入式产品发布的时侯,式产品发布的时侯,BootLoader 显然必须工作在这种显然必须工作在这种模式下。模式下。13下载模式下载模式 在这种模式下,目标机上的在这种模式下,目标机上的BootLoader 将通过串口连接或网络连将通过串

7、口连接或网络连接等通信手段从主机下载文件,比如:下载内核映像和根文件系接等通信手段从主机下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被统映像等。从主机下载的文件通常首先被BootLoader 保存到目标保存到目标机的机的RAM 中,然后再被中,然后再被BootLoader 写到目标机上的写到目标机上的FLASH 类类固态存储设备中。固态存储设备中。 Boot Loader 的这种模式通常在第一次安装内核与根文件系统时的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用被使用;此外,以后的系统更新也会使用BootLoader的这种工作的这种

8、工作模式。工作于这种模式下的模式。工作于这种模式下的BootLoader 通常都会向它的终端用户通常都会向它的终端用户提供一个简单的命令行接口。提供一个简单的命令行接口。14下载模式下载模式 像像vivi 、 RedBoot或或U-Boot等功能强大的等功能强大的Bootloader通通常都可同时支持这两种工作模式,而且允许用户在这常都可同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。两种工作模式之间进行切换。 比如,比如,RedBoot在启动时处于正常的启动加载模式,在启动时处于正常的启动加载模式,但是它会延时但是它会延时3秒等待终端用户按下任意键而将秒等待终端用户按下任意

9、键而将RedBoot切换到下载模式。如在等待时间内没有接收切换到下载模式。如在等待时间内没有接收到用户按键,则继续启动到用户按键,则继续启动 Linux 内核。内核。15BootLoader 与主机如何通信?与主机如何通信? 最常见的情况就是,目标机上的最常见的情况就是,目标机上的BootLoader 通过串口通过串口与主机之间进行文件传输,传输协议通常是与主机之间进行文件传输,传输协议通常是xmodemymodemzmodem 协议中的一种。协议中的一种。 但是,串口传输的速度比较慢,因此通过以太网连接但是,串口传输的速度比较慢,因此通过以太网连接并借助并借助TFTP 协议来下载文件是个更好

10、的选择。协议来下载文件是个更好的选择。16BootLoader启动过程启动过程 大多数大多数BootLoader 都分为都分为stage1 和和stage2 两大部分。两大部分。 依赖于依赖于CPU 体系结构的代码,比如设备初始化代码等,体系结构的代码,比如设备初始化代码等,通常都放在通常都放在stage1 中,而且通常都用汇编语言来实现,中,而且通常都用汇编语言来实现,以达到短小精悍的目的。以达到短小精悍的目的。 而而stage2 则通常用则通常用C语言来实现,这样可以实现复杂语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。的功能,而且代码会具有更好的可读性和可移植

11、性。17Stage1 通常包括以下步骤通常包括以下步骤(以执行的先后顺序以执行的先后顺序):硬件设备初始化(如屏蔽中断,设置硬件设备初始化(如屏蔽中断,设置CPU时钟频率等)。时钟频率等)。为加载为加载BootLoader 的的stage2 准备准备RAM 空间。空间。拷贝拷贝BootLoader 的的stage2 到到RAM 空间中。空间中。设置好堆栈。设置好堆栈。跳转到跳转到stage2 的的C 入口点。入口点。18硬件设备初始化硬件设备初始化 屏蔽所有的中断 为中断提供服务通常是 OS 设备驱动程序的责任,因此在 BootLoader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过

12、写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。 设置 CPU 的速度和时钟频率 RAM 初始化 包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。 初始化 LED 典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK 还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 BootLoader 的 Logo 字符信息来完成这一点。 关闭 CPU 内部指令数据 cache19为加载为加载 stage2 准备准备 RAM 空间空间 由于由于 stage2 通常是通常是 C 语言执行代码,因此在

13、考虑空间大语言执行代码,因此在考虑空间大小时,除了小时,除了 stage2 可执行映象的大小外,还必须把堆栈可执行映象的大小外,还必须把堆栈空间也考虑进来。空间也考虑进来。 空间大小最好是内存页大小空间大小最好是内存页大小(通常是通常是 4KB)的倍数。的倍数。 一般而言,一般而言,1M 的的 RAM 空间已经足够了。空间已经足够了。 具体的地址范围可以任意安排。但是,将具体的地址范围可以任意安排。但是,将 stage2 安排到整安排到整个个 RAM 空间的最顶空间的最顶 1MB(也即也即 (RamEnd-1MB) - RamEnd)是一种值得推荐的方法是一种值得推荐的方法 20拷贝拷贝 st

14、age2 到到 RAM 中中 需要考虑:需要考虑: stage2 的可执行映象在固态存储设备的存放起始地址的可执行映象在固态存储设备的存放起始地址和终止地址;和终止地址; RAM 空间的起始地址。空间的起始地址。 21设置堆栈指针设置堆栈指针 堆栈指针的设置是为了执行堆栈指针的设置是为了执行 C 语言代码作好准备。语言代码作好准备。 22跳转到跳转到 stage2 的的 C 入口点入口点 23Stage2通常包括以下步骤通常包括以下步骤(以执行的先后顺序以执行的先后顺序):初始化本阶段要使用到的硬件设备。初始化本阶段要使用到的硬件设备。检测系统内存映射检测系统内存映射(memory map)。

15、将将kernel 映像和根文件系统映像从映像和根文件系统映像从flash 上读到上读到RAM 空空间中。间中。为内核设置启动参数。为内核设置启动参数。调用内核。调用内核。24Stage2 stage2 的代码通常用的代码通常用 C 语言来实现,以便于实现更复语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。杂的功能和取得更好的代码可读性和可移植性。 但是与普通但是与普通 C 语言应用程序不同的是,在编译和链接语言应用程序不同的是,在编译和链接 bootloader 这样的程序时,不能使用这样的程序时,不能使用 glibc 库中任何支库中任何支持函数。持函数。 25Stage2

16、-初始化本阶段要使用到的硬件设备初始化本阶段要使用到的硬件设备 p 初始化至少一个串口,以便和终端用户进行初始化至少一个串口,以便和终端用户进行 I/O 输出输出信息信息p 初始化计时器等。初始化计时器等。 p 设备初始化完成后,可以输出一些打印信息,程序名设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。字字符串、版本号等。26Stage2-检测系统的内存映射检测系统的内存映射p 内存映射就是指在整个内存映射就是指在整个4GB 物理地址空间中有哪些地物理地址空间中有哪些地址范围被分配用来寻址系统的址范围被分配用来寻址系统的 RAM 单元。单元。 p 通常通常CPU预留一大段足

17、够的地址空间给系统的预留一大段足够的地址空间给系统的RAMp 嵌入式系统却不一定实现嵌入式系统却不一定实现CPU预留的全部预留的全部RAM空间,空间,即嵌入式系统往往只把即嵌入式系统往往只把CPU预留的全部预留的全部RAM地址空间地址空间中的一部分映射到中的一部分映射到RAM空间,而让剩余部分处于未使空间,而让剩余部分处于未使用状态。如用状态。如S3C2410使用的使用的RAM空间为空间为0 x30000000-0 x33ffffff。27地址空间描述地址空间描述Typedef struct memory_area_struct u32start;/*the base address of t

18、he memory region*/ u32size; /*the byte number of the memory region*/ int used;memory_area_t;Used = 1 说明某段地址被使用说明某段地址被使用Used = 0 说明某段地址并未被使用说明某段地址并未被使用28Stage2-加载内核映像和根文件系统映像加载内核映像和根文件系统映像 规划内存占用的布局规划内存占用的布局内核映象所占用的内存范围内核映象所占用的内存范围一般将其拷贝到(一般将其拷贝到(MEM_START+0 x8000)地址开始的)地址开始的大约大约1MB大小的空间,内核一般小于大小的空间,

19、内核一般小于1M根文件系统所占用的内存范围根文件系统所占用的内存范围一般将其拷贝到(一般将其拷贝到(MEM_START+0 x0010,0000)地址)地址开始的地方开始的地方29Stage2-加载内核映像和根文件系统映像加载内核映像和根文件系统映像从从flash上拷贝上拷贝ARM CPU一般从统一的内存地址空间寻址一般从统一的内存地址空间寻址flash等固态存等固态存储设备,从储设备,从flash上读取和从上读取和从RAM中读取方式相同。中读取方式相同。示例:示例:While(count) *dest+=*src+;/*they are all aligned with the word b

20、oundary*/ count =4;/*byte number*/30Stage2-设置内核的启动参数设置内核的启动参数p Linux2.4.x之后的内核都采用标记列表(之后的内核都采用标记列表(tagged list)的形式)的形式来传递启动参数来传递启动参数p 启动参数标记列表以标记启动参数标记列表以标记ATAG_CORE开始,以标记开始,以标记ATAG_NONE结束结束p 数据结构数据结构tag以及以及tag_header在在linux的源码的源码Include/asm/setup.h 中定义中定义31Setup.h/*the list end with an ATAG_NONE no

21、de*/#define ATAG_NONE 0 x00000000Struct tag_header u32 size;/*size以字数为单位以字数为单位*/ u32 tag;32TagStruct tag struct tag_header hdr; union struct tag_corecore; struct tag_mem32mem; struct tag_videotext videotext; struct tag_cmdline cmdline; 33需要设置的需要设置的tag嵌入式嵌入式Linux系统中,通常需要系统中,通常需要bootloader设置的常见启设置的常见启

22、动参数有:动参数有:ATAG_CORE, ATAG_MEM, ATAG_CMDLINE, ATAG_RAMDISK, ATAG_INITRD34Tag举例举例ATAG_RAMDISK示例示例Params-hdr.tag = ATAG_RAMDISK;Params-hdr.size = tag_size(tag_ramdisk);Params-u.ramdisk.start = 0;Params-u.ramdisk.size = RAMDISK_SIZE;Params-u.ramdisk.flags = 1;ATAG_NONE示例示例Static void setup_end_tag(void)

23、 Params-hdr.tag = ATAG_NONE; Params-hdr.size = 0;35调用内核调用内核p Bootloader调用内核的方法是直接跳转到内核第一条指令处。p 对于ARM Linux,在跳转之前必须满足下列条件p CPU寄存器的设置p R00p R1机器类型IDp R2启动参数标记列表在RAM中的起始地址p CPU模式p 必须禁止中断(IRQ与FIQ)p CPU必须为SVC模式p Cache和MMU的设置p MMU必须关闭p 数据Cache必须关闭36嵌入式系统嵌入式系统Bootloader1、vivivivi是韩国是韩国Mizi公司开发的公司开发的Bootloa

24、der,适用于,适用于ARM9处理器。处理器。2、RedBoot RedBoot也称作红帽也称作红帽(Red Hat)嵌入式调试引导程序,是一种嵌入式调试引导程序,是一种用于嵌入式系统的独立开放源代码引导用于嵌入式系统的独立开放源代码引导/装载器。装载器。3、U-Boot UBoot(Universal Bootloader)是一款目前功能较为强大的)是一款目前功能较为强大的开源开源Bootloader程序,它支持多种处理器平台,包括程序,它支持多种处理器平台,包括ARM、MIPS等。等。 37vivi简介简介p vivi是由韩国mizi公司为ARM处理器系列设计的一个bootloader。它

25、同样支持启动加载模式和下载工作模式。p 在下载模式下,vivi为用户提供一个命令行人机接口,通过这个人机接口可以使用vivi提供的一些命令。如果嵌入式系统没有键盘和显示,那么可以利用vivi中的串口,将其和宿主机连接起来,利用宿主机中的串口软件(如windows中的超级终端或者Linux中的minicom)来控制。 38VIVIVIVI有如下作用:有如下作用:把内核把内核(kernel)(kernel)从从flashflash复制到复制到RAMRAM,然后启动它;,然后启动它;初始化硬件;初始化硬件;下载程序并写入下载程序并写入flashflash(通常由串口或者网口先把内核下(通常由串口或者

26、网口先把内核下载到载到RAMRAM中,然后写入中,然后写入flashflash););检测目标板(检测目标板(bootloaderbootloader会有一些简单的代码用以测试会有一些简单的代码用以测试目标板硬件的好坏)。目标板硬件的好坏)。vivi简介39pVIVI的命令的命令p(1)load命令命令p将二进制文件载入到将二进制文件载入到Flash或者或者RAM,命令格式:,命令格式:pload | p其中命令行参数其中命令行参数描述装载位置,有描述装载位置,有flash和和ram两种选项;参数两种选项;参数 或或 描述装载的地址,如果有已经定义描述装载的地址,如果有已经定义的的mtd分区信

27、息,可以只输入分区名称,否则需要指分区信息,可以只输入分区名称,否则需要指定地址和大小;参数定地址和大小;参数 确定文件的传输协议,确定文件的传输协议,常采用的选项常采用的选项“x”用来指定采用用来指定采用xmodem协议。协议。40例如:例如:vivi load flash kernel x 装载压缩映像文件装载压缩映像文件zImage到到flash存储器中,地址是存储器中,地址是kernel分区,并采用分区,并采用xmodem传输协议。传输协议。也可以指定地址和大小,也可以指定地址和大小,例如:例如:vivi load flash 0 x80000 0 xc0000 x。 41(2)par

28、t命令命令操作操作MTD分区信息,比如,显示、增加、分区信息,比如,显示、增加、删除、复位、保存删除、复位、保存MTD分区等。分区等。part show:显示:显示mtd分区信息。分区信息。part add :增加新的增加新的mtd分区,其中分区,其中为新为新mtd分分区名称,区名称,是是mtd器件的偏移,器件的偏移,表示表示mtd分区的大小,分区的大小,表示分区类型,表示分区类型,可选项有可选项有JFFS2、LOCKED和和BONFS。part del :删除一个:删除一个mtd分区。分区。part reset:恢复:恢复mtd 分区为默认值。分区为默认值。part save:在:在flas

29、h中永久保存参数值和分中永久保存参数值和分区信息。区信息。42(3)param命令命令用来设置或者察看参数。用来设置或者察看参数。例如:改变引导程序启动的时间,使用例如:改变引导程序启动的时间,使用vivi param set boot_delay 100000实现。实现。43(4)boot命令命令用来引导存储在用来引导存储在flash存储器或者存储器或者ram中的中的linux内内核。命令格式:核。命令格式:boot | 参数参数 设定存储设定存储linux内核映像的位置,内核映像的位置,可选项有可选项有ram、nor和和smc。参数参数 或或 描述存储内描述存储内核的地址,如果有提前定义的

30、核的地址,如果有提前定义的mtd分区信息,可以只分区信息,可以只输入分区名称,否则需要指定地址和大小。输入分区名称,否则需要指定地址和大小。例如:例如:vivi boot nor 0 x80000表示从表示从flash存储器中存储器中读出读出linux内核,偏移是内核,偏移是0 x80000。44(5)flash命令命令存储器管理命令存储器管理命令 例如:例如:flash erase | 表示擦除表示擦除flash存储器。存储器。45如何进入如何进入vivi界面界面1、进行硬件连接连接电源,将5V电源线的连到UP-NETARM2410-S的电源接口;连接串口线,一端连接PC的串口,另一端连接到

31、UP-NETARM2410-S的串口(上面的);连接网线,将随机附带的交叉网线把UP-NETARM2410-S靠近于电源接口的网口和PC机的网口连接好。 如何进入如何进入vivi界面界面2、进入宿主机中的串口软件:windows中的超级终端/Linux中的minicom运行Windows系统下(以WindowsXP为例)开始所有程序附件通讯超级终端(HyperTerminal)。请大家注意:在windows xp操作系统下,当初次建立超级终端的时候,会出现如下对话框,请在中打上,并选择“否” 如何进入如何进入vivi界面界面新建一个通信终端。如果要求输入区号、电话号码等信息请随意输入,出现如图

32、5.2.1所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。单击“确定”按钮。 图5.2.1 创建超级终端 如何进入如何进入vivi界面界面选择ARM开发平台实际连接的PC机串口(如COM1),按确定后出现如图5.2.2所示的属性对话框,设置通信的格式和协议。这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。图5.2.2设置串行口 如何进入如何进入vivi界面界面完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。用串口线将PC机串口和平台正确连接后,就可以在超级终端上看到程序输出的信息了.如何进入如何进入

33、vivi界面界面3、打开电源开关,系统会由VIVI开始引导。正常启动时会显示启动信息到“Press Return to start the LINUX now, any other key for vivi”,不进行任何操作等待30S或按回车则启动进入linux系统,按除回车键外的其它键则进入vivi控制台,如图5.3.1。在这里输入“boot”,进入LINUX系统;输入“bootucos”进入ucos系统。 图5.3.1 vivi控制台 输入“boot”后会引导kernel,启动linux系统,见5.3.2. 在该应用程序目录下,可以挂载nfs文件系统,通过“ls”查看应用程序53p viv

34、i的文件结构p vivi包括下面几个目录:p(1)arch:此目录包括了所有VIVI支持的目标板的子目录,本书附带的代码中只包含S3C2410X。p(2)Documentation:存放了许多文档,包括VIVI使用指南。p(3)drivers:其中包括了引导内核所需的MTD设备和串口驱动程序(目标板的各种设备驱动程序)。MTD目录下分maps、nand和nor三个目录,实现对Nand Flash和Nor Flash的读写控制。Serial目录下的文件实现对串口的控制,并支持xmodem和ymodem协议。54(4)include:头文件的公共目录,其中的S3C2410.h定义了处理器的一些寄存

35、器,以及NAND Flash的一些寄存器等。Platform/smdk2410.h定义了与目标板相关的资源配置参数,修改波特率、引导参数和物理内存映射等参数即可配置目标板。(5)init:此目录只有main.c和version.c两个文件。与普通的C程序一样,VIVI将从main函数开始执行(vivi第二阶段的入口函数),main函数调用lib下的函数实现第二阶段工作。(6)lib:一些平台公共的接口代码,比如,time.c里的udelay()和mdelay(), 第二阶段的初始化代码和vivi常用命令的实现。(7)scripts:此目录存放了配置所需的脚本文件,如Menuconfig和Con

36、figure文件,以方便对VIVI的配置。 (8)test:存放一些测试代码文件。(9)util:存放与NAND Flash烧写image相关的工具实现代码55p vivi的配置和编译的配置和编译pvivi的配置和嵌入式的配置和嵌入式Linux内核一样,可以采内核一样,可以采用菜单化的形式进行。其步骤主要如下:用菜单化的形式进行。其步骤主要如下:p #make distclean。清除一些早先生成的无。清除一些早先生成的无用的目标文件。用的目标文件。p #make menuconfig。然后可以根据菜单中。然后可以根据菜单中的信息进行配置。的信息进行配置。p #make 命令开始编译。菜单配置

37、完毕后,命令开始编译。菜单配置完毕后,保存退出,然后用保存退出,然后用make命令编译。命令编译。p56vivi代码分析vivi的第一阶段主要完成了依赖于CPU的体系结构硬件初始化,包括禁止中断、初始化串口、复制第二阶段到RAM中等。由于这些代码是和硬件紧密相关的,因此要求大家在阅读时需要对照S3C2410处理器的数据手册,查阅相关的寄存器的描述,以便更好地理解。这些汇编代码全部就集中在viviarchs3c2410目录下的head.S这一个汇编文件中,当然还有相关的头文件。vivi的第二阶段的入口就是init/main.c,按照源代码的组织流程,根据模块化划分的原则,共分为8个功能模块即八个

38、步骤,在源代码的注释中以step非常清晰的给出了区分。 第一步:vivi从main()函数开始执行,函数开始通过 putstr(vivi_bannner)打印出vivi的版本。 第二步:对开发板初始化board_init函数,主要完成时钟初始化(init_time())和通用I/O口设置(set_gpios(),在/arch/s3c2410/smdk.c中vivi代码分析int board_init(void)init_time();set_gpios();return 0;58第三步:进行内存映射初始化和内存管理单元(MMU)的初始化工作,在mmu.c文件中。第四步:初始化堆,函数heap_

39、init()定义在libheap.c文件中。第五步:初始化mtd设备,用mtd_dev_init()函数第六步:配置参数,主要是init_priv_data函数。 第七步:提供vivi人机接口的各种命令。 第八步:进入Bootloader的两种模式之一。vivi代码分析Bootloader(vivi) 的烧写和使用的烧写和使用linux系统的移植主要包括四个部分:烧写2410S linux 操作系统包括烧写vivi,kernel,root三个步骤,除此我们还要烧写yaffs.tar,这四个文件为: vivi -linux操作系统启动的bootloader; zImage-linux操作系统内核

40、; root.cramfs-根文件系统; yaffs.tar-应用程序 烧写烧写Vivi既可通串口烧写也可通过既可通串口烧写也可通过jtag来烧写;来烧写;zImage和和root.cramfs通过串口来烧写;通过串口来烧写;应用程序压缩包通过网口来下载。应用程序压缩包通过网口来下载。Bootloader(vivi) 的烧写的烧写vivi的烧写有两种方式:通过JTAG口烧写和通过串口烧写。 在Flash被格式化且内存里也没有Bootloader的时候,此时目标板是一个完全干净的开发板,就需要通过JTAG口把Bootloader烧写到板子上串口烧写主要用于更新和升级Bootloader。在Win

41、dows下可以通过超级终端来访问目标板来进行烧写,在Linux下可以通过MiniCom烧写。 板子上没有任何东西(包括BootLoader)的时候,需要专门的工具对vivi等BootLoader进行烧写Bootloader举例举例手册第9-19页板子上有诸如vivi等BootLoader后,再进行升级,就可以利用Target上已经存在的(旧的)BootLoader了Bootloader举例举例4.3.2 Bootloader 的使用的使用工作正常的时候工作正常的时候,Bootloader处于加载模式或者交互模式处于加载模式或者交互模式如使用如使用vivi的时候的时候,其交互模式的界面是其交互模

42、式的界面是利用vivi升级内核Bootloader举例举例利用vivi升级文件系统Bootloader举例举例674.3 Linux内核及启动过程内核及启动过程Linux内核结构内核结构Linux内核配置、编译内核配置、编译Linux内核移植内核移植68 Linux系统实际上由两个比较独立的部分组成,即内核部系统实际上由两个比较独立的部分组成,即内核部分和系统部分(根文件系统)。分和系统部分(根文件系统)。 启动时,首先由启动时,首先由BootLoader程序将程序将Linux部分内核调入部分内核调入内存,并将控制权交给内存中内存,并将控制权交给内存中Linux内核的第一行代码。内核的第一行代

43、码。然后然后Linux将自己的剩余部分全部加载到内存、初始化所将自己的剩余部分全部加载到内存、初始化所有的设备、在内存中建立好所需的数据结构(有关进程、有的设备、在内存中建立好所需的数据结构(有关进程、设备、内存等)。此时内核已经控制了所有硬件设备,设备、内存等)。此时内核已经控制了所有硬件设备,内核加载完成。内核加载完成。 至于操作和使用这些硬件设备,则是系统部分任务。至于操作和使用这些硬件设备,则是系统部分任务。 内核部分初始化并控制大部分硬件设备,为内存管理、内核部分初始化并控制大部分硬件设备,为内存管理、进程管理、设备读、写等工作做好一切准备;系统部分进程管理、设备读、写等工作做好一切

44、准备;系统部分加载必需的设备,配置各种环境以便用户可以使用整个加载必需的设备,配置各种环境以便用户可以使用整个系统。系统。69p Linux内核主要由五个子系统组成:进程调度,内存管理,内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。虚拟文件系统,网络接口,进程间通信。p 进程调度(进程调度(SCHED):控制进程对):控制进程对CPU的访问。的访问。Linux使用比较简单的基于优先级的进程调度算法选择新的进使用比较简单的基于优先级的进程调度算法选择新的进程。程。p 内存管理(内存管理(MM):允许多个进程安全地共享主内存区):允许多个进程安全地共享主内存区域

45、。域。Linux的内存管理支持虚拟内存。的内存管理支持虚拟内存。p 虚拟文件系统(虚拟文件系统(Virtual File System,VFS):隐藏了各):隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。(分为逻辑文提供了多达数十种不同的文件系统。(分为逻辑文件系统和设备驱动程序)件系统和设备驱动程序)p 网络接口(网络接口(NET):提供了对各种网络标准的存取和各):提供了对各种网络标准的存取和各种网络硬件的支持(网络协议和网络驱动程序)。种网络硬件的支持(网络协议和网络驱动程序)。p 进程间通讯

46、(进程间通讯(IPC):支持进程间各种通信机制。):支持进程间各种通信机制。Linux内核结构内核结构Linux内核结构内核结构-Linux源码位置源码位置71p Linux内核目录结构内核目录结构p /include子目录包含了建立内核代码时所需的大部分包含子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。文件,这个模块利用其他模块重建内核。p /init子目录包含了内核的初始化代码,这是内核工作的子目录包含了内核的初始化代码,这是内核工作的开始的起点。开始的起点。p /arch子目录包含了所有硬件结构特定的内核代码。如:子目录包含了所有硬件结构特定的内核代码。如

47、:arm、i386、alpha。p /drivers子目录包含了内核中所有的设备驱动程序,如块子目录包含了内核中所有的设备驱动程序,如块设备和设备和SCSI设备。设备。p /fs子目录包含了所有的文件系统的代码,如:子目录包含了所有的文件系统的代码,如:ext2,vfat等。等。p /net子目录包含了内核的连网代码。子目录包含了内核的连网代码。p /mm子目录包含了所有内存管理代码。子目录包含了所有内存管理代码。p /ipc子目录包含了进程间通信代码。子目录包含了进程间通信代码。p /kernel子目录包含了主内核代码。子目录包含了主内核代码。Linux内核结构内核结构72p Linux内核

48、配置系统的组成内核配置系统的组成p Makefile(顶层(顶层Makefile和子目录下的和子目录下的Makefile)p 配置文件配置文件p .config文件,包含由用户选择的配置选项,用来存放内文件,包含由用户选择的配置选项,用来存放内核配置后的结果。核配置后的结果。p Rules.make:规则文件,被所有的:规则文件,被所有的 Makefile 使用。使用。p 配置工具配置工具p 基于字符的界面基于字符的界面 make config :进入命令行,可以一行:进入命令行,可以一行一行的配置,但使用不十分方便。一行的配置,但使用不十分方便。p 基于基于 Ncurses 的文本模式图形用

49、户界面的文本模式图形用户界面make menuconfig:大多数开发人员使用的大多数开发人员使用的Linux 内核编译菜单,使用方便。内核编译菜单,使用方便。p 基于基于 Xwindows 图形界面的用户配置界面图形界面的用户配置界面make xconfig:在在2.4.X 以及以前版本中以及以前版本中xconfig 菜单是基于菜单是基于TCL/TK 的的图形库的。图形库的。Linux内核配置(裁剪)、编译内核配置(裁剪)、编译o Make menuconfig的图形配置界面 74p Linux内核配置与裁减内核配置与裁减p 下载下载Linux内核源码到内核源码到/usr/src目录下目录下

50、p 解压该文件解压该文件p 进入进入/usr/src/linux-2.x.xx目录,执行目录,执行make menuconfig命命令就可以进入配置界面。令就可以进入配置界面。p 在启动配置菜单后,选择相应的配置时,有三种选择方在启动配置菜单后,选择相应的配置时,有三种选择方式,它们分别代表的含义如下。式,它们分别代表的含义如下。p N不将该功能编译进内核不将该功能编译进内核p Y将该功能编译进内核将该功能编译进内核p M将该功能编译成可以在需要时动态插入到内核中将该功能编译成可以在需要时动态插入到内核中的模块的模块Linux内核配置编译内核配置编译75pLinux内核编译内核编译p在完成内核

51、的裁减之后,内核的编译就只要在完成内核的裁减之后,内核的编译就只要执行以下几条命令:执行以下几条命令:pmake dep:对内核原代码的文件进行完整性和:对内核原代码的文件进行完整性和依赖性进行检验,确保关键文件在正确的位置。依赖性进行检验,确保关键文件在正确的位置。pmake clean:编译内核之前先把环境给清理干净。:编译内核之前先把环境给清理干净。有时也可用有时也可用make realclean 或或make mrproper 来来彻底清除相关依赖,保证没有不正确的彻底清除相关依赖,保证没有不正确的.o 文件存文件存在。在。pmake zImage:创建内核镜像文件:创建内核镜像文件p

52、make modules:创建内核模块,若不创建内核:创建内核模块,若不创建内核模块,这步可以不要。模块,这步可以不要。Linux内核配置编译76p Linux移植pLinux 移植其实质是获取某一版本的Linux 内核源码,根据具体目标平台对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动,打造一款适合于目标平台的新操作系统,对该系统进行针对目标平台的交叉编译,生成一个内核映象文件,最后通过一些手段把该映象文件烧写(安装)到目标平台中。p 交叉编译环境的搭建p 修改Linux 内核源码plinux 的移植主要包含启动代码的修改,内核的链接及装入,参数传递,内核引导几

53、个部分。p 基于ARM目标板的Linux 内核配置裁减与编译基于基于ARM开发板的开发板的Linux内核移植内核移植774.4 Linux内核及启动过程内核及启动过程JTAG烧写烧写vivi串口下载烧写串口下载烧写应用程序下载到目标板应用程序下载到目标板78UP-NETARM2410-S操作系统由操作系统由vivi(bootloader)、)、zImage(Linux内核映象内核映象)、root.cramfs(根文件系统映象根文件系统映象)三三部分组成,部分组成,vivi即可通串口烧写也可通过即可通串口烧写也可通过jtag来烧写,来烧写,zImage和和root.cramfs通过串口来烧写,应

54、用程序压缩包通通过串口来烧写,应用程序压缩包通过网口来下载。过网口来下载。JTAG烧写,适用于烧写,适用于flash空白或者空白或者vivi损坏无法引导的情况损坏无法引导的情况下,通过并口线和下,通过并口线和Jtag简易仿真器,用简易仿真器,用sjf2410-s.exe将将vivi烧写到烧写到flash中作为引导启动程序。中作为引导启动程序。串口通讯下载,是最常用的烧写方式,即在核心模块上已串口通讯下载,是最常用的烧写方式,即在核心模块上已烧录有烧录有vivi的前提下进入的前提下进入vivi,通过在,通过在SDRAM中运行的中运行的vivi格式化格式化flash,烧写,烧写vivi、内核和根文

55、件系统,最后把应用、内核和根文件系统,最后把应用程序压缩包程序压缩包yaffs.tar.bz2通过网口下载到通过网口下载到Linux系统的系统的/var目录下,然后解压到目录下,然后解压到/mnt/yaffs下。下。794.2 嵌入式嵌入式Linux根文件系统构建根文件系统构建Linux文件系统介绍文件系统介绍根文件系统的目录结构根文件系统的目录结构BusyBox生成工具集生成工具集根文件系统启动流程根文件系统启动流程80文件系统简单说就是一种目录结构,文件系统简单说就是一种目录结构,linux操作系统中的设操作系统中的设备是以文件的形式存在的,将这些文件进行分类管理以备是以文件的形式存在的,

56、将这些文件进行分类管理以及提供和内核交互的接口,就形成文件系统。及提供和内核交互的接口,就形成文件系统。Linux文件系统介绍文件系统介绍81根文件系统是一种特殊的文件系统根文件系统是一种特殊的文件系统, 是内核启动时挂载的第是内核启动时挂载的第一个文件系统。一个文件系统。该文件系统就要包括该文件系统就要包括Linux启动时所必须的目录和关键性的启动时所必须的目录和关键性的文件。例如:文件。例如:Linux启动时都需要有启动时都需要有init目录下的相关文目录下的相关文件,在件,在Linux挂载分区时挂载分区时Linux一定会找一定会找/etc/fstab这个挂这个挂载文件等,根文件系统中还包

57、括了许多的应用程序载文件等,根文件系统中还包括了许多的应用程序bin目目录等。任何包括这些录等。任何包括这些Linux 系统启动所必须的文件都可系统启动所必须的文件都可以称为根文件系统。以称为根文件系统。内核代码的映像文件保存在根文件系统中。内核代码的映像文件保存在根文件系统中。系统引导启动程序会在根文件系统挂载之后从中把一些初系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如始化脚本(如rcS,inittab)和服务加载到内存中去运行。)和服务加载到内存中去运行。根文件系统介绍根文件系统介绍82p Linux支持多种文件系统,支持多种文件系统,包括包括ext2、ext3、vfat

58、、ntfs、iso9660、jffs、romfs和和nfs等,为了对各等,为了对各类文件系统进行统一管理,类文件系统进行统一管理,Linux引入了虚拟文件系引入了虚拟文件系统统VFS(Virtual File System),为各类文件系,为各类文件系统提供一个统一的操作界统提供一个统一的操作界面和应用编程接口。如图面和应用编程接口。如图所示的所示的Linux系统结构。系统结构。Linux文件系统介绍文件系统介绍根文件系统介绍根文件系统介绍Linux启动时,第一个挂载的系统是根文件系统。文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系

59、统的(会出现无法加载文件系统的错误) ,启动成功之后可以自动或手动挂载其他的文件系统。 对比对比linux文件系统和根文件系统的目录结构文件系统和根文件系统的目录结构 Linux 根文件系统嵌入式 Linux 系统的根文件系统/bin:存放二进制可执行命令的目录。/dev:存放设备文件和目录。/etc:存放系统管理和配置文件和目录。/home:用户主目录,比如用户user 的主目录就是/home/user,可以用user 来表示。/lib:存放动态链接共享库的目录。/sbin:存放系统管理员使用的管理程序的目录。/tmp:公用的临时文件存储点。/root:系统管理员的主目录。/mnt:用以临时

60、挂载其他的文件系统。/proc:虚拟文件系统,可直接访问这个目录来获取系统信息。/var:某些大文件溢出区。/usr:存放应用程序和文件。/bin/dev/etc/lib/tmp/mnt /proc/var/usr由于受系统资源的限制,一般没有Linux 根文件系统那么复杂,仅保留一些常用的目录即可,对于嵌入式系统,必须选择一个合适的根文件系统以使系统运行最佳。*嵌入式系统通常都不是针对多用户的根文件系统根文件系统存放二进制文件的目录主要有四个:/bin, /sbin, /usr/bin和/usr/sbin,二进制文件要放在哪个目录,与它在系统中所扮演的角色有很大的关系。如果这个是用于和系统管

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论