1嵌入式操作系统适用专业:物联网工程任课教师:兰方鹏联系方式:13453194233E-mail:lfp424@163.comQQ:275392011TaiyuanUniversityofTechnology太原理工大学·计算机科学与技术学院2Linux内核的裁剪与移植Linux内核简介Linux内核源码结构Linux进程通信Make工程管理器配置NFS服务器3Linux内核简介Linux体系结构图:4Linux内核简介Linux系统两大部分构成:UserSpace:用户空间KernelSpace:内核空间Linux系统为什么要划分为用户空间和内核空间呢?X86系统下的CPU具有4个不同的运行级别:Ring0-Ring3;Ring0下,可以执行特权指令,Ring3下则有很多限制。Linux系统利用了CPU的这一特性,使用了两级来分别运行应用程序和Linux内核:其目的是:使得操作系统本身得到充分的保护。5Linux内核简介Linux内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。6Linux内核简介Linux内核架构:7Linux内核简介SystemCallInterface(SCI)为用户提供了一套标准的系统调用函数来访问Linux内核,搭建了用户空间到内核空间的桥梁。ProcessManagement(PM)进程管理实现进程创建、调度、进程通信等MemoryManagement(MM)内存管理主要是控制多个进程安全地共享内存区域8Linux内核简介NetworkStack网络协议栈为Linux提供了丰富的网络协议实现DeviceDrivers(DD)Liunx内核中有大量代码都在设备驱动程序中,它们控制特定的硬件设备。9Linux内核简介VirtualFileSystem(VFS)VFS隐藏各种文件系统的具体细节,为文件操作提供统一的接口。10Linux内核源码结构目录结构Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性。11Linux内核源码结构内核代码下载地址:内核-目录结构archarch是architecture的缩写。内核所支持的每种CPU体系,在该目录下都有对应的子目录。每个CPU的子目录,又进一步分解为boot(系统引导程序)、mm(内存管理)、lib(硬件相关工具函数)和kernel(系统调用)等子目录。block部分块设备驱动程序crypto加密、压缩、CRC校验算法documentation内核的文档13Linux内核-目录结构drivers设备驱动程序。init内核初始化代码ipc进程间通信的实现代码kernelLinux大多数关键的核心功能(进程控制、调度程序、模块化)都在这个目录实现lib库文件代码14Linux内核-目录结构samples内核编程的范例scripts配置内核的脚本securitySElinux的模块sound音频设备的驱动程序vir内核虚拟机15Linux内核-目录结构net网络协议的是实现代码802appletalk8021qbridgeipv4ipv6bluetoothethernetwanrouter16Linux内核-目录结构fs存放各种文件系统的实现代码,每个子目录对应一种文件系统的实现。devpts//dev/pts虚拟文件系统ext2ext3fat//windows文件系统isofs//ISO9660光盘CDROM上的文件系统vfat//MS-DOS文件系统nfs//网络文件系统17include存放内核所需要的头文件linux//存放和平台无关的头文件asm-i386//和平台相关的头文件netvideosoundscsiconfigasmLinux内核-目录结构18Linux内核-配置内核Linux内核内核是操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。内核源代码公开linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/kernels/xxxx下找到,大部分应用软件也都是遵循GPL而设计的。19Linux内核-配置内核便于深入学习操作系统:我们可以了解系统是如何工作的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。内核源代码公开的意义修补漏洞的快速以及对最新软件技术的利用量体裁衣,定制适合自己的系统,这样就需要重新编译内核为什么要重新编译内核?自己定制编译的内核运行更快、更稳定(具有更少的代码)不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些更新的内核会支持更多的硬件,并且一般会修复老版本中发现的许多漏洞等20Linux内核-配置与编译Linux内核版本号Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用,为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树(stabletree),另一个树是非稳定树(unstabletree)或者开发树(developmenttree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发数就体现在源程序的版本号中源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳定树大1(因此,是奇数)21Linux内核-配置与编译下载最新内核:linux-3.13.6.tar.xz下载xz-5.0.3.tar.bz2解压工具,然后编译安装解压linux-3.13.6.tar.xz文件#xz-dlinux-3.13.6.tar.xz#tarxvflinux-3.13.6.tar22Linux内核-定制步骤内核定制步骤:makeclean1.清除临时文件、中间文件和配置文件removemostgeneratedfilesbutkeeptheconfigmakemrproperremoveallgeneratedfilesandconfigfilesmakedistcleanmrproper+removeeditorbackupandpathcfiles注意:以上命令的执行必须在linux-3.13.6目录下进行23内核定制步骤:2.确定目标系统的软硬件配置情况:CPU的类型、网卡型号、所需支持的协议等。makeconfig:基于文本模式的交互式配置makemenuconfig:基于文本模式的菜单型配置(推荐使用)3.使用如下命令之一配置内核:makeoldconfig:使用已有的配置文件(.config),但是会询问新增的配置选项makexconfig:图形化的配置(需要安装图形化系统)Linux内核-定制步骤24使用方向键在各个选项间移动使用“Enter”键进入下一层选项[]选项:“空”和“*”选项:“空”、“*”和“M”()选项:在你所提供的几个选项中选一项y:将这个项目编译进内核m:将这个项目编译为模块n:不选择空格:在y、m、n中切换h:显示选项的帮助信息两次ESC:返回到上层选项makemenuconfig:X86平台makemenuconfigARCH=armCROSS_COMPILE=arm-linux-ARM平台Linux内核-定制步骤25Y:编译到内核中(build-in)N:编译成模块(module),动态调用内核编译模式Linux内核-定制步骤编译策略的选择编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是使用时需要调用这些模块。26配置菜单中配置项的选择:内核配置通常在一个已有的配置文件基础上,通过修改得到新的配置文件Linux内核提供了一系列可供参考的内核配置文件,该文件位于:arch/arm/configs选择相应的配置文件拷贝过来:#cps3c6400_defconfig../../../.config#cp/boot/config-2.6.18-53.el5.config修改该配置文件#makemenuconfigARCH=armCROSS_COMPILE=arm-linux-Linux内核-定制步骤#makemenuconfig274.编译内核:makezImagemakebzImagemakeuImageARCH=armCROSS_COMPILE=XXXarm-linux-在x86平台,zImage只能用于小于512K的内核内核映像分为压缩的内核映像和未压缩的内核映像:压缩的内核映像文件名为zImage或Image,位于:arch/arm/boot/未压缩的内核映像文件名为vmlinux,位于源码树的根目录中内核定制步骤:Linux内核-定制步骤28编译内核时可能出现的问题:编译环境:VmWare的Linux+WindowsXP+vmhgfs文件共享错误描述:ln:creatingsymboliclinkXXXXXX:Operationnotsupported错误原因:由于在编译的时候,要用ln去建立一些软链接,而这些文件是从Windows中通过VMWare虚拟机共享进Linux的,而虽然此种操作在Linux系统中很常见,但Windows不支持,所以编译会报错。解决方法:把共享目录拷贝到linux系统中或者搭建samba服务器Linux内核-定制步骤295.编译内核模块:makemodules安装过程可能较长内核定制步骤:6.安装内核模块:makemodules_install这个命令实际上是把编译好的内核模块从内核源代码目录拷贝到/lib/modules目录下Linux内核-定制步骤307.制作initramdisk:mkinitrdinitrd-$version$versionmkinitrdinitrd-2.6.292.6.29$version可以通过查询/lib/modules下的目录得到内核定制步骤:initrd是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统,initrd是一个临时的文件系统,在没有存储设备的嵌入式系统中,initrd可以是永久的根文件系统。使用initrd的主要原因是在内核启动之后能够判断哪些硬件驱动需要加载,文件系统有没有问题,最终使得根分区能顺利挂载。Ubuntu、Debian使用mkinitramfs命令Linux内核-定制步骤311.拷贝内核映像文件到相应的目录cparch/x86/boot/bzImage/boot/vmlinuz-$version内核安装步骤:Linux内核-安装2.拷贝ramdisk文件到相应的目录cp$initrd/boot/3.修改配置文件修改/etc/grub.conf或者:修改/boot/grub/grub.conf32grub配置文件/etc/grub.confLinux内核-安装default