1、第8章 构建嵌入式Linux系统l =makefile 开始=myprog:foo.o bar.o gcc foo.o bar.o-o myprog foo.o:foo.c foo.h bar.h gcc-c foo.c-o foo.o bar.o:bar.c bar.h gcc-c bar.c-o bar.o =makefile 结束=第8章 构建嵌入式Linux系统l8.1 嵌入式Linux系统的构建流程l8.2 嵌入式Linux系统的组成l8.3 Bootloaderl8.4 Linux内核的裁剪和编译l8.5 根文件系统8.1 嵌入式Linux系统的构建流程l建立开发环境:交叉编译工具
2、,编译环境等l配置开发主机,配置MINICOMl建立引导装载程序bootloaderl下载别人已经移植好的linux操作系统l建立根文件系统l建立应用程序的flash分区l开发应用程序l烧写内核、根文件系统、应用程序l发布产品第8章 构建嵌入式Linux系统l8.1 嵌入式Linux系统的构建流程l8.2 嵌入式Linux系统的组成l8.3 Bootloaderl8.4 Linux内核的裁剪和编译l8.5 根文件系统嵌入式Linux的组成嵌入式Linux由以下三个部分组成为:lBootloader:系统的引导程序l参数:内核启动时所必需的设置参数l内核:系统内核是系统的核心部分,主要负责进程调
3、度,消息处理等。l根文件系统:Linux内核启动后首先需要加载的文件系统。第8章 构建嵌入式Linux系统l8.1 嵌入式Linux系统的构建流程l8.2 嵌入式Linux系统的组成l8.3 Bootloaderl8.4 Linux内核的裁剪和编译l8.5 根文件系统Bootloader程序原理l引导加载程序是系统加电后运行的第一段软件代码。PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS
4、 BootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。l而在嵌入式系统中,通常并没有像BIOS那样的固件程序,主要使用flash作为系统的存储媒介,很少使用磁盘,整个系统的加载启动任务完全由BootLoader来完成。Bootloader的概念l简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。l通常,BootLoader是严重地
5、依赖于硬件而实现的,特别是在嵌入式应用。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。Bootloader的功能l硬件设备的初始化(CPU的主频、SDRM、中断、串口等)l传递内核启动参数l启动内核l与主机进行交互、从串口、USB口或者下载映像文件、并可以对FLASH等存储设备进行管理Bootloader的安装媒介l系统加电或复位后,处理器从某个预先安排的地址上取指令。比如ARM在复位时,从地址0 x00取指。l嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EPROM或FLASH等),被映射到这个预先安排的地址上,因此在系统加电后,处理器首先执行Bootloa
6、der程序。lBootloader是最先被系统执行的程序嵌入式系统的软件层次结构Bootloader的烧写方式l通过JTAG口l通过以太网口l通过串口Bootloader的控制方式l主机和目标机之间一般通过串口建立连接,Bootloader软件在执行是通常会通过串口来进行通讯,比如:输出打印信息到串口,从串口读取用户控制字符l也可以通过JTAG等其他接口进行通信Bootloader的工作方式l大多数BootLoader都包含两种不同的操作模式。“启动加载”模式 “下载”模式,l这种区别仅对于开发人员才有意义。但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的
7、启动加载模式与下载工作模式的区别。bootloader的引导方式启动加载(Boot Loader)模式:启动加载模式也称为“自主”(Autonomous)模式。在这种情况下,Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。下载(Downloading)模式:在下载模式中,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。比如:下载应用程序、数据文件、内核映像等 从主机下载的文件通常首先被BootLoader保存到目标机的RAM中然后再被BootLoader写到目标机上的固态存储设备
8、中。嵌入式系统的引导模式l根据所使用的存储介质和开发阶段的不同,可以采用不同的系统引导方式 (1)使用可以固化存储设备:产品化阶段 (2)使用磁盘设备 (3)通过网络引导:调试阶段 内核已下载到FLASH设备或磁盘设备上,通过网络挂装根文件系统。内核和根文件系统均通过网络来获取和安装。Bootloader的典型结构框架l由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。lStage1:依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,
9、以达到短小精悍的目的。l stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。Boot Loader 的 stage1l Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):硬件设备初始化。为加载 Boot Loader 的 stage2 准备 RAM 空间。拷贝 Boot Loader 的 stage2 到 RAM 空间中。设置好堆栈。跳转到 stage2 的 C 入口点。Boot Loader 的 stage2 Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬
10、件设备。检测系统内存映射(memory map)。将 kernel 映像和根文件系统映像从 flash 上 读到 RAM 空间中。为内核设置启动参数。调用内核。嵌入式Linux的构建Bootloader的移植的移植几种流行的Lunux BootloaderlU-Boot:较为通用lBLOBlRedBootlVIVI:针对ARM 2410设计 第8章 构建嵌入式Linux系统l8.1 嵌入式Linux系统的构建流程l8.2 嵌入式Linux系统的组成l8.3 Bootloaderl8.4 Linux内核的裁剪和编译l8.5 根文件系统嵌入式Linux的构建pLinux内核配置和编译的流程pLin
11、ux内核配置pLinux内核的编译嵌入式Linux的构建 在嵌入式Linux的构建中,Bootloader和Linux内核一般都有相对成熟的代码。主要的工作有两步:第一步是根据本系统硬件平台的状况进行移植;第二步是采取交叉编译对源代码进行编译,形成运行时需要的映象(Image)文件。第三步是构造根文件系统Linux内核的移植内核的移植 Linux内核的移植内核的移植构造根文件系统 Linux内核的启动并不依赖于根文件系统(rootfs),但是要保证Linux内核的正常运作,还是需要根文件系统的支持。在构建系统的过程中需要为系统生成根文件系统的映像文件,让Linux内核在启动的时候挂接(moun
12、t)根文件系统。Linux终端:命令输入与信息显示Linux内核配置和编译的流程 Linux内核从配置到安装大致有如下步骤:p 配置内核:最常见的命令为 make menuconfigp 建立依赖关系:最常见的命令为 make depp 编译内核:最常见的命令为 make 或 make zImagep 编译内核模块:最常见的命令为 make modulesp 安装内核模块:最常见的命令为 make modules_installp 安装内核:最常见的命令为 make installLinux内核配置和编译的流程 在内核源代码目录下输入“make XXXconfig”等命令之一就可以对内核进行配
13、置:p make config提供了一个命令行界面,然后对每一个内核选项依次询问用户的选择。p make menuconfig提供了一个基于终端curses 的图形界面配置菜单。p make xconfig提供了一个基于GTK 的X Window 图形界面配置菜单。p make oldconfig和make config类似,不过它只提示用户设置之前没有配置过的选项。Linux内核配置和编译的流程 在内核源代码目录下输入“make XXXconfig”等命令之一就可以对内核进行配置:p make config提供了一个命令行界面,然后对每一个内核选项依次询问用户的选择。p make menuc
14、onfig提供了一个基于终端curses 的图形界面配置菜单。p make xconfig提供了一个基于GTK 的X Window 图形界面配置菜单。p make oldconfig和make config类似,不过它只提示用户设置之前没有配置过的选项。make configmake menuconfig make xconfig Linux内核配置 内核都会在配置完后生成一个.config文件,还会产生大量的符号连接和头文件,这些在其余的创建过程中会用到。.config 文件中保存了根据在menuconfig中的选择定义的相应变量,在Linux内核目录下的Makefile文件中将会包含这个文
15、件。重要的内核选项包括:p Code maturity level options(内核成熟级别选项)p Loadable module support(可加载模块支持)p General setup(通用设置)p Memory technology devices(内存技术设备)p Block devices(块设备)p Network device support(网络设备支持)p Character devices(字符设备)p Filesystems(文件系统)p Console drivers(控制台驱动)Linux内核的编译建立内核依赖关系(linux-2.6.x不再需要这个步骤)
16、:#make dep编译内核:#make zImage 或者#make单独地编译内核模块:#make modules 如果编译成功,所生成的内核映像文件将放置在arch/$ARCH/boot目录下,对于ARM 架构来说就是 arch/arm/boot 目录。#make ARCH=arm CROSS_COMPILE=arm-linux-menuconfigARCH=arm 表示目标体系架构是ARM CROSS_COMPILE=arm-linux-表示使用arm-linux-gcc来进行编译第8章 构建嵌入式Linux系统l8.1 嵌入式Linux系统的构建流程l8.2 嵌入式Linux系统的组成
17、l8.3 Bootloaderl8.4 Linux内核的裁剪和编译l8.5 根文件系统8.4 根文件系统pLinux下的文件系统p嵌入式Linux的文件系统介绍pLinux的根文件系统文件系统的概念l文件系统是文件存放在磁盘等存储设备上的组织方法。主要体现在对文件和目录的组织上。l目录提供了管理文件的一个方便而有效的途径。我们能够从一个目录切换到另一个目录,而且可以设置目录和文件的权限,设置文件的共享程度。Linux下的文件系统 在UNIX系统中,文件系统是最基本的资源。最初的UNIX文件系统与系统内核紧密关联在一起,这对于升级或者更换文件系统十分不利。分离系统内核和文件系统可以解决这一问题。
18、在系统内核和文件系统之间制定一个标准的接口而实现的,不同文件结构之间可以通过该接口方便地交换数据。Linux正是使用这种方式,在系统内核和文件系统之间提供了一种标准接口VFS(virtual file system,虚拟文件系统)。Linux支持多种文件系统,包括jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。Linux的根文件系统 Linux 的根文件系统的主要目录:p/bin:包含基本
19、的用户命令工具程序p/sbin:包含基本的系统管理程序p/boot:包含内核映像及启动相关文件p/etc:(excutive time config)包含系统配置文件和脚本p/lib:包含系统库和内核模块p/usr:用户程序及库目录p/home:用户主目录p/root:root 用户主目录p/dev:设备文件目录,目录下的每个文件代表一个设备p/opt:额外软件包所在目录p/mnt:文件系统临时挂装目录p/var:包含运行时改变的文件,例如lock 和log 文件p/proc:内核创建和使用的虚拟文件系统,存放运行时系统信息p/tmp:临时文件目录1.1 文件系统的树状结构文件系统的特性l可写
20、入l可更新:系统重启后保持原先的更改。l掉电可靠性:掉电后可以可靠恢复数据。l可压缩:文件系统的内容可以被压缩,存储时压缩,使用时再解压缩。lRAM启动:使用RAM存放整个文件系统,将该区域作为根文件系统,然后加载到内核中,是基于RAM的文件系统。网络文件系统网络文件系统NFS(Network File System)lNFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。嵌入式Linux的文件系统介绍在嵌入式Linux中
21、,常见的文件系统有以下几种:p EXT2/3(扩展文件系统2/3)p ROMFS(Read Only Memory File System,只读文件系统)p CRAMFS(Compress Read Access Memory File System,压缩只读文件系统)p JFFS2 (Jounaling FlashFilesystem 2,日志文件系统2)p NFS (Net File System,网络文件系统)p YAFFS(Yet Another FlashFile System,另一种FLASH文件系统)Linux下的文件系统文件系统写入可更新掉电可靠性可压缩RAM启动RomfsNoN/AN/ANoNoCRAMFSNoN/AN/AYesNoJFFS2YesYesYesYesNoJFFSYesYesYesNoNoEXT2 over NFTLYesYesNoNoNoEXT3 over NFTLYesYesYesNoNoEXT2 over RAM diskYesNoNoNoYesl作业l 比较Linux下各种文件系统的区别l若有课程结束