




已阅读5页,还剩104页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式Linux开发环境的构建 主要介绍如何构建嵌入式Linux的开发环境 包括 1 创建交叉编译工具2 Linux内核的移植3 根文件系统的制作4 Bootloader的移植 1 商用嵌入式LINUX ARMIRIXEmbeddedLinux derivedformDebianCoollogicCoollinux combinesLinuxandJavaCoventiveXlinux kernelcanbeassmallas142kbEsfiaRedblueLinux 400k designedforwirelessapps 2 商用嵌入式LINUX KYZOPizzaBoxLinux Sambabasedfile print CDserverLineoEmbedix supportsrealtimeandhighavailabilityappsLynuxWorksBlueCat generalpurposeembeddedsolutionsMontaVistaLinux generalpurposeembeddedsolutions 3 商用嵌入式LINUX NeowareNeoLinux RedHatderivedforinformationappliancesPalmPalmTynux InternetapplianceandmultimediaRedHatEmbeddedLinux generalpurposeembeddedsolutionRedSonicRed IceLinux runsfromDiskonChiporCompactFlash 4 商用嵌入式LINUX RidgeRunDSPLinux formultimedia wireless RTonDSPTimeSysLinuxGPL lowlatencyenhancedkernelTuxiaTASTE distrotargetsInternetappliancesVitalSystemsvLinux forARMbasedembeddedapps 5 开源嵌入式Linux EmbeddedDebianProject convertDebiantoanembeddedOSETLinux forPC104SBC suCLinux formicroprocessorsthatdon thaveMMUuLinux muLinux distrofitsonasinglefloppy 6 Linux如何做到实时 7 Linux如何做到实时 8 Linux支持的CPU IntelX86MIPSARMStrongARMPowerPCHitachiSuperH 9 嵌入式系统的开发模式 本机开发 在目标机中直接进行操作系统移植及应用程序的开发 在这种方式下进行开发 首先就得在目标机中安装操作系统 并且具有良好的人机开发界面 但是由于一般的嵌入式系统都是资源受限系统 如内 外存储空间小 CPU处理速度不够快等 在这样的环境下进行嵌入式linux的开发必然会影响到系统的成本以及开发速度 所以多数情况下都不采用这种开发方式 10 嵌入式系统的开发模式 交叉开发 在一台主机上进行操作系统的裁剪 以及编写应用程序 在主机上应用交叉编译环境编译内核及应用程序 然后把目标代码下载到目标机上运行 这就需要在主机上安装 配置交叉编译环境 交叉开发工具链 使其能够编译成在目标机上运行的目标代码 11 嵌入式系统的开发模式 模拟开发 建立在交叉开发环境基础之上 除了主机和目标机以外 还得提供一个在主机上模拟目标机的环境 这就不需要每次的修改都下载到目标机中 待程序正确后再下载到目标机上运行 这样就可以达到在没有目标机的情况下调试软件的目的 比较著名的模拟开发环境有SkyEye 能够模拟如ARM等处理器的开发环境 模拟硬件环境是一件比较复杂的工程 所以多数商业嵌入式系统的开发采用的是交叉开发模式 12 开发平台的选择 Linux作为开发平台 选择Linux作为编译及编译的平台 这需要在Linux平台上安装交叉编译环境 然后直接在Linux平台上直接进行开发 使用Linux的文本编辑器vi或emacs来修改操作系统内核代码 编写应用程序 并使用Linux下的Minicom作为串口控制台 与目标机器进行通信 13 开发平台的选择 Windows作为开发平台 选择Windows作为开发平台 可以使用自己熟悉的文本编辑器来书写源代码 但需要安装cgywin软件用来提供Windows下的Linux开发环境 同时还要安装适用于cygwin的交叉开发环境 或能够自己编译出cygwin下的交叉开发工具 这种开发环境下 可以使用Windows下的串口控制台软件与目标机器进行通信 14 开发平台的选择 Linux服务器 Windows工作站的开发方式 如果习惯了Windows的操作 或在开发的同时还要使用Windows的其他软件 但又只习惯Linux下的交叉开发工具链 还有一种方式 搭建一个Linux服务器 在上边运行telnet和ftp服务 在Windows工作站上用telnet客户端和ftp工具远程登陆到Linux服务器来开发 15 1 创建交叉编译工具 由于一般嵌入式开发系统存储大小有限 通常要在pc机上建立一个用于目标机的交叉编译环境 这是一个由编译器 连接器和解释器组成的综合开发环境 交叉编译工具包括 Binutils 用于操作二进制文件的实用程序集合 包括诸如ar as objdump objcopy这样的实用程序 Gcc GNUC编译器 Glibc 所有用户应用程序都将链接到的C库 避免使用任何C库函数的内核和其它应用程序可以在没有该库的情况下进行编译 16 1 创建交叉编译工具 cont 创建交叉编译工具的一般步骤 1 下载源文件 补丁和建立编译环境a 下载源文件linux内核源码及相应的补丁binutils 2 10 1gcc 2 95 3glibc 2 2 3glibc linuxthreads 2 2 3b 建立工作目录 设置环境变量 安装Linux头文件 17 1 创建交叉编译工具 cont 2 建立二进制工具 binutils binutils包中的工具常用来操作二进制目标文件 该包中最重要的两个工具就是GNU汇编器as和链接器ld 3 创建初始编译器 bootstrapgcc 创建交叉编译版本的Gcc 需要交叉编译版本的glibc 而交叉编译版本的glibc是通过交叉编译版本的gcc创建的 面对这个先有鸡还是先有蛋的问题 解决的办法是先只编译对C语言的支持 并禁止支持线程 18 1 创建交叉编译工具 cont 4 第一次创建c库 glibc 这一步编译好的glic还不能用 它只是第二次编译所需要的工具 后面的编译工作都需要连接到这个库上 19 1 创建交叉编译工具 cont 5 建立全套编译器 fullgcc 有了交叉编译版本的glibc 就可以创建完整版本的Gcc了 6 第二次创建C库重新编译glibc 并把glibc安装到特定的工作目录中 20 嵌入式Linux开发涉及的层次 嵌入式Linux开发大致涉及三个层次 引导装载程序 Linux内核 图形用户界面 或称GUI 21 引导装载程序 引导装载程序通常是在任何硬件上执行的第一段代码 在PC系统中 通常将引导装载程序装入主引导记录 MasterBootRecord MBR 中 或者装入Linux驻留的磁盘的第一个扇区中 通常 在台式机或其它系统上 BIOS将控制移交给引导装载程序 22 问题 在大多数情况下 嵌入式系统没有BIOS支持 如何实现第一次引导呢 23 解决方法一 专用软件专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在flash的给定位置中 这个软件使用目标机上的JTAG端口 它是用于执行外部输入的指令的接口JFlash linux是一种用于直接写闪存的流行工具 它在主机机器上执行并通过JTAG接口使用并行端口访问目标闪存芯片 24 解决方法二 微小的引导代码根据几个字节的指令初始化一些DRAM 并启用目标上的一个串行 或者USB 或者以太网 端口与主机程序通信 然后 主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上 并将它写入闪存 在安装它并给予其控制后 这个引导装载程序执行Bootloader的功能 25 2 Bootloader的移植 一 什么是bootloader 引导加载程序 BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序 可以初始化硬件设备 建立内存空间的映射图 有的CPU没有内存映射功能如S3C44B0 从而将系统的软硬件环境带到一个合适的状态 以便为最终调用操作系统内核或用户应用程序准备好正确的环境 26 2 Bootloader的移植 cont 二 BootLoader的操作模式多数BootLoader都包含两种不同的操作模式 启动加载 Bootloading 模式 也称为 自主 Autonomous 模式 也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行 整个过程并没有用户的介入 是BootLoader的正常工作模式 在嵌入式产品发布的时候 BootLoader必须工作在这种模式下 从最终用户的角度看 BootLoader的作用就是用来加载操作系统 而并不存在所谓的启动加载模式与下载工作模式的区别 27 2 Bootloader的移植 cont 下载 Downloading 模式 在这种模式下目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件 比如应用程序 数据文件 内核映像等 从主机下载的文件通常首先被BootLoader保存到目标机的RAM中然后再被BootLoader写到目标机上的固态存储设备中 这种模式通常在系统更新时使用 工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口 28 2 Bootloader的移植 cont 三 BootLoader的启动过程BootLoader的实现依赖于CPU的体系结构 因此大多数BootLoader的启动都分为stage1和stage2两大部分 依赖于CPU体系结构的代码 设备初始化代码等 通常都放在stage1中 而且通常都用汇编语言来实现 以达到短小精悍的目的 stage2则通常用C语言来实现 可以实现给复杂的功能 而且代码会具有更好的可读性和可移植性 29 2 Bootloader的移植 cont BootLoader的stage1通常包括以下步骤 以执行的先后顺序 硬件设备初始化执行 linux arch arm kernel head xxx S1 屏蔽所有的中断 为中断提供服务通常是OS设备驱动程序的责任 因此在BootLoader的执行全过程中可以不必响应任何中断 中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器 比如ARM的CPSR寄存器 来完成 2 设置CPU的速度和时钟频率 30 2 Bootloader的移植 cont 3 RAM初始化 包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等 4 初始化LED 通过GPIO来驱动LED 表明系统状态是OK还是Error 如果板子上没有LED 那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点 5 关闭CPU内部指令 数据cache 31 2 Bootloader的移植 cont 为加载BootLoader的stage2准备RAM空间 为了获得更快的执行速度 通常把stage2加载到RAM空间中来执行 因此必须为加载BootLoader的stage2准备好一段可用的RAM空间范围 拷贝BootLoader的stage2到RAM空间中 拷贝时要确定两点 1 stage2的可执行映象在固态存储设备的存放起始地址和终止地址 2 RAM空间的起始地址 32 2 Bootloader的移植 cont 设置好堆栈 堆栈指针的设置是为了执行C语言代码作好准备 跳转到stage2的C入口点 在上述一切都就绪后 就可以跳转到BootLoader的stage2去执行了 比如 在ARM系统中 这可以通过修改PC寄存器为合适的地址来实现 33 2 Bootloader的移植 cont stage2的代码通常用C语言来实现 但是与普通C语言应用程序不同的是 在编译和链接bootloader这样的程序时 不能使用glibc库中的任何支持函数 具体步骤 以执行的先后顺序 初始化本阶段要使用到的硬件设备 通常包括 1 初始化至少一个串口 以便和终端用户进行I O输出信息 2 初始化计时器等 设备初始化完成后 可以输出一些打印信息 程序名字字符串 版本号等 34 2 Bootloader的移植 cont 检测系统内存映射 memorymap 指在整个4GB物理地址空间中有哪些地址范围被分配用来寻址系统的RAM单元 比如 在SA 1100CPU中 从0 xC000 0000开始的512M地址空间被用作系统的RAM地址空间 而在SamsungS3C44B0XCPU中 从0 x0c00 0000到0 x1000 0000之间的64M地址空间被用作系统的RAM地址空间 35 2 Bootloader的移植 cont 将kernel映像和根文件系统映像从flash上读到RAM空间中 1 规划内存占用的布局包括两个方面 a 内核映像所占用的内存范围b 根文件系统所占用的内存范围 在规划内存占用的布局时 主要考虑基地址和映像的大小 2 从Flash上拷贝数据 36 2 Bootloader的移植 cont 为内核设置启动参数 在将内核映像和根文件系统映像拷贝到RAM空间中后 就可以准备启动Linux内核了 但是在调用内核之前 应该作一步准备工作 即 设置Linux内核的启动参数 调用内核 37 2 Bootloader的移植 cont 系统初始化linux init main c start kernel setup arch platformspecificinit boardparam memoryrange etcpaging init trap init init IRQ 38 2 Bootloader的移植 cont sched init time init parse options command line console initkmalloc initinode initmem initbuffer init sock init kernelthread init 39 2 Bootloader的移植 cont 设备驱动初始化挂载root文件系统 ROMFS Orotherfilesystemasroot Openttyfromrootfilesystem运行初始化进程 40 etc rc hostnameAtmel bin expand etc ramfs img dev ram0 mount tprocproc proc mount text2 dev ram0 var mkdir var tmp mkdir var log mkdir var run mkdir var lock cat etc motd ifconfiglo127 0 0 1 routeadd net127 0 0 0netmask255 255 255 0lo dhcpcd 41 2 Bootloader的移植 cont 四 u boot 1 简介U Boot 全称UniversalBootLoader 是开放源码项目 从FADSROM 8xxROM PPCBOOT逐步发展演化而来 其源码目录 编译形式与Linux内核很相似 不少U Boot源码就是相应的Linux内核源程序的简化 尤其是一些设备的驱动程序 这从U Boot源码的注释中能体现这一点 42 2 Bootloader的移植 cont 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 QNX RTEMS ARTOS 这是U Boot中Universal的一层含义 43 2 Bootloader的移植 cont 另外一层含义则是U Boot除了支持PowerPC系列的处理器外 还能支持MIPS x86 ARM NIOS XScale等诸多常用系列的处理器 这两个特点正是U Boot项目的开发目标 即支持尽可能多的嵌入式处理器和嵌入式操作系统 就目前来看 U Boot对PowerPC系列处理器支持最为丰富 对Linux的支持最完善 44 2 Bootloader的移植 cont 2 u boot的特点 开放源码 支持多种嵌入式操作系统内核 如Linux NetBSD VxWorks QNX RTEMS ARTOS LynxOS 支持多个处理器系列 如PowerPC ARM x86 MIPS XScale 45 2 Bootloader的移植 cont 较高的可靠性和稳定性 高度灵活的功能设置 适合U Boot调试 操作系统不同引导要求 产品发布等 丰富的设备驱动源码 如串口 以太网 SDRAM FLASH LCD NVRAM EEPROM RTC 键盘等 较为丰富的开发调试文档与强大的网络技术支持 46 2 Bootloader的移植 cont 3 U Boot主要目录结构 board目标板相关文件 主要包含SDRAM FLASH驱动 common独立于处理器体系结构的通用代码 如内存大小探测与故障检测 cpu与处理器相关的文件 如mpc8xx子目录下含串口 网口 LCD驱动及中断初始化等文件 driver通用设备驱动 如CFIFLASH驱动 目前对INTELFLASH支持较好 47 2 Bootloader的移植 cont docU Boot的说明文档 includeU Boot头文件 尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件 lib xxx处理器体系相关的文件 如lib ppc lib arm目录分别包含与PowerPC ARM体系结构相关的文件 net与网络功能相关的文件目录 如bootp nfs tftp post上电自检文件目录 尚有待于进一步完善 rtcRTC驱动程序 tools用于创建U BootS RECORD和BIN镜像文件的工具 48 2 Bootloader的移植 cont 4 U Boot可支持的主要功能系统引导 支持NFS挂载 RAMDISK 压缩或非压缩 形式的根文件系统 支持NFS挂载 从FLASH中引导压缩或非压缩系统内核 基本辅助功能 强大的操作系统接口功能 可灵活设置 传递多个关键参数给操作系统 适合系统在不同开发阶段的调试要求与产品发布 尤对Linux支持最为强劲 支持目标板环境参数多种存储方式 如FLASH NVRAM EEPROM CRC32校验 49 2 Bootloader的移植 cont 可校验FLASH中内核 RAMDISK镜像文件是否完好 设备驱动 串口 SDRAM FLASH 以太网 LCD NVRAM EEPROM 键盘 USB PCMCIA PCI RTC等驱动支持 上电自检功能SDRAM FLASH大小自动检测 SDRAM故障检测 CPU型号 特殊功能 XIP内核引导 50 2 Bootloader的移植 cont 5 u boot移植的主要步骤以S3C2410处理器为例 说明u boot的主要移植步骤 1 修改Makefile文件bks2410 config unconfig mkconfig config armarm920tbks2410NULLs3c24x0 51 2 Bootloader的移植 cont 各参数含义 arm CPU的架构 ARCH arm920t CPU的类型 CPU 其对应于cpu arm920t子目录 bks2410 开发板的型号 BOARD 对应于board bks2410目录 NULL 开发者 或经销商 vender s3c24x0 片上系统 SOC 52 2 Bootloader的移植 cont 2 建立board bks2410目录 拷贝board smdk2410下的文件到board bks2410目录 将smdk2410 c更名为bks2410 c3 cpinclude configs smdk2410 hinclude configs bks2410 h4 将arm linux gcc的目录加入到PATH环境变量中5 测试编译能否成功 makebks2410 configmakeallARCH arm生成u boot bin就OK了 53 2 Bootloader的移植 cont 6 依照自己开发板的内存地址分配情况修改board bks2410 memsetup S文件7 在board bks2410加入NANDFlash读函数 建立nand read c 8 修改board bks2410 Makefile9 修改cpu arm920t start S文件10 修改include configs bks2410 h文件11 重新编译u bootmakeallARCH arm12 通过jtag将u boot烧写到flash 54 2 Bootloader的移植 cont 五 vivi简介vivi是韩国mizi公司开发的bootloader 适用于ARM9处理器 如果目标平台使用的是ARM9处理器 那么选用vivi来做bootloader是个不错的选择 55 参考网站 u boot 56 3 Linux的内核格式 linux的内核有多种格式 vmlinux 老式的zImage和新型的bzImage vmlinux和zImage之间的主要区别 vmlinux是实际的 未压缩的 可执行文件 而zImage是或多或少包含相同信息的自解压压缩文件 只是压缩它以处理 通常是Intel强制的 640KB引导时间的限制 57 3 Linux的内核格式 zImage和新型的bzImage之间最大的差别是对于内核体积大小的限制 由于zImage内核需要放在实模式1MB的内存之内 所以其体积受到了限制 目前采用的内核格式大多为bzImage 这种格式没有1MB内存限制 58 3 Linux内核的移植 使某个平台的代码运行在其他平台上的过程就叫做移植 Linux系统通过移植可以运行在ARM PowerPC M68K等多种平台上 Linux内核结构linux内核主要由5个子系统组成 进程调度 内存管理 虚拟文件系统 网络接口和进程间通信 一般在Linux系统中的 usr src linux 目录下就是内核源代码 59 3 Linux内核的移植 cont Linux内核源代码的分布如下 arch这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码 如对于X86平台就是i386 include这个目录包括了核心的大多数include文件 另外对于每种支持的体系结构分别有一个子目录 init此目录包含核心启动代码 mm此目录包含了所有的内存管理代码 与具体硬件体系结构相关的内存管理代码位于arch mm目录下 如对应于X86的就是arch i386 mm fault c 60 3 Linux内核的移植 cont drivers系统中所有的设备驱动都位于此目录中 它又进一步划分成几类设备驱动 每一种也有对应的子目录 如声卡的驱动对应于drivers sound ipc此目录包含了核心的进程间通讯代码 modules此目录包含已建好可动态加载的模块 fsLinux支持的文件系统代码 不同的文件系统有不同的子目录对应 如ext2文件系统对应的就是ext2子目录 kernel主要核心代码 同时与处理器结构相关代码都放在arch kernel目录下 61 3 Linux内核的移植 cont net核心的网络部分代码 里面的每个子目录对应于网络的一个方面 lib此目录包含了核心的库代码 与处理器结构相关库代码被放在arch lib 目录下 scripts此目录包含用于配置核心的脚本文件 Documentation此目录是一些文档 起参考作用 62 3 Linux内核的移植 cont Linux内核的移植移植所要做的工作就是根据硬件的配置 修改Linux内核目录中的Makefile文件 配置文件及某些源代码 63 3 Linux内核的移植 cont 编译内核1 安装内核如果内核已经安装 usr src 目录有linux子目录 跳过 如果没有安装 在光驱中放入linux安装光盘 找到kernel source 2 xx xx rpm文件 xx代表数字 表示内核的版本号 比如RedHatlinux的RPMS目录是 RedHat RPMS 目录 然后使用命令rpm ivhkernel source2 xx xx rpm安装内核 64 3 Linux内核的移植 cont 2 清除从前编译内核时残留的 o文件和不必要的关联cd usr src linuxmakemrproper删除所有因构造内核过程中产生的所有文件 除了Makeclean所删除的文件之外 还要删除 config depend等文件 把核心源码恢复到最原始的状态 65 3 Linux内核的移植 cont 3 配置内核 修改相关参数在图形界面下 makexconfig 字符界面下 makemenuconfig调用 scripts Configure按照arch i386 config in来进行配置 命令执行完后产生文件 config 其中保存着配置信息 下一次再做makeconfig将产生新的 config文件 原 config被改名为 config old在内核配置菜单中正确设置个内核选项 保存退出 66 3 Linux内核的移植 cont 4 正确设置关联文件makedep寻找依存惯性 产生两个文件 depend和 hdepend 其中 hdepend表示每个 h文件都包含其他哪些嵌入文件 而 depend文件有多个 在每个会产生目标文件 o 文件的目录下均有 它表示每个目录文件都依赖哪些嵌入文件 h 5 编译内核对于大内核 比如需要SCSI支持 makebzImage对于小内核 makezImage根据可用的系统资源和引导装载程序的功能 内核可以编译成vmlinux Image或zImage 67 3 Linux内核的移植 cont 6 编译模块makemodules7 安装模块makemodules install 68 内核链接和装入 为目标系统编译了内核后 通过使用引导装载程序 bootloader 内核就被装入到目标系统的内存 在DRAM中或者在闪存中 通过使用串行 USB或以太网端口 引导装载程序与主机通信以将内核传送到目标的闪存或DRAM中 在将内核完全装入目标后 引导装载程序将控制传递给装入内核的地址 69 内核链接和装入 内核可执行文件由许多链接在一起的对象文件组成 对象文件有许多节 如文本 数据 init数据 bass等等 对象文件都是由一个称为链接器脚本的文件链接并装入的 链接器脚本的功能是将输入对象文件的各节映射到输出文件中 即将所有输入对象文件都链接到单一的可执行文件中 将该可执行文件的各节装入到指定地址处 vmlinux lds是存在于arch 目录中的内核链接器脚本 负责链接内核的各个节并将它们装入内存中特定偏移量处 70 典型的vmlinux lds文件 OUTPUT ARCH includesarchitecturetype ENTRY stext stextisthekernelentrypoint SECTIONS SECTIONScommanddescribesthelayoutoftheoutputfile TEXTADDR TEXTADDRisLMAforthekernel init Initcodeanddata stext Firstsectionisstextfollowedby initdatasection init begin text init init end text Realtextsegmentfollows init datasection text text etext Endoftextsection 71 4 根文件系统的制作 嵌入式系统需要一种以结构化格式存储和检索信息的方法 这就需要文件系统的参与 Ramdisk是通过将计算机的RAM用作设备来创建和挂装文件系统的一种机制 它通常用于无盘系统 当然包括微型嵌入式设备 它只包含作为永久存储媒质的闪存芯片 72 RamDisk简介 将RAM模拟当做硬盘来使用的一种技术 相对于传统的硬盘文件访问来说 这种技术可以极大的提高在其上进行的文件访问的速度 但是RAM的易失性也意味着当关闭电源后的数据将会丢失 Ramdisk的速度特别快 大概是现在最快的7200转硬盘速度的30倍 VSuiteRamdisk 推荐 免费版 RamDiskPlus 需要序列号 73 创建基于Ext2fs的Ramdisk mke2fs vm0 dev ram4096mount text2 dev ram mntcd mntcp bin sbin etc dev filesinmntcd umount mntddif dev rambs 1kcount 4096of ext2ramdisk 74 ramfs 一种基于ram的文件系统 开发ramfs的目的是因为ramdisk浪费了太多的内存cache页 ramfs是基于tmpfs的一个实例 75 Initrd与initramfs initrd是initramdisk的缩写 initramfs是initramfs的缩写 init前缀代表它们具有了引导内核启动的功能 ramfs比ramdisk更加高效 自然initramfs也更加优秀 是2 6内核新加入的推荐使用的机制 虽然可能pc中grub使用的内核cmdline参数是kernel vmlinuz 2 6 25 14 fc9 i686roroot UUID 11d7ac51 2b45 489e 8a48 8d2a28e2c04erhgbquietinitrd initrd 2 6 25 14 fc9 i686 img实际上使用的是initramfs 文件格式不同 initrd是gziped的 initramfs是cpio的 76 initrd initrd的作用 精简的根文件系统 包含必备的目录和程序 内核镜像不应该静态包含进太多驱动模块 但是Linux内核启动最后一步 创建init内核线程 需要执行的init程序或者脚本在根文件系统中 根文件系统可能在硬盘 磁盘阵列 nfs flash上 此时 可使用initrd作为一个过渡 77 initrd initrd 或者initramfs 无论在pc还是嵌入式 都是可以选择的 分3种情况1 完全不要initrd2 initrd作为最终的根文件系统3 initrd作为过渡 由initrd的init来加载最终的根文件系统 78 情况1 比如嵌入式linux静态包含了nandflash驱动和jffs2驱动 指定内核启动参数root dev mtdblock2rootfs jffs2rwconsole ttySAC0 115200init linuxrc 使用busybox作为根文件系统 情况2 将根文件系统做成ramdisk镜像 使用ubbot下载到0 x30800000 内核启动参数root dev ramrwinit linuxrcinitrd 0 x30800000 8Mconsole ttySAC0 115200注意 一旦使用了ramdisk作为内核命令行参数root的参数 root dev ram那么就直接把initrd当做最终的根文件系统情况3 pc常见 嵌入式linux也可见这样的启动参数console ttySAC0 115200root nfsnfsroot 192 168 1 9 source rootfsinitrd 0 x10800000 0 x14af47 79 4 根文件系统的制作 一 根文件系统的基本结构和内容Linux系统的根文件的基本结构如图1所示 其中每个目录中都包含特定内容 1 bin目录 bin目录包含了引导启动所需的命令或普通用户可能用的命令 可能在引导启动后 这些命令都是二进制文件的可执行程序 80 4 根文件系统的制作 cont 2 sbin目录 sbin目录类似 bin 也用于存储二进制文件 因为其中的大部分文件多是系统管理员使用的基本的系统程序 所以虽然普通用户必要且允许时可以使用 但一般不给普通用户使用 81 4 根文件系统的制作 cont 3 etc目录 etc目录存放着各种系统配置文件 其中包括了用户信息文件 etc passwd 系统初始化文件 etc rc等 Linux正是靠这些文件才得以正常地运行 4 root目录 root目录是超级用户的目录 82 4 根文件系统的制作 cont 5 lib目录 根文件系统上的程序所需的共享库 存放根文件系统程序运行所需的共享文件 lib modules目录包含系统核心可加载各种模块 尤其是那些在恢复损坏的系统时重新引导系统所需的模块 例如网络和文件系统驱动 83 4 根文件系统的制作 cont 6 dev目录 dev目录存放了设备驱动程序 用户通过这些文件访问外部设备 比如 用户可以通过访问 dev mouse来访问鼠标的输入 7 tmp目录 tmp目录存放程序在运行时产生的信息和数据 8 boot目录 boot目录存放引导加载器 bootloader 使用的文件 如LILO grub 核心映像也经常放在这里 而不是放在根目录中 84 4 根文件系统的制作 cont 9 mnt目录系统管理员临时安装 mount 文件系统的安装点 程序并不自动支持安装到 mnt mnt下面可以分为许多子目录 例如 mnt dosa可能是使用MSDOS文件系统的软驱 而 mnt exta可能是使用ext2文件系统的软驱 mnt cdrom光驱等等 10 proc usr var home目录其他文件系统的安装点 85 4 根文件系统的制作 cont 二 嵌入式Linux系统的根文件系统的制作第一步 确定根文件系统的目录结构在嵌入式Linux系统中 必须有的目录包括 bin dev etc lib proc sbin 和 usr 其他目录都是可选的 86 4 根文件系统的制作 cont 第二步 在根文件系统中各个目录的添加必要的内容 包括 1 链接库glibc2 内核映象 内核配置文件等 3 内核模块 4 设备文件 87 4 根文件系统的制作 cont 只需要一些必备的条目及符号链接就可以满足系统的运行 基本的 dev条目包括 文件名说明类型主编号次编号权限位mem物理内存存取字符11600null黑洞设备字符13666zero以nullbyte字符15666为数据来源random随机数产生器字符18644 88 4 根文件系统的制作 cont tty0现行的虚字符40600拟控制台tty1第一个虚字符41600拟控制台ttyS0第一个UART字符464600串行端口tty现行的控制台字符50666console系统控制台字符51600 89 4 根文件系统的制作 cont 创建 dev中的条目 使用mknod命令 mknod m600memc11 mknod m666nullc13 创建符号链接 使用ln s命令 链接名称链接对象fd proc self fdstdinfd 0stdoutfd 1stderrfd 2 90 4 根文件系统的制作 cont 5 主要的系统应用程序标准的Linux工作站和服务器发行套件中都配备了数以千计的二进制命令文件 并且不同的发行套件提供的命令集还各不相同 嵌入式Linux系统中不需要这么多的二进制文件 一般有两种方法来定制嵌入式Linux系统中的二进制命令文件 1 挑选若干标准命令 2 尽可能把命令集浓缩成仅仅实现必要功能的极少数应用程序 如BusyBox 91 4 根文件系统的制作 cont BusyBox简介BusyBox包含了一些简单的工具 例如cat和echo 还包含了一些更大 更复杂的工具 例如grep find mount以及telnet 不过它的选项比传统的版本要少 BusyBox称为Linux工具里的瑞士军刀 92 4 根文件系统的制作 cont BusyBox使用了符号链接以便使一个可执行程序看起来像很多程序一样 对于BusyBox中包含的每个工具来说 都会这样创建一个符号链接 这样就可以使用这些符号链接来调用BusyBox 然后BusyBox可以通过argv 0 来调用内部工具 有关BusyBox的参考网站 93 4 根文件系统的制作 cont 6 init程序内核初始化的最后一个动作是启动init程序 init程序启动后会根据inittab文件的内容启动指定的系统服务 大多数Linux使用的init跟SystemV的init类似 嵌入式Linux系统可用BusyBox来提供init的功能 用户需要定制目标平台的inittab rc sysinit rc等文件 94 4 根文件系统的制作 cont 三 制作根文件系统的镜像根文件系统的目录结构和内容都准备好了之后 需要把它制成一个镜像文件 以便于将其下载到开发板上 嵌入式系统常用的文件系统介绍 1 CRamfscramfs是一个压缩式的只读文件系统 不需要一次性地将文件系统中的所有内容都解压缩到内存之中 而只是在系统需要访问某个位置的数据的时侯 马上计算出该数据在cramfs中的位置 将其实时地解压缩到内存之中 然后通过对内存的访问来获取文件系统中需要读取的数据 95 4 根文件系统的制作 cont cramfs中的解压缩以及解压缩之后的内存中数据存放位置都是由cramfs文件系统本身进行维护的 用户并不需要了解具体的实现过程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年特岗教师招聘考试心理学知识要点梳理与模拟题解析
- 某中小学2021年世界气候日介绍主题教育班会-图文班会课件
- 人教版平均分的教学课件
- 《妈妈们的心》教学课件
- 郫都区2024-2025学年度(下)八年级学业水平监测(语文卷)
- 河南省许昌市2024-2025学年高二下学期7月期末考试化学试题(含答案)
- 用电安全知识培训课件计划
- 生物安全知识培训课件考核
- 急性肾功能衰竭腹膜透析护理查房
- 生活电子基础知识培训课件
- 小学生主题班会 开学第一课 课件
- 光伏电站除草技术文件
- 中国信息通信研究院-中国工业互联网发展成效评估报告(2024年)
- 项目安全保障措施方案
- DL-T1392-2014直流电源系统绝缘监测装置技术条件
- 彩钢瓦翻新合同范本
- 高中物理选择题库
- 妊娠合并肺结核的诊断与治疗
- 事业单位工作人员调动申报表
- 上下班途中安全培训课件
- 廉洁应征承诺书
评论
0/150
提交评论