《Linux内核解读.ppt》由会员分享,可在线阅读,更多相关《Linux内核解读.ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Linux内核编译移植课程主要内容n什么是内核(扩展)n内核定义n内核的类型nLinux内核的启动过程n内核的组成部分n内核的五大功能模块n内核代码结构的简要剖析n如何进行内核移植(书本第六章内容)什么是内核n内核是操作系统最基本的部分。n内核通常提供一种硬件抽象的方法来完成应用程序对计算机资源的访问。n内核为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。什么是内核n增强型计算机(对于应用程序)n资源管理器(对于程序)n库内核的类型n微内核只有最基本的功能直接由中央内核(微内核)实现,所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。应用:机器人
2、、医疗器械n宏内核-linux内核内核的全部代码,包括所有子系统都打包到一个文件中Linux的启动过程n引导加载程序(Bootloader)nLinux内核n文件系统n应用程序linux内核的组成部分Linux的主要组成部分n系统调用接口n进程管理n内存管理n虚拟文件系统n网络堆栈n设备驱动程序n依赖体系结构代码系统调用接口nSCI层提供了某些机制执行从用户空间到内核的函数调用。在./linux/kernel中您可以找到SCI的实现,并在./linux/arch中找到依赖于体系结构的部分。进程管理n进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据
3、、堆栈和CPU寄存器)。在用户空间,通常使用进程这个术语,不过Linux实现并没有区分这两个概念(进程和线程)。内核通过SCI提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec或PortableOperatingSystemInterfacePOSIX函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal或者POSIX机制)。进程管理n进程管理还包括处理活动进程之间共享CPU的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争CPU,这种算法都可以在固定时间内进行操作。这种算法就称为O(1)调度程序,这个名字就表示它调度多个线程所使用的时
4、间和调度一个线程所使用的时间是相同的。O(1)调度程序也可以支持多处理器(称为对称多处理器或SMP)。您可以在./linux/kernel中找到进程管理的源代码,在./linux/arch中可以找到依赖于体系结构的源代码。内存管理n内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是4KB)。Linux包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。n不过内存管理要管理的可不止4KB缓冲区。Linux提供了对4KB缓冲区的抽象,例如slab分配器。这种内存管理模式使用4KB缓冲区为基数,然后从中
5、分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。n为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在./linux/mm中找到。虚拟文件系统n虚拟文件系统(VFS)是Linux内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS在SCI和内核所支持的文件系统之间提供了一个交换层虚拟文件系统n在VFS上面,是对诸如open、close、read和write之类的
6、函数的一个通用API抽象。在VFS下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过50个)的插件。文件系统的源代码可以在./linux/fs中找到。n文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。网络堆栈n网络堆栈在设计上遵循模拟协议本身的分层体系结构。回想一下,InternetProtocol(IP)是传输协议(通常称为传输控制协议或TCP)下面的核心网络层协议。TCP上面是
7、socket层,它是通过SCI进行调用的。nsocket层是网络子系统的标准API,它为各种网络协议提供了一个用户接口。从原始帧访问到IP协议数据单元(PDU),再到TCP和UserDatagramProtocol(UDP),socket层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在./linux/net中找到。设备驱动程序nLinux内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。Linux源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备,例如Bluetooth、I2C、serial等。设备驱动程序的代码可以在./lin
8、ux/drivers中找到。依赖体系结构的代码n尽管Linux很大程度上独立于所运行的体系结构,但是有些元素则必须考虑体系结构才能正常操作并实现更高效率。./linux/arch子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了BSP)。对于一个典型的桌面系统来说,使用的是i386目录。每个体系结构子目录都包含了很多其他子目录,每个子目录都关注内核中的一个特定方面,例如引导、内核、内存管理等。这些依赖体系结构的代码可以在./linux/arch中找到。Linux内核源码的组成部分n/Linux2.6.30.4n-+-/arch存放体系结构的源代码n|
9、-/document存放一些说明文档n|-/drivers存放驱动程序源代码n|-/fs存放支持文件系统的源代码n|-/include包括编译核心所需要的大部分头文件n|-/init包含核心的初始化代码(不是系统引导代码)n|-/ipc核心进程间通信的代码n|-/kernel内核管理的核心代码n|-/lib核心库代码n|-/mm独立于cpu结构的内存管理代码Linux内核源码的组成部分n|-/net核心的网络部分代码n|-/scripts包含用于配置核心的脚本文件n|-/block块设备的I/O调度n|-/cypto常用加密和散列算法n|-/security主要包含Selinux模块n|-/s
10、ound音频设备的驱动核心代码n|-/usr实现了用于打包和压缩的cpio等n|-/makefile编译规则文件n|-/config配置文件Linux内核源码解压后示意图Linux内核移植n为什么要进行内核移植?n什么叫移植n所谓移植,是指要在一个全新研发的硬件上跑Linux,对内核代码所做的修改n内核移植的作用n为所要运行该内核的硬件平台制定合适的内核代码n为该内核添加对文件系统的支持n裁剪不用的模块n增加必须的模块如何进行linux内核移植(书本第六章)nNANDFLASH分区n配置内核n内核编译n下载内核到开发板NANDFLASH分区nNANDFLASH的作用NANDFLASH共有64M
11、,用于存储开发板的引导程序、内核、文件系统(相当于计算机的硬盘)n为什么要指明NANDFLASH的分区情况n传统磁盘:分区靠分区表,即partitiontablenNANDFLASH:分区需要在内核代码中指明n如何进行NANDFLASH分区(参考P134,表6.1)n如何进行分区修改:修改/linux-2.6.22.1/arch/arm/plat-s3C24XX/common-smdk.c文件n禁止内核ECC校验(书本P136)配置内核n修改makefilen添加devfs配置(2.6以后的内核版本取消此选项)n配置内核选项注:实验以及课程设计中所涉及的开发板安装的内核版本为linux2.6.
12、30.4配置内核-修改makefile文件(P137)n修改makefile文件的目的-指明使用的编译器是交叉编译器!n修改参数ARCH和CROSS_COMPILEnARCH参数表明要内核运行的目标是ARM体系nCROSS参数表明编译此内核需要使用交叉编译器是arm-linux-前缀的交叉编译器n注意:如果需要使用特殊指定的交叉编译器(不是用PATH路径下指定下的),可以用绝对路径方式,(书P137)配置内核选项n为什么要进行配置(补充)n配置方法n启动界面n读取已有的配置文件n选择具体的配置选项配置内核选项-为什么要进行内核配置(补充)n要使得标准内核源代码能够生成特殊的目标文件n从标准-特
13、殊:所以要进行配置配置内核选择-内核配置的方法(P138)nmakeconfig:命令行模式的配置方法nmakeoldconfig:利用已有的.config文件nmakemenuconfig:文本菜单式配置,实验中采用更的方法(如果.config文件存在,使用.config的默认配置)nmakexconfig:图形化界面的配置方法,可通过鼠标进行配置,需要XWindow的支持(如果.config文件存在,使用.config的默认配置)注意:无论何种方法,都是为了修改生成linux目录下的.config文件利用makemenuconfig启动配置界面n命令rootlocal#cdlinux-2.
14、6.22.1(实验为linux2.6.30.4)rootlocal#makemenuconfig利用文本菜单的方式进行配置n结果-启动配置界面,如下图读取已有的配置文件n作用:先利用默认的配置文件,进行初步配置n命令:n书本上的方法:1.按LoadanAlternateConfiguationFile回车后输入./arch/arm/configs/S3c2440_deconfig.config;然后保存2.直接用命令rootlocal#cparch/arm/configs/S3c2440_deconfig.config.config两种方法实现一个目的:将S3C2440_deconfig.co
15、nfig文件保存成为.config的配置文件读取已有的配置文件n命令(接上页)n实验四的方法:1.按LoadanAlternateConfiguationFile回车后输入./config_EmbedSky_A70_256MB;然后保存2.直接用命令rootlocal#cpconfig_EmbedSky_A70_256MB.config两种方法实现一个目的:将config_EmbedSky_A70_256MB文件保存成为.config的配置文件选择具体的配置选项-在默认配置下做进一步修改n主菜单配置选项:参考P140n注意:n*表示该选项加入内核编译n表示不选择该选项nM表示该选项作为模块编译
16、进内核,即可以动态加载和卸载该模块(此种方式针对某个设备,在设备驱动的后续课程中会做进一步讲解)选择具体的配置选项-关键选项配置n配置加载模块选项(Loadablemodulesupport)n配置系统类型(systemtype)*DMA是S3C2440数据读取的一种方式n修改启动参数(BootOption)n配置MTD(DeviceDriversMemoryTechnologyDevice(MTD)*MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。选择具体的配置选项-关键选项配置n配置FrameBuffer*framebuffer是用于
17、用来一个视频输出设备从包含完整的帧数据的一个内存缓冲区中来驱动一个视频显示设备。*framebuffer就相当于一个相框!n配置文件系统(filesystems)*书本上使用的根文件系统为cramfs,而实验四、课程设计的根文件系统格式为yaffs*加入对NFS的支持(无论是书本还是实验均要加入此支持,因为根文件系统的调试为NFS挂载调试,所以需要添加对NFS的支持)内核编译n编译的作用:将配置完成后的源代码编译成为目标文件n编译前的清除P145n如果不是第一次编译,需要清除以前编译的结果,运行makeclean命令n编译zImagen编译和安装模块n如何处理编译出错内核编译-编译zImage
18、nzImage是什么:目标文件的压缩包-术语:内核压缩镜像文件n运行的命令:rootlocallinux2.6.30.4#makezImagen结果下载内核到开发板(实验)n开发板进入NORFLASH模式n连接超级终端n连接USB线n安装开发板的USB驱动n超级终端上输入指令n利用DNW工具从USB线上将内核烧进开发板Linux内核移植实例1n嵌入式视频监控系统n硬件平台:ARM9(TQ2440)、摄像头ov965n外部模块:摄像头、USB接口n该项目中内核移植的任务(linux2.6.30.4)n基本修改n硬件平台信息修改:使得编译后的linux内核可以运行在该硬件平台nNandflash信
19、息修改n机器时钟及LCD屏幕等基本信息修改等n添加对文件系统的支持(yaffs或cramfs)*添加摄像头驱动模块(特)*添加USB驱动模块(特)注释:标注“特”的点为该实验相对其他基本实验特别需要做的地方。Linux内核移植实例1n移植内核和根文件系统准备工作n修改Linux源码中参数n配置Linux内核(makemenuconfig)n对比windows中的msconfign编译内核配置内核模块的功能nmakemenuconfig(文本选单的配置方式,在有字符终端下才能使用)nmakexconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)nmak
20、eoldconfig(文本配置方式,在原内核配置的基础修改时使用移植内核和根文件系统准备工作n移植内核前,保证你已经装上了Linux系统,建立好了交叉编译环境,以及相应的交叉编译工具用,如:arm-linux-gcc-4.3.2。nLinux系统nLinux内核n交叉编译工具链nyaffs2代码:进入http:/www.aleph1.co.uk/cgi-bin/viewcvs.cgi/,点击“DownloadGNUtarball”,下载后出现cvs-root.tar.gz压缩包。nbusybox-1.13.3n根文件系统制作工具:下载根文件系统制作工具mkyaffs2image.tgzn根文件
21、系统n硬件平台修改Linux源码中参数n解压内核源码:tarn修改NANDFLASH分区n修改makefilen修改平台输入时钟n修改machine名称(可以不改)n修改Nandflash分区信息n修改LCD背光nLCD参数修改n给内核打yaffs2文件系统的补丁n修改S3C2440的机器号修改makefilen进入内核目录,修改makefile,并对内核进行默认配置进行修改n193行,修改nARCH?=armnCROSS_COMPILE?=arm-linux-修改平台输入时钟n找到内核源码arch/arm/mach-s3c2440/mach-smdk2440.c文件,在函数staticvoi
22、d_initsmdk2440_map_io(void)中,修改成s3c24xx_init_clocks(12000000)。修改machine名称(可以不改)n修改文件arch/arm/mach-s3c2440/mach-smdk2440.c,在文件中找到MACHINE_START(),修改为MACHINE_START(S3C2440,“Study-S3C2440”)。修改Nandflash分区信息n修改文件kernel.git/arch/arm/plat-s3c24xx/common-smdk.c。n第一,修改分区信息:nstaticstructmtd_partitionsmdk_defau
23、lt_nand_part=n0=n.name=bootloader,n.offset=0 x00000000,n.size=0 x00030000,n,n1=n.name=kernel,n.offset=0 x00050000,n.size=0 x00200000,n,n2=n.name=root,n.offset=0 x00250000,n.size=0 x03dac000,nn;n第二,再修改s3c2410_platform_nand_smdk_nand_infosmdk_nand_info=nn.tacls=0,n.twrph0=30,n.twrph1=0,nn;修改LCD背光n修改文件
24、/arch/arm/mach-s3c2440/mach-smdk2440.c例:因为友善的3.5寸液晶的背光控制是由S3C2440的GPG4引脚来控制的,故下面的改动将开启背光。nstaticvoid_initsmdk2440_machine_init(void)nns3c24xx_fb_set_platdata(&smdk2440_fb_info);nplatform_add_devices();ns3c2410_gpio_cfgpin(S3C2410_GPG4,S3C2410_GPG4_OUTP);ns3c2410_gpio_setpin(S3C2410_GPG4,1);smdk_mach
25、ine_init();n给内核打yaffs2文件系统的补丁n要完成以下任务:(1)修改内核fs/Kconfig增加一行:sourcefs/yaffs2/Kconfig(2)修改内核fs/Kconfig增加一行:ojb-$(CONFIG_YAFFS_FS)+=yaffs2/(3)在内核fs/目录下创建yaffs2目录将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;将yaffs2源码目录的Kconfig文件复制到内核fs/yaffs2目录下;将yaffs2源码目录下的*.c*.h文件复制到内核fs/yaffs2目录下.扩展知识:Fs文件夹
26、存放是linux系统所支持的文件系统代码和各种类型的文件操作代码修改S3C2440的机器号n由于Bootloader传递给Linux内核的机器号为782,为与Bootloader传递参数一致,修改arch/arm/tools/math-types文件。ns3c2440ARCH_S3C2440S3C2440362n修改为:ns3c2440ARCH_S3C2440S3C2440782配置Linux内核-运行makemenuconfign修改.confign配置内核模块的功能n配置模块信息n配置系统类型n配置内核特征n配置启动信息n配置二进制信息n选择相应的文件类型n选择设备驱动信息修改.confi
27、gn进入Linux-2.6.29.1内核主目录,通过以下命令将2410的默认配置文件写到当前目录下的.config。S3C2410的配置和S3C2440差不多,在这基础上进行修改。makes3c2410_defconfig配置内核模块的功能nmakemenuconfig(文本选单的配置方式,在有字符终端下才能使用)nmakexconfig(图形窗口模式的配置方式,图形窗口的配置比较直观,必须支持Xwindow下才能使用)nmakeoldconfig(文本配置方式,在原内核配置的基础修改时使用配置模块信息n*Enableloadablemodulesupport-*Forcedmoduleloa
28、ding*Moduleunloading配置系统类型nSystemType-S3C2410Machines-*SMDK2410/A9M2410选上其余不选nS3C2440Machines-*SMDK2440*SMDK2440withS3C2440CPUmodule,其余不选其余的Machines下选项全部不选(如2400,2412,2442,2443)配置内核特征nKernelFeatures-*UsetheARMEABItocompilethekernel选择启动信息nBootoptions-?noinitrdroot=/dev/mtdblock2init=/linuxrcconsole=t
29、tySAC0选择用户空间二进制存储格式nUserspacebinaryformats-*KernelsupportforELFbinaries选择支持yaffs2文件系统nFilesystem-nMiscellaneousfilesystems-nYAFFS2filesystemsupportn*LetsYaffsdoitsownECCnNativelanguagesupportnCodepage437(UnitedStates,Canada)nSimplifiedChinesecharset(GB2312)nTraditionalChinesecharset(Big5)nNLSISO8859
30、-1(Latin1:WesternEuropeanLanguages)nNLSUTF-8选择设备驱动信息nDeviceDrivers-nGraphicssupport-nSupportforframebufferdevices-n*EnablefirmwareEDIDn*EnableVideoModeHandlingHelpersnS3C2410LCDframebuffersupportnConsoledisplaydriversupport-nFramebufferConsolesupportn*Selectcompiled-infontsn*VGA8x8fontn*VGA8x16fontn
31、*Bootuplogo-n*StandardblackandwhiteLinuxlogon*Standard16-colorLinuxlogon*Standard224-colorLinuxlogon在Bootuplogo-选择的那几项,将会在系统启动时在液晶上显示开机logo。(1)makeclean:清楚当前环境(2)makedep:设置变量依赖关系(3)makezImage:编译内核,生成zImage编译命令编译命令makedepnmakedep的意思就是说:如果你使用程序A(比如支持特殊设备),而A需用到B(比如B是A的一个模块/子程序)。而你在做makeconfig的时候将一个设备的
32、驱动由内核支持改为module,或取消支持,这将可能影响到B的一个参数的设置,需重新编译B,重新编译或连接A.如果程序数量非常多,你是很难手工完全做好此工作的。makedep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要编译。所以,你要makedep。makecleann清除一些以前留下的文件,比如以前编译生成的目标文件,这一步必须要进行。否则,即使内核配置改动过,编译内核时还是将原来生成的目标文件进行连接,而不生成改动后的文件。makezImagenLinux内核有两种映像:一种是非压缩内核,叫Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩形成的,所以它的大小比Image小。但为了能使用zImage,必须在它的开头加上解压缩的代码,将zImage解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的,所以一般的嵌入式系统均采用压缩内核的方式。n编译完成后,会在内核目录arch/arm/boot/下生成zImage内核映像文件。