680 likes | 867 Views
操作系统. 第 16 章 嵌入式 Linux 系统. 陆松年 snlu@sjtu.edu.cn. 主要内容. 嵌入式 Linux 系统基本概念 嵌入式 Linux 系统裁减与移植 嵌入式 LINUX 软件开发. 主要内容. 嵌入式 Linux 系统基本概念 Linux 嵌入式 Linux 系统裁减与移植 嵌入式 Linux 应用. 外围电路. 电源 模块. Flash. 微处理器. RAM. 时钟. MPU. 复位. ROM. 外设. Keyboard. USB. LCD. Other. 16.1.1 嵌入式系统的定义.
E N D
操作系统 第16章 嵌入式Linux系统 陆松年 snlu@sjtu.edu.cn
主要内容 • 嵌入式Linux系统基本概念 • 嵌入式Linux系统裁减与移植 • 嵌入式LINUX软件开发
主要内容 • 嵌入式Linux系统基本概念 • Linux嵌入式Linux系统裁减与移植 • 嵌入式Linux应用
外围电路 电源 模块 Flash 微处理器 RAM 时钟 MPU 复位 ROM 外设 Keyboard USB LCD Other 16.1.1 嵌入式系统的定义 嵌入式系统硬件组成
嵌入式系统设备常见接口 • I/O • A/D、D/A • 键盘 • LCD • 存储器接口 • 网络设备接口
CISC和RISC指令集 CISC:复杂指令集(Complex Instruction Set Computer) • 具有大量的指令和寻址方式 • 8/2原则:80%的程序只使用20%的指令 • 大多数程序只使用少量的指令就能够运行。 • 如Intel X86系列或者兼容的低功耗芯片 RISC:精简指令集(Reduced Instruction Set Computer) • 在通道中只包含最有用的指令 • 确保数据通道快速执行每一条指令 • 使CPU硬件结构设计变得更为简单 • 如PowerPC, MIPS, ARM/XScale
冯·诺依曼体系结构模型 存储器 指令寄存器 程序 控制器 指令0 指令1 指令2 指令3 指令4 数据通道 数据 输出 输入 中央处理器 数据0 数据1 数据2
哈佛体系结构 程序存储器 地址 指令寄存器 指令0 控制器 指令1 指令 指令2 数据存储器 地址 数据通道 输出 输入 数据0 中央处理器 数据1 数据 数据2
16.1.2 嵌入式操作系统的特点 • “嵌入计算机系统的专用操作系统”。 • 嵌入性:物理环境(小型)、电气环境(可靠)、成本(价廉)等要求。 • 专用性 :满足对象要求的最小软、硬件配置等。 • 性能要求:多任务调度、实时性能 • 功能要求:接口与通信能力
常见嵌入式操作系统 • VxWorks • 市场占有率最高的系统。它支持多种处理器 ,高性能。 • PSOSystem • 模块化好,在中低端系统中应用广。pSOS已属于WindRiver。 • QNX • 小巧灵活,在航空航天和工业控制中广泛应用 • Windows CE • 多线程、完整优先权、多任务的操作系统。 图形界面好,开发工具友好 • Linux-derived RTOS • Montavist Linx, RTlinux; • Other OS • VTRX,Palm OS,ucos etc
16.1.3 嵌入式Linux发展与应用 专用嵌入式实时操作系统 vs 嵌入式Linux 操作系统
如何选择合适的linux版本 • 标准的Linux 版本。 • 小型化的嵌入式版本。 • 具有实时扩展功能的Linux 版本。 • Linux 特殊应用版本。例如有许多针对不同的如“瘦服务器”或“防火墙”应用的小型化、实时特性增强的版本。
网络可选择资源-标准版本 • Debian:http://www.debian.org.com/ • Red Hat:http://www.redhat.com/ • Slackware:http://www.slackware.com/ • Turbo Linux:http://www.turbolinux.com/
网络可选择资源-小型化版本 • ETLinux:http://www.prosa.it/embedded/etlinux/ • Linux Router Project:http://www.linuxrouter.org/ • LOAF:http://loaf.ecks.org/ • ucLinux:http://www.uclinux.org/
网络可选择资源-实时扩展版 • RTLinux:http://www.rtlinux.com • RTAI:http://www.rtai.org/ • EL/IX:http://www.sourceware.cygus.com/elix/ • SRT-Linux:http://www.cl.cam.ac.uk/~dmi1000/linux-srt/index.html
嵌入式linux构建与应用的关键技术 • 对linux 的裁减达到小型化的目的; • 对不同嵌入式微处理器的linux 内核代码移植,驱动程序的研究; • 专业应用开发: 移植应用程序,开发面向特定应用的控制软件。
嵌入式Linux操作系统实时性 • 常用衡量实时性标准 • 确定性(Determinism):系统的行为表现应该是确定的,每个系统调用执行的时间是可预测的。 • 中断延迟时间(Interrupt Latency Time):从接收到中断信号到操作系统作出响应,并进入中断服务程序的时间; • 上下文切换时间(Context-Switching Time),就是操作系统将控制权从执行中取回,然后交给另一个任务所需的时间。
嵌入式Linux操作系统实时性 • 影响中断处理时间的因素 • 处理器硬件电路的延迟时间,通常这个时间可以忽略。 • 操作系统处理中断并将控制权转移给中断处理程序所需要的时间。 • 操作系统的中断禁止时间,这是操作系统为了保护重要的系统程序代码暂停接受中断需要的时间。
嵌入式Linux实时化技术 RTlinux双内核实时化结构
嵌入式Linux实时化技术 RTLinux任务处理流程
主要内容 • 嵌入式Linux系统基本概念 • Linux嵌入式Linux系统裁减与移植 • 嵌入式Linux软件开发
从何处开始? • 需要考虑的问题 • 是否支持自己的硬件平台 • 有多少可选软件、文件定制能力如何 • 是否有完整文档、新版本升级是否方便等等一系列问题。 • 可以选择的方法 • 基于面向特定应用的嵌入式Linux版本 • 基于通用嵌入式Linux版本 • 基于某通用Linux系统和Linux源代码库
内核,C库,Shell和实用程序 • 典型的Linux系统包括3个主要的软件层:Linux内核、C库和应用程序; • 内核主要的功能包括内存管理、进程调度、设备驱动、文件系统、网络协议栈和模块管理等; • 内核之上是C库,这一层负责把符合POSIX标准的API转换成内核可以识别的形式; • 离硬件最远的是应用程序层,细分包含两部分: • 系统程序,一般指运行系统所不可缺少的程序; • 用户程序,给用户提供各种功能;
嵌入式Linux系统构建流程 • 裁减编译内核 • 建立root文件系统 • 制作系统映像 • 安装引导
第1步:裁减和编译内核 • 获得内核源代码 • 根据硬件平台获得对应的Linux系统源代码 • 从一个通用系统,如redhat系统获得源代码 • 裁减编译内核的步骤 • 配置内核 • 更新编译文件 • 编译内核
编译内核原则 • Linux内核拥有灵活方便的配置功能,菜单分为,芯片组支持,外设支持,文件支持,网络等,每类只将需要的内容编译进内核。 • 根据目标系统的硬件配置选择模块 • 根据应用目标选择其他功能模块 • 应当保证内核只支持一种或是两种必要的文件系统,如ext2和minix; • 为支持内存虚拟磁盘启动,需要编译内核支持ram disk和initrd
第1步:裁减编译内核 • 以root超级用户登录,进入目录/usr/src/linux。 • 如果目标系统和主机系统不是同一硬件平台需要先建立交叉编译环境并获得目标系统的内核源代码 • #make menuconfig • 对内核模块进行配置(也可以在X Window中运行make xconfig)。 • #make dep • 更新配置文件 • #make bzImage • (如果内核不大则执行#make zImage),执行该命令后,将在/usr/src/linux/arch/i386/boot目录下生成内核文件bzImage(或zImage)。 • 若配置中加入了模块的支持(选项为M),还需要执行#make modules和#make modules_install。 • 生成内核 • /usr/src/linux/arch/i386/boot/bzImage文件为内核文件 • 改名为MiniKernel备用
第2步:建立root文件系统 • 什么是root文件系统? • 一个完整的Linux系统除了内核外,还必须有一个由C库和系统应用程序构成的root文件系统。 • 一个root文件系统包括支持完整Linux系统运行的全部东西。 • 建立root文件系统的步骤 • 在主机中建立目标系统的root文件系统目录结构 • 从代码库中挑选并裁减出适用的各种文件 • 将root文件系统目录中的所有内容打包制作成映像
第2步:建立root文件系统 • root文件系统的内容 • 基本文件系统结构,至少含有目录/dev、/proc、/bin、/etc、/lib、/usr、/tmp ; • 最基本的系统应用程序,如sh、ls、cp、mv等; • 最低限度的配置文件,如rc、inittab、fstab等; • 基本设备,如/dev/mem、/dev/ tty*、/dev/console; • 基本程序运行所需的C函数库。
第2步:建立root文件系统 • 建立目录系统 • 以root用户登录开发主机,在合适的目录下(如根目录下),用mkdir rootfs命令建立一个工作目录rootfs。 • 在rootfs/目录下的内容就是今后目标系统根目录(/)下的内容。 • 在当前目录下执行cd rootfs进入到rootfs目录中,然后用mkdir命令分别在rootfs目录下建立以下目录: /etc 放置系统配置文件;/sbin 放置重要的系统程序;/bin 放置系统基本应用程序; /dev 设备文件的目录;/proc proc文件系统所需目录;/lib 准备存放共享函数库;/mnt 准备挂载其他设备的目录节点/usr 准备放置用户应用程序。
第2步:建立root文件系统 • 建立目录系统 • /proc、/mnt和/usr在此情况下都是空的,只需要用mkdir创建它们即可。 • /dev:设备文件需要用mknod产生。如果简单起见用cp -dpR 参数开关来复制原系统的设备文件节点也可以,例如cp -dpR /dev/mem /mnt/dev 。至少需要console、kmem、mem、null、ram、tty*等文件。 • /etc:一般可以包含rc.d/* (系统启动脚本)、fstab(列出要登录的文件系统)、inittab(包含启动过程参数) 。
第2步:建立root文件系统 • 建立目录系统 • /bin和/sbin:这两个目录中包含有一些系统运行不可缺少的程序和大量实用程序,如ls、mv、cat、cp等。系统实用程序可以根据需要选择拷贝,而系统运行不可缺少的一些程序必须拷贝过来,如init、getty、login、mount、bash等。。 • /lib: 必须有函数库装载器,这个装载器或是ld.so (对 a.out 库) 或是 ld-linux.so (对 ELF 库)。如果有一个模块化的内核,你还得必须考虑需要加载的模块。它们都位于/lib/modules。
第2步:建立root文件系统 • 裁减root文件系统 • 动态库的裁减 • 精简系统应用程序 • 精简嵌入式系统专用程序
第2步:建立root文件系统 • 裁减root文件系统 • 动态库的裁减 • Linux的C库glibc就是系统的动态连接库,相当于Windows系统的系统dll动态连接库。 • 用软件工具扫描系统所需要的库,然后进行删减。 • 采用精简版本的C库,目前可以选择的开源动态库有libc5、uclibc、dietlibc等,但需要测试兼容性。
第2步:建立root文件系统 • 精简系统应用程序 • Shell是必须的,采用Shell脚本开发的程序因为是解释性的,所以尺寸往往只需要几百个字节,而完成相同功能的C程序编译后都至少要几KB。 • /bin和/sbin目录下的ls等各种系统实用程序需要精简
第2步:建立root文件系统 • 用busybox精简系统应用程序 • Busybox 是 Debian GNU/Linux 的Bruce Perens 首先开发的。 • Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能。 • 采用busybox作为Shell和系统实用程序的精简并不会改变系统的使用方式,因为编译busybox除了生成busybox这个可执行程序外,还为每个busybox替代的系统实用程序生成了一个符号链接。例如,对于ls实用程序,会生成符号连接ln -s /bin/busybox /bin/ls。
第2步:建立root文件系统 • 精简嵌入式系统专用程序 • 原则一,没有用处的软件一律不安装在嵌入式系统中。 • 原则二,如果某软件模块是必须的,则寻找是否有相同功能的嵌入式版本的软件可以作为其替代品。 • 如用thttpd,boa等替代庞大的Apache。 • 原则三,如果只能选择某软件模块,则通过重新配置和编译优化来进行裁减。 • 如采用动态链接库,优化编译选项等 • 原则四,对于自行开发的软件,在设计、开发和编译的时候都要针对嵌入式系统进行优化。 • 调用精简的C库函数等
第3步:制作root文件系统映像 • 集成好的root文件系统最终要安装到嵌入式系统目标板上去 。 • 精简的root文件系统其体积比起一般配备的只有十几MB字节大小的flash存储器来讲还是太大。 • flash存储器的特点不允许系统像读写磁盘驱动器那样反复读写它。 • 很多专用嵌入式Linux,如LRP等,都有自己独特的系统映像打包、组织和管理方式,但其原理都大同小异。
第3步:制作root文件系统映像 • 在开发主机中建立一个loop设备的临时挂接点,准备后面用来暂时挂载目标嵌入式系统的root文件系统: mkdir /mnt/loop • 建立一个大小为6.6MB的临时文件并将其清零。这个文件会被用来制作root文件系统的映像,因此其大小是根据前面对root文件系统裁减的情况确定的,可以根据实际情况进行调整:dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=6600 • 在开发主机上将一个loop设备与临时文件联系起来:losetup /dev/loop0 /tmp/loop_tmp • 在这个loop设备上建立文件系统,Linux内核识别两种可以直接拷贝到ramdisk的文件系统,它们是minix和ext2,ext2性能更好,因此我们建立ext2文件系统:mke2fs /dev/loop0
第3步:制作root文件系统映像 • 将loop设备上的虚拟盘挂在前面建立挂接节点/mnt/loop上:mount /dev/loop0 /mnt/loop -t ext2 • 将制作好的root文件系统所有内容拷贝到所挂载的节点上: cp -a /rootfs/* /mnt/loop • 卸下挂接点,删除建立的挂接点,再取消loop设备与临时挂接点的联系:umount /mnt/looprmdir /mnt/loop losetup -d /dev/loop0 • 压缩文件系统后,就拥有了一个目标嵌入式系统的root文件系统的压缩映像rootfs.gz,最后删除最初建立的临时文件:dd if=/tmp/loop_tmp | gzip -9 > rootfs.gzrm -f /tmp/loop_tmp • 检查压缩后的root文件映像的大小,并比较目标系统的flash尺寸,如果超出了大小,还得进一步裁减root文件系统后重新制作映像:ls –l rootfs.gz
第4步:安装引导 嵌入式Linux系统启动过程
第4步:安装引导 • 用ext2文件系统格式化flash磁盘。因为flash磁盘是装在第二个IDE接口上的,所以它是hdc设备,格式化它的第一个分区: mke2fs /dev/hdc1 • 挂载flash磁盘到开发系统上/mnt/temp的挂载节点上: mount /dev/hdc1 /mnt/temp/ • 在flash磁盘上建立用来存放映像的目录: mkdir /mnt/temp/boot mkdir /mnt/temp/etc • 拷贝先前编译好的嵌入式Linux的内核: cp /usr/src/linux/arch/i386/boot/MiniKernel /mnt/temp/boot • 拷贝安装Lilo需要的文件: cp /boot/boot.b /mnt/temp/boot/ cp /etc/lilo.conf /mnt/temp/etc/ • 拷贝已经制作好的root文件系统的映像文件: cp /rootfs/rootfs.gz /mnt/temp/
第4步:安装引导 • 安装后的根目录结构(/mnt/temp/) boot/ etc/ rootfs.gz • RAMDisk和initrd • RAMDisk就是把RAM中的一块空间拿出来作为磁盘设备来用,initrd使用了RAMDisk技术; • 使用initrd的理由: • 加载内核模块,驱动存放根文件系统的介质; • 相对于访问软盘,RAMDisk的速度快得多;
第4步:安装引导 • 一般嵌入式系统烧写flash的方法 • 用专用仪器烧写; • 启动bootloader后通过通信口烧写; • 通过BDM,JTAG等调试端口烧写 • X86系统 • CF卡或者DOM等都可以作为硬盘,通过IDE接口挂接在主机系统上进行读写。
RAMDisk和initrd • RAMDisk就是把RAM中的一块空间拿出来作为磁盘设备来用,显然这会浪费内存; • initrd使用了RAMDisk技术,常用于软盘启动中; • 使用initrd的理由: • 加载内核模块,驱动存放根文件系统的介质; • 相对于访问软盘,RAMDisk的速度快得多; • 可以将软驱空闲出来;
第4步:安装引导 Lilo.conf脚本文件 ##################begin################ default=linux boot=/dev/hdc disk=/dev/hdc install=/boot/boot.b image=/boot/MiniKernel label=linux initrd=rootfs.gz read-write root=/dev/ram0 append=" console=ttyS1,9600n8 ramdisk_size=65536 load_ramdisk=1" ################end####################