陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009
嵌入式Linux开发技术
Embedded Operating Systems 主要内容 一、嵌入式Linux开发综述 二、Linux的配置和编译 三、根文件系统及其制作 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 主要内容 一、嵌入式Linux开发综述 二、Linux的配置和编译 三、根文件系统及其制作 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 一、嵌入式Linux开发综述 建立目标板Linux的基本步骤 开发嵌入式Linux系统最常用的主机类型 主机/目标机的开发体系结构 主机/目标板的调试方式 嵌入式Linux系统的一般架构 嵌入式Linux系统的启动过程 嵌入式Linux系统的引导配置的类型 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 1、建立目标板Linux的基本步骤 建立目标板Linux系统有4个重要的步骤: (1)决定系统组件 Linux具有大量可选软件,应当为目标系统列出必须的功能清单 (2)配置并建立内核 选择合适的Linux内核版本与适当的配置 建立内核 (3)建立根文件系统 (4)设置引导软件与配置 2018/12/4 Embedded Operating Systems
2、开发嵌入式Linux系统最常用的主机类型 通常就是一台安装了某个标准的Linux发行套件的PC机,如Debian、Mandrake、Red Hat等。 需约2、3G或更多的磁盘空间进行嵌入式Linux开发 建议具有128或以上的RAM及交换空间 (2)Unix工作站 由于Linux与Unix非常相似,对Linux适用的通常对Unix也适用 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (3)Windows工作站 许多开发者比较习惯Windows平台,并希望在Windows平台上开发嵌入式Linux系统 Cygwin: 可在Windows平台上建立跨平台开发工具链 VMWare: 可在虚拟环境中执行Linux,并在Linux上进行嵌入式Linux的开发 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 3、主机/目标机的开发体系结构 在嵌入式Linux系统开发中,存在3种主机/目标机开发体系结构 (1)连接式 (2)使用可移动存储设备 (3)独立开发式 2018/12/4 Embedded Operating Systems
(1)连接式 ( the linked setup ) 目标板和主机通过一个物理线路(如串行线或者以太网连接)永久的连接在一起 好处: 目标代码的传送无需 物理存储设备参与, 只需要上述连接就足 够了 在这种方式中,主机 包含了跨平台开发环 境,而目标板则包含了适当的引导加载程序、可用的内核以及最起码的根文件系统 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 另一种做法是,以远程组件来简化目标板的开发工作,例如 通过TFTP下载内核 此外,根文件系统还 可以通过NFS安装, 而不必在目标板中使 用存储介质 还可以使用连接进行 调试 通常使用以太网连接进行下载功能,而使用RS232串口连接进行调试 TFPT: Trivial File Transfer Protocol 小型文件传输协议 比FTP简单 *内核 *根文件系统 下载/NFS NFS: Network File System 网络文件系统 允许访问远程计算机上的文件 2018/12/4 Embedded Operating Systems
(2)使用可移动存储设备, the removable storage setup 主机和目标板之间没有实际的连接。 先由主机将数据写入存储设备,然后将存储设备转接到目标板,并使用该存储设备引导目标板 同样的,在主机上包含了跨平台开发环境。而目标板则只包含了最起码的引导加载程序。其余的组件被存放在可移动存储设备上。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 一种通常的操作方式使用易插拔的flash芯片: 先在主机上使用flash编程器将数据写入芯片, 然后再将该芯片插入目标板上的插座中 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (3)独立开发系统 在这种设置中,目标板是个独立的开发系统,它包含了引导、操作以及开发额外软件所必须的任何软件。 不需要跨平台开发环境, 不必在主机和目标板之间 传送任何数据 适合以PC为主的高级嵌入 式系统的开发 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 4、主机/目标板的调试方式 用来连接目标板与主机进行调试的接口基本上有3种类型: (1)串行线、 (2)网络接口、 (3)特殊的调试硬件 BDM JTAG 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (1)使用串行线进行调试 这是从主机对目标板进行调试的最简单的做法 缺点: 串行连接的速度比较有限 当嵌入式系统中只有一个串行串口, 或者串行连接是嵌入式系统对外唯一的接口, 那么就不可能在对系统调试的同时,以终端仿真器跟系统交互。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (2)使用网络接口进行调试 这种方式与串行线连接相比,可以提供较高的带宽 由于可以在相同的物理网络连接上使用多重网络连接,可以兼顾调试与终端仿真交互 缺点: 无法使用网络连接对Linux内核进行调试。因为网络协议栈本身在Linux内核里。相对而言,内核的调试通常可以通过串行连接来进行 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (3)使用特殊的调试硬件 通常会使用BDM或JTAG接口。 这些接口依靠的是CPU芯片中内嵌的BDM或JTAG特殊功能。 只要将一个特殊的调试器连接到CPU上的JTAG或BDM相关管脚,就可以完全控制CPU的行为。 因此,当遇到新的嵌入式目标板、或者对目标板上的Linux内核进行调试时,通常会使用JTAG和BDM JTAG Joint Test Action Group 联合测试小组 采用IEEE 1149.1,测试存取口和边界扫描标准 BDM Background Debug Mode 背景调试模式 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 5、嵌入式Linux系统的一般架构 如图所示,包含4个部分: (1)硬件 (2)内核 (3)文件系统等 (4)应用程序/库 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (1)硬件 目标板的硬件必须符合 一些要求方能执行Linux系统。 至少32位CPU 一般情况下必须配备MMU(对于 不配备MMU的考虑使用uClinux) RAM容量必须满足系统的需要 一些最起码的I/O能力,以便在线调试 具有某种形式的永久性或网络存储设备以便内核加载及(或)存取根文件系统 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (2)Linux内核 Linux内核是Linux操作系统的中心组件。使用内核的目的是希望以一致的方式管理硬件,以及为用户软件提供高层抽象层。 内核大致可以分成两个部分:底层接口层和高层抽象层 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 底层接口层专属于硬件配置,内核运行其上,并以硬件无关的高层抽象层提供对硬件资源的直接控制。 比如,对于PPC和ARM系统,尽管其寄存器或内存分页的处理方式不同,但却可以使用通用的API来存取内核里高层的组件 通常底层部分会处理CPU特有的操作、架构特有的内存操作以及设备的基本I/O 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (3)文件系统和网络协议等 在Linux内核的底层接口层与高层抽象层之间,内核有时会用到与特定设备上的结构化数据交互的组件,例如文件系统和网络协议。 通常,Linux内核至少需要一个具有合适结构的根文件系统。Linux内核会从中加载第一个应用程序、加载模块并为进程提供工作目录。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (4)应用程序/库 内核上面是应用程序和工具程序。链接库通常与应用程序动态链接在一起 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 6、系统启动过程 在系统启动过程里,有3个主要软件组件参与其中: (1)引导加载程序 (2)内核 (3)Init进程 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (1)引导加载程序 引导加载程序是系统启动过程中执行的第一个软件,它与目标板的硬件有高度的依赖关系。 Linux有许多引导加载程序可用。 引导加载程序在完成底层硬件初始化工作后会接着跳到内核的启动程序代码执行。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (2)内核 内核一开始的启动程序代码会因架构不同而有很大的差异,而且在为C程序代码设置合适的执行环境之前,它会先为自己进行初始化工作。 完成以上工作后,内核会跳到与架构无关的start_kernel函数执行,此函数会初始化高层内核功能,安装根文件系统,以及启动init进程 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 3、Init进程 启动各种应用程序(根据设置) 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 7、引导配置的类型 Linux系统的引导配置与所选用的引导加载程序、它的配置以及主机中软硬件的类型有非常密切的关系。 (1)固态存储媒体 (2)磁盘 (3)网络 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (1)固态存储媒体 固态存储媒体用于存放 最初的引导加载程序 配置参数 内核 根文件系统 嵌入式Linux系统在开发的不同阶段可能会使用不同的引导配置,但大部分在开发完成后使用固态存储媒体 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (2)磁盘 磁盘引导配置方式广泛应用于工作站及服务器中,此时内核和根文件系统位于磁盘上 最初的内核加载程序不是从磁盘上加载,第二个内核加载程序就是直接从磁盘获得内核本身 可以用于嵌入式系统的开发阶段 要求:目标板上能够使用硬盘或者具有模仿硬盘的装置 2018/12/4 Embedded Operating Systems
Embedded Operating Systems (3)网络 网络引导配置方式中,存在两种情况: (1)内核位于固态存储设备上或磁盘上,需要通过NFS安装根文件系统 (2)只有内核加载程序位于目标板的存储设备上,需要通过TFTP下载内核和根文件系统(或NFS) 往往用于开发初期 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 主要内容 一、嵌入式Linux开发综述 二、Linux的配置和编译 三、根文件系统及其制作 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 内核是所有Linux系统软件组成的核心。它的性能对整个系统的性能起决定性作用。如果内核不支持目标板上的某个硬件,那么在目标板上使用这个内核时,这个硬件就不能起作用。 下面讨论如何为一个嵌入式系统准备好一个可用的Linux内核,包括内核的选择、配置、编译和安装。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems Linux内核源代码中的主要子目录 Documentation 内核方面的相关文档。 arch 与体系结构相关的代码。对应于每个 支持的体系结构,有一个相应的目录 如i386、arm、alpha等。每个体系结 构子目录下包含几个主要的子目录: kernel 与体系结构相关的核心代码 mm 与体系结构相关的内存管理代码 lib 与体系结构相关的库代码 include 内核头文件。对每种支持的体系结构 有相应的子目录。 init 内核初始化代码。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems kernel 内核管理代码。 mm 内存管理代码。 ipc 进程间通讯代码。 net 网络部分代码。 lib 与体系结构无关的内核库代码。 drivers 设备驱动代码。每类设备有相应的子 目录,如char、block、net等 fs 文件系统代码。每个支持文件系统有 相应的子目录,如ext2、proc等。 modules 可动态加载的模块。 Scripts 配置核心的脚本文件。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems Linux的配置和编译步骤 Linux内核从配置到安装大致有如下步骤: 清理:make mrproper 配置:make config/menuconfig/xconfig 建立依赖关系:make dep 编译:make或make zImage 安装:make install 但在嵌入式系统开发中,并不总是按照上述步骤 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 1、Linux内核选择 尽管http://www.kernel.org是主要的内核来源,但这里可用的内核版本并不总适用于嵌入式系统 下面列出了针对当前主要嵌入式系统的Linux内核源代码下载地点,通常直接提供了针对某种目标硬件系统的Linux内核版本 处理器系统 合适的内核站点 x86 http://www.kernel.org ARM http://www.arm.linux.org.uk PowerPC http://penguinppc.org MIPS http://www.linux-mips.org M68K http://linux-m68k.org nonMMU的CPUs http://www.uclinux.org 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 为了获得适合目标系统的内核,必须从主要的站点下载内核,还要打上合适的补丁。例如ARM Linux仅仅发布Linux官方内核的补丁。 找到合适的Linux内核版本后,把它下载到某个目录中,解压 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 2、Linux内核的配置 配置有很多种方法,配置过程中有很多选项可选 配置的结果是生成一个.config文件以及大量的符号连接和头文件,用于后续的过程。 .config文件中保存了在配置过程中定义的变量, 在Linux内核目录下的Makefile中将会包含这个文件 2018/12/4 Embedded Operating Systems
Embedded Operating Systems uCLinux的配置和编译 考虑将uCLinux编译后运行到SkyEye平台上 下载源码、建立交叉编译环境 阅读SOURCE文件 配置编译 uCLinux通常以发行版的形式发布,不仅有内核,还提供根文件系统 最新版本:uClinux-dist-20080808,下载(tar.gz格式或者tar.bz2格式) 经实际使用,可以为此版本的GDB/armulator或者skyeye的交叉编译环境为: arm-linux-tools-20061213.tar.gz 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 编译完成之后 准备skyeye.conf 运行 2018/12/4 Embedded Operating Systems
Embedded Operating Systems ARMLinux的配置和编译 考虑将ARM Linux运行到SkyEye模拟平台上: (1)下载源代码,建立交叉编译环境 (2)编译内核 (3)利用busybox生成一个简单的系统文件并且配置根文件系统 (4)配置SkyEye系统信息,使上述生成的内核及操作系统可以在SkyEye中运行 需要自己制作根文件系统 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 准备ARM Linux 早期: 下载标准Linux 的内核源码和ARM Linux,其中ARM Linux 是基于标准Linux内核为ARM 做的补丁 标准Linux的内核源代码 ftp://ftp.kernel.org linux-2.4.18.tar.bz2 ARM Linux的补丁 ftp://ftp.arm.linux.org.uk/pub/armlinux patch-2.4.18-rmk7.bz2 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 解压缩Linux-2.4.18, 解压缩补丁,并对linux-2.4.18打补丁 建立armlinux-2.4.18,将linux目录拷贝到该目录下 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 建立交叉编译环境 下载交叉编译工具 ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain cross-2.95.3.tar.bz2 解压缩到/usr/local/arm目录下 tar –jxf cross-2.95.3.tar.bz2 设置执行路径,在.bashrc中添加 然后,退出控制台,重新启动控制台 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 检查是否建立好交叉编译环境 对arm-linux使用tab键功能 命令:arm-linux-gcc –v 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 配置和编译arm linux 修改Makefile中 目标板体系结构 交叉编译器 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 我们考虑在skyeye上模拟ep7312 下载armlinux4skyeye 解压缩 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 进入armlinux4skyeye installguide.txt 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 为Skyeye模拟的ep7312进行如下修改: linux-2.4.x/drivers/char/Makefile, 增加 obj-$(CONFIG_LCD) += lcd_drv.o obj-$(CONFIG_TOUCH_SCREEN) += skyeye_ts_drv.o linux-2.4.x/drivers/char/Config.in, 增加 tristate 'SkyEye LCD support(for EP7312)' CONFIG_LCD tristate 'SkyEye Touch Screen support(for EP7312)' CONFIG_TOUCH_SCREEN 增加lcd_drv.[ch], lcd_struct.h, skyeye_ts_drv.[ch], ep7312_sys.h files 到 linux/drivers/char/目录中 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 清除,命令: make mrproper make clean 配置,命令 make xconfig 在System Type中选择CLPS711X/EP721X和CLEP7312 在File System中,确保 /proc file system support ROM file system support Second extended fs support 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 在Block Devices选择 RAM disk support Initial RAM disk (initrd) support 在Character devices选择 SkyEye LCD support(for EP7312) SkyEye Touch Screen support(for EP7312) 建立依赖关系并编译,命令 make dep;make 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 检查是否存在编译好的ARM Linux内核 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 缺省编译linux-2.6.26 Make ARCH=arm CROSS_COMPILE=??/arm-linux- s3c2410_defconfig Make ARCH=arm CROSS_COMPILE=??/arm-linux- dep ARCH=arm CROSS_COMPILE=??/arm-linux- zImage 使用交叉编译器arm-linux-tools-20061213.tar.gz 可以编译成功 使用3.4.1的arm-linux交叉编译器会出错。 使用3.3.2的arm-linux交叉编译器一样的错误。 改用uClinux用的那个编译器arm-linux-tools-20061213.tar.gz Make ARCH=arm CROSS_COMPILE=??/arm-linux- memuconfig 为skyeye,在[Device Driver][ Character Driver] [Serial Driver] 中,取消对“8250/16550 and compatible serial support” 的选择 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 主要内容 一、嵌入式Linux开发综述 二、Linux的配置和编译 三、根文件系统及其制作 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 三、建立根文件系统 1、根文件系统的内容及其准备 2、选择根文件系统的格式及其设置 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 根文件系统 Linux内核在系统启动期间进行的最后操作之一就是安装根文件系统。 根文件系统一直都是所有类UNIX系统不可或缺的组件 根文件系统的顶层目录各有其特殊的用法和目的。 其中一部分往往与多用户有关 在嵌入式系统中,这一部分是不必要的 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 根文件系统中的内容由FHS(Filesystem Hierarchy Standard,文件系统层次标准) 制定 制定该标准的组织为FHSG(FHS Group,http://www.pathname.com/fhs/) 2018/12/4 Embedded Operating Systems
虚拟机安装的Linux下的根目录 和romfs下的目录 必要的用户命令(二进制文件) 设备文件和其他特殊文件 在第二层中包含大量的用户应用程序和文件 mount点,用于暂时安装文件系统 root用户主目录 bootloader使用的静态文件 系统配置文件,包括启动文件 监控程序和工具程序所存放的可变数据 附加的软件套件 必要的系统管理员命令 (二进制文件) 用户主目录 必要的链接库 提供内核与进程信息的虚拟文件系统 临时文件 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 建立根文件系统 建立根文件系统, 首先为多用户提供的可扩展环境的所有目录都应该省略 /home,/mnt,/opt,/root 甚至可以不要 /tmp和/var,这要根据实际情况确定 根据引导加载程序和它的配置情况,决定是否需要/boot 下列几个是比较重要的 /bin, /dev, /etc, /lib, /proc, /sbin, /usr /usr和/var这两个顶层目录与根目录非常像,有自己的目录结构 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 容易混淆的几个目录之一 /bin, /sbin, /usr/bin, /usr/sbin 普通用户和超级用户都比较有用的命令放在/bin下 普通用户不使用,只有超级用户比较有用的命令放在/sbin下 不常用的用户命令放在/usr/bin下 不常用的超级用户命令放在/usr/sbin下 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 容易混淆的几个目录之二 /lib, /usr/lib 系统启动需要的以及上述比较有用的命令所需要的库文件通常放在/lib下 所有其他的库文件一般都放在/usr/lib下,有的软件包会在/usr/lib下为自己所需的库文件建立一个专门的目录 例如Perl 5.x安装完后,会产生一个/usr/lib/perl5目录 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 设置根文件系统的目录骨架: 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 根文件系统上的内容包括: 链接库 内核模块 内核映像 设备文件 系统应用程序 系统初始化文件 …… 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 为目标系统准备链接库 1、glibc 2、uClibc 2018/12/4 Embedded Operating Systems
Embedded Operating Systems glibc glibc套件包含若干链接库。主要包含4种类型的文件 实际的共享链接库,文件名为libLIBRARY_NAME-GLIBC_VERSION.so,例如glibc 2.5的数学链接库为libm-2.5.so 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 主修订版本的符号链接,文件名为libLIBRARY_NAME.so.MAJOR_REVISION_VERSION 例如实际的数学链接库libm-2.5.so, 其符号连接的名称为libm.so.6 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 与版本无关的符号链接指向主修订版本的符号链接,用于为需要链接特定链接库的所有程序提供一个通用的条目,与主修订版本号或glibc涉及的版本无关。文件名为libLiBRARY_NAME.so, 例如libm.so指向libm.so.6,libm.so.6指向实际的共享链接库libm-2.2.3.so 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 静态链接库包文件, 文件名格式为 libLIBRARY_NAME.a, 如动态装载库libdl的静 态包文件就是libdl.a 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 我们只需前两种。 其余的文件只有在链接执行文件的时候才会用到,执行应用程序时不需要 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 动态链接器及其符号连接 除了链接库文件,还需要复制动态链接器及其符号连接 动态链接器的文件名,通常叫做 ld-GLIBC_VERSION.so 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 动态链接器的符号链接 对于i386、arm或m68k,通常为 ld-linux.so.MAJOR_REVISION_VERSION 对于MIPS或PPC,则通常为 ld.so. MAJOR_REVISION_VERSION 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 在向目标板的根文件系统实际复制任何 glibc组件前,应先找出应用程序需要哪 些glibc组件。 可以使用ldd命令显示在主机上运行的文件所依赖的库 但是,对将要运行在目标端的命令,ldd可能不行,此时最好使用交叉编译环境提供的相关命令 2018/12/4 Embedded Operating Systems
Embedded Operating Systems uClibc uClibc是glibc的替代品,实现了部分必要的链接库。 网站:http://www.uclibc.org/ 若下载的是源代码,则 make clean make config make CROSS=arm-linux- make PREFIX=<根文件系统目录> install 若下载的是已经编译好的,则需要将库文件拷贝到根文件系统目录下的lib目录中 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 若只拷贝需要的库文件,则需要采用类似glibc的方法找出目标板所依赖的uClibc 一般情况下,为了更好的使用uClibc,需要安装与uClibc相配套的交叉编译工具链,可以到uClibc网站获取帮助,通常需要打补丁 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 准备内核模块和内核映像 为目标系统准备内核模块 如果已经建立好内核模块,就将它们复制到目标板的/lib目录里 为目标系统准备内核映像 这与引导加载程序的能力和配置有关 如果设置成从根文件系统启动内核,就要将内核映像复制到目标板的根文件系统的/boot目录下 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 为目标系统建立设备文件 在Linux根文件系统中,所有的设备文件都放在/dev目录里,下面列出了一些基本的/dev条目 文件名 说明 类型 主设备号 次设备号 权限位 mem 物理内存存取 字符 1 600 null null设备 3 666 zero 以0值字节为数据来源 5 random 随机数产生器 8 644 tty0 当前的虚拟控制台 4 tty1 第一个虚拟控制台 ttyS0 第一个UART串行端口 64 tty 当前的tty设备 console 系统控制台 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 可以使用如下的命令建立上表中的几个条目(需要root权限) -m指明设备访问权限 等等 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 此外,/dev目录下还包含若干必要的符号链接,如 fd/proc/self/fd stdinfd/0 stdoutfd/1 stderrfd/2 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 建立符号链接 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 可以看一下,虚拟机中Linux主机上的 dev目录 下图为用过的romfs的dev目录 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 应用程序 Linux拥有丰富的命令,但是嵌入式Linux并不需要这么多的命令 有两种方法: 选择少量有用的Linux命令 尽可能包含多的命令,但是对命令的功能进行裁减 对于后者,介绍3个有用的套件 BusyBox TinyLogin Embutils 2018/12/4 Embedded Operating Systems
BusyBox: The Swiss Army Knife of Embedded Linux BusyBox目前由Denys Vlasenko来维护 网站:http://www.busybox.net/ 下载:http://www.busybox.net/downloads/ 它把许多常见应用程序缩微版本组合到一个单独的小巧的可执行程序中,一般含有比较少的选项,更小的体积,不过所包含的这些 选项能够提供用户所需要的大部分功能。 能够为任何一个小型或嵌入式系统提供一个相当完整的环境 提供相当程度的模块化功能,很容易为目标板定制 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 在busybox的网站上,称busybox: combines tiny versions of many common UNIX utilities into a single small executable. 可以取代GNU fileutils, shellutils, etc. have fewer options than their full-featured GNU cousins provides a fairly complete environment for any small or embedded system BusyBox has been written with size-optimization and limited resources in mind 模块化、易定制 最新版本 阅读busybox网站上的FAQ 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 例如 下载busybox-1.10.1.tar.bz2 解压缩 tar jvxf busybox-1.10.1.tar.bz2 阅读INSTALL文件。 使用make help可以看到完整的配置和安装选项 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 常规的配置和安装 简单的配置和安装 缺省为针对i386编译 若针对arm,则要指明ARCH和CROSS_COMPILE 经实验,针对arm,使用allnoconfig,ok 若使用defconfig,则会发生错误,需要配合menuconfig把发生错误的模块禁止 make install 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 对于针对i386平台的busybox,可以运行 ./busybox ash 进入busybox的shell界面 对于arm的,要运行在相应的平台上 可以看一下得到的目录 2018/12/4 Embedded Operating Systems
Embedded Operating Systems TinyLogin 网站:http://tinylogin.busybox.net/ 下载:http://tinylogin.busybox.net/downloads/ TinyLogin将许多登录工具放在单个二进制文件中,通常会与BusyBox并用,两者由相同的开发者维护 TinyLogin中的大多数命令要使用root权限执行 关于busybox与tinylogin的关系 听说,新版本的busybox已经包含了tinylogin 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 例 下载tinylogin-1.2 解压缩,然后配置 使用glibc或者uclibc的交叉编译器对其进行编译,例如 在root权限下将tinylogin-1.2安装到根文件系统目录中 3.3.2那个版本是ok的 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 2018/12/4 Embedded Operating Systems
Embedded Operating Systems Embutils 网站:http://www.fefe.de/embutils/ 这是针对主流Unix命令提供的一组经过简化和优化的替代品。目前支持ARM、i386、PPC和MIPS 其维护者与diet libc相同,只能静态链接diet libc 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 定制应用程序 自己的应用程序也要放在根文件系统的某个目录下,这取决于应用程序所拥有的组件数量和类型 如果二进制文件较少,可以考虑放到/bin目录下 如果二进制文件多且复杂并且包含一些数据文件,最好在根文件系统中增加一个单独的目录,例如/project 第二种情况下,通常需要设置PATH环境变量,以便能够找到可执行文件 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 准备系统初始化文件 系统初始化也是Unix系统很重要的一部分,正如我们之前所说,内核的最后一部初始化操作为启动init进程,这个程序负责创建一些其他进程并且启动系统的一些关键组件运行 Init可以看成是所有进程的父亲 在Linux中,init进程模仿了System V的init,这对于嵌入式Linux而言,功能太强大 我们将介绍 标准的system V 初始化 BusyBox初始化 Ubuntu的初始化 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 关于init的进一步说明 事实上,内核并不关心init进程是哪一个,init进程只不过代表了内核在初始化完成后要启动应用程序 我们可以修改启动参数让内核使用我们自己的init init=PATH_TO_YOUR_INIT 缺点在于,这样只能启动我们自己的应用,如果有必要还需要承担标准init的一部分工作,例如启动其他必要的系统组件 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 更进一步,当我们的程序出现异常时,可能导致整个系统的关闭或者重启。在有的情况下,这就是系统所希望的,但在大多数情况下,这样做是无用的。 因此,比较安全的方法就是使用一个真正的init程序 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 标准的system V 初始化 标准的init包在多数Linux发行版本中都能找到,也可以在 ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/ 上找到,目前由Miquel van Soorenburg维护 包含的命令有: halt,init,killall5,last,mesg,runlevel,shutdown,sulogin,utmpdump,以及wall 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 下载到源码之后,首先解压缩,然后使用交叉编译器编译 make CC=arm-linux-gcc 安装到根文件系统中 make BIN_OWNER=“$(id –un)” BIN_GROUP=“$(id –gn)” > ROOT=根文件系统目录 install 由于我们使用当前用户权限,而Makefile默认使用root权限,因此可能会失败,这可以忽略。因为目标系统中不考虑多用户。否则可以在root权限下做。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 若使用root权限,要小心设置ROOT指向目标系统的根文件系统,否则将覆盖主机上的相应程序。由于目标码不同,这将导致系统出错。 安装完init程序后,需要增加/etc/inittab文件,并在/etc/rc.d中增加一些文件 /etc/inittab定义runlevels /etc/rc.d目录定义各个runlevels上运行的服务 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 7个运行级别 运行级别 说明 系统处于halt状态 1 只有一个用户,无需login 2 多用户,无NFS,命令行形式的login 3 完整的多用户模式,命令行形式的login 4 未使用 5 X11,图形界面形式的login 6 系统reboot 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 在大多数主机上,缺省的runlevel为5 在嵌入式系统上,可以设置为1,此时没有访问控制 系统启动之后,我们仍然可以修改runlevel,这就需要在新老init进程之间使用FIFO进行通信 因此需要创建一个FIFO mknod –m 600 根文件系统目录/dev/initctl p 2018/12/4 Embedded Operating Systems
Embedded Operating Systems BusyBox初始化 BusyBox也提供类似init的功能,适合用于嵌入式系统 BusyBox不提供runlevel功能 在我们前面安装的BusyBox中,sbin/init是/bin/busybox的符号链接,因此BusyBox是系统启动后运行的第一个应用程序 BusyBox将调用它的init 2018/12/4 Embedded Operating Systems
Embedded Operating Systems BusyBox的init Init主要执行下列任务 1、初始化init的信号处理函数 2、初始化console控制台 3、解释/etc/inittab文件 4、运行系统初始化脚本,BusyBox缺省使用 /etc/init.d/rcS 5、运行所有inittab的阻塞式命令 6、运行所有inittab中的一次性执行命令 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 完成上述任务之后,init就进入一个死循环,在这个死循环中执行下列任务 1、运行所有必须再生的命令 2、运行所有必须被请求才能响应的命令 在BusyBox初始化console控制台的时候,根据系统的配置进行初始化 如,在启动参数中console=ttyS0,表示使用串口 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 在初始化完console之后,busybox将会检查是否存在etc/inittab,如果没有将会使用缺省的inittab配置 缺省的inittab设置,如 系统重启,系统停止,init重启 还有,在最先的4个虚拟console:tty1~tty4上启动shell 2018/12/4 Embedded Operating Systems
Embedded Operating Systems Inittab文件的格式 Inittab文件中每一行有下列格式 id:runlevel:action:process 在busybox中, id代表tty的序号 忽略runlevel Process说明要运行的程序的路径和命令选项 Action说明process的执行方式 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 8种执行方式 sysinit:提供init的路径 respawn:每当一个命令结束后,就重启该命令 askfirst:类似respawn,但是要先问一下用户 wait:阻塞式命令,init要等待其运行完毕 once:只运行一次,不必等待 ctrlaltdel:三键齐按时,要执行的命令 shutdown:系统关闭时执行 restart:系统重启时执行,通常就是init 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 一个可能的inittab如下 (id和runlevel都为空) ::sysinit:/etc/init.d/rcS ::respawn:/sbin/getty 115200 ttyS0 ::respawn:/control-module/bin/init ::restart:/sbin/init ::shutdown:/bin/umount -a -r 设置/etc/init.d/rcS作为系统初始化文件 在串口( 115200波特率)启动一个登录会话 启动控制模块定制的系统初始化脚本 设置/sbin/init为重启时运行的命令 系统关闭时,运行umount 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 系统初始化脚本 根据系统初始化脚本的设置不同,其功能可以很强大 通常 重新挂载根文件系统,以可读可写 挂载其他文件系统 初始化并启动网络 启动系统守护进程 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 举例 #!/bin/sh # Remount the root filesystem in read-write (requires /etc/fstab) mount -n -o remount,rw / # Mount /proc filesystem mount /proc # Start the network interface /sbin/ifconfig eth0 192.168.172.10 2018/12/4 Embedded Operating Systems
Embedded Operating Systems /etc/fstab举例 # /etc/fstab # device directory type options # /dev/nfs / nfs defaults none /proc proc defaults 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 制作根文件系统 准备好根文件系统的内容后,就要设置可供目标板使用的根文件系统 选择根文件系统的类型 制作根文件系统的映像或安装根文件系统到目标设备上 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 建立根文件系统 1、根文件系统的内容及其准备 2、选择根文件系统的格式并设置 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 选择根文件系统的依据 描绘一个嵌入式文件系统的特性通常包括: 可被写入:这个文件系统可被写入么? 具有永久性:重引导后,这个文件系统可以保存修改过的内容么? 具有断电可靠性:经变动的文件系统可以在断电之后恢复过来么? 经过压缩:经安装的文件系统,其内容经过压缩么? 存在RAM中:文件系统的内容在被安装之前会先从存储设备取出并放到RAM中么? 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 下表列出了常见的几种嵌入式文件系统及其特性 文件系统 可被写入 具有永久性 具有断电可靠性 经过压缩 存在于RAM中 CRAMFS 否 不适用 是 JFFS2 JFFS NFTL上的Ext2 NFTL上的Ext3 RAM disk上的Ext2 2018/12/4 Embedded Operating Systems
Embedded Operating Systems CRAMFS 这是Linux Torvalds编写的只具备最基本特性的文件系统,它非常简单、经过压缩并且只读,主要用于嵌入式系统,具有以下限制: 每个文件最大不超过16MB 不提供当前目录“.”和上级目录“..” 文件的UID字段只有16位,GID字段只有8位 所有文件的时间戳为Unix epoch(00:00:00 GMT, January 1, 1970) 内存分页大小必须是4096 文件链接计数器永远是1 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 要为根文件系统建立CRAMFS映像,首先要建立并安装CRAMFS工具:cramfsck和mkcramfs 可以在内核源代码树的scripts/cramfs目录里找到他们的程序代码,在该目录下使用make就可以建立这两个工具 使用mkcramfs命令建立CRAMFS映像: mkcramfs 根文件系统的根目录 映像名 2018/12/4 Embedded Operating Systems
Embedded Operating Systems RAMdisk 存在于RAM中,其存取功能类似于块设备 内核可以在同一时间支持多个活动的RAMdisk 在RAMdisk上可以使用任何磁盘文件系统 RAMdisk通常会从经压缩的磁盘文件系统(例如ext2)加载其内容,因此内核必须具备从存储设备取出initrd(initial RAM disk)映像作为它的根文件系统的能力。 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 启动时,内核会确认引导选项是否指示有initrd的存在,如果有就会从所选定的存储设备取出文件系统映像放入RAM disk,并且将它安装成根文件系统 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 看一下skyeye中ep7312/ep7312_with_imagekernel下的initrd.img中有些什么 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 建立供RAM disk使用的文件系统映像 创建一个新的mount点 以dd命令建立一个8192KB的文件系统映像,并以/dev/zero对它进行初始化 此时,initrd.img全0,相当于一块空白的硬盘 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 对建立好的文件系统映像建立文件系统并且安装(需要root权限) /sbin/mke2fs –F –v –m0 images/initrd.img -F选项指定对mke2fs在文件上运行而不是块设备 -v选项以verbose模式运行 -m0指出不必为超级用户保留任何区块 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 相当于将initrd.img这个磁盘 进行文件系统格式化 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 接下来,就可以将initrd.img挂载到刚刚建立的mount点上 当然,此时文件系统中基本上是空的 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 复制根文件系统到RAM disk 可以是我们自己制作的 也可以是之前挂载的ep7312的initrd.img 卸载根文件系统 现在initrd.img文件中已经包含了目标板的整个根文件系统 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 最后形成经压缩的RAM disk -9表示最高级的压缩算法 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 本课内容回顾 一、嵌入式Linux开发综述 二、Linux的配置和编译 三、根文件系统及其制作 2018/12/4 Embedded Operating Systems
Embedded Operating Systems 作业 在嵌入式Linux系统开发中,存在哪几种主机/目标机开发体系结构? 主机/目标板的调试方式有哪几种? 嵌入式Linux系统的引导配置的类型有哪几种? 2018/12/4 Embedded Operating Systems
Thanks! The end.