江苏科技大学通信专业嵌入式课件第8章_第1页
江苏科技大学通信专业嵌入式课件第8章_第2页
江苏科技大学通信专业嵌入式课件第8章_第3页
江苏科技大学通信专业嵌入式课件第8章_第4页
江苏科技大学通信专业嵌入式课件第8章_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重点内容:内核源码组织内核的定制Makefile定制网卡驱动内核裁剪第八章定制内核移植重点内容:第八章定制内核移植1一、Linux内核源码组织Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间。其文件结构图如图所示:一、Linux内核源码组织Linux用来支持2一、Linux内核源码组织这里有的目录是包含多个部分的内容。具体各个目录的内容组成如下:●arch:arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是IntelCPU及与之相兼容体系结构的子目录;●include:include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下;一、Linux内核源码组织这里有的目录是包含3一、Linux内核源码组织●init:init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件;●mm:mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下;●drivers:drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound;●ipc:ipc目录包含了核心进程间的通信代码;一、Linux内核源码组织●init:init目录包含核心4一、Linux内核源码组织●modules:modules目录存放了已建好的、可动态加载的模块;●fs:fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录;●Kernel:Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下;●net:net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面;一、Linux内核源码组织●modules:modules5一、Linux内核源码组织●lib:lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下;●scripts:scripts目录包含用于配置核心的脚本文件;●documentation:documentation目录下是一些文档,是对每个目录作用的具体说明。一般在每个目录下都有一个depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。一、Linux内核源码组织●lib:lib目录包含了核心的6二、内核基本配置1.内核配置系统2.Makefile3.具体配置操作4.添加自己代码二、内核基本配置1.内核配置系统7二、内核基本配置1.内核配置系统ARM-Linux内核的配置系统由三个部分组成:Makefile、配置文件和配置工具,它们之间的关系如图所示:后缀名为.in的文件为提供选项的文件,通过配置工具配置之后生成配置文件,最后按照选项来调用源码编译成待烧录到目标板的镜像文件zImage。整个过程都是由Makefile文件来调用管理的。二、内核基本配置1.内核配置系统ARM-Li8二、内核基本配置1.内核配置系统1、MakefileMakefile是Linux系统中非常重要的一个组成部分,这我们前面也有所介绍。因为在几乎每一个子目录下都会有Makefile文件。其中位于根目录下的Makefile文件是总纲式Makefile文件,其它任何Makefile文件都是直接或间接被它调用。Makefile文件定义了各个目录下文件如何被编译,并最终形成zImage文件。当然zImage文件的产生还要借助.config文件,它会告诉Makefile文件哪些文件被编译进内核,哪些源文件没有被用户选中,并不需要被编译进内核文件中。二、内核基本配置1.内核配置系统1、Makefile9二、内核基本配置1.内核配置系统2、配置文件在ARM-Linux系统中,配置文件存放在各个子目录下,它们的名字通常被称为config.in或Config.in文件,其中后缀名为in的表示的是提供选项,而后缀名为config的则是表示是表示进行选择了某些选项之后的配置文件。存放在arch/arm目录下的config.in文件为总纲领式配置文件,其它config.in文件都是直接或间接被该文件调用。这些配置文件按照一定的格式编写,用户通过特定的工具可以读这些配置文件来进行ARM-Linux系统的配置,最终配置的选项结果存放在内核根目录.config文件中。二、内核基本配置1.内核配置系统2、配置文件10二、内核基本配置1.内核配置系统3、配置工具配置工具一般包括配置命令解释器和配置用户界面。前者主要作用是对配置脚本中使用的配置命令进行解释;而后者则是提供基于字符界面、基于Ncurses图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于Makeconfig、Makemenuconfig和makexconfig。这些配置工具都是使用脚本语言,如Tcl/Tk、Perl编写的(也包含一些用C编写的代码)。二、内核基本配置1.内核配置系统3、配置工具11二、内核基本配置2.MakefileMakefile是分布在Linux内核源码的各个层次目录中,定义Linux内核的编译规则。其主要作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成Linux内核二进制文件。1、Makefile概述由于Linux内核源代码是按照树形结构组织的,所以Makefile也被分布在目录树中。Linux内核中的Makefile以及与Makefile直接相关的文件有:二、内核基本配置2.MakefileMak12二、内核基本配置2.Makefile●Makefile:顶层Makefile,是整个内核配置、编译的总体控制文件;●.config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果;●arch/*/Makefile:位于各种CPU体系目录下的Makefile,其中“*”表示不同的平台,如arch/arm/Makefile,是针对arm平台的Makefile;●各个子目录下的Makefile:比如drivers/Makefile,负责所在子目录下源代码的管理与编译;●Rules.make:规则文件,被所有的Makefile使用。二、内核基本配置2.Makefile●Makefile:顶13二、内核基本配置2.Makefile2、Makefile中的变量顶层Makefile定义并向环境中输出了许多变量,为各个子目录下的Makefile传递一些信息。有些变量,比如SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在arch/*/Makefile还作了扩充。常用的变量有以下几类:●版本信息版本信息有:VERSION,PATCHLEVEL,SUBLEVEL,EXTRAVERSION,KERNELRELEASE。二、内核基本配置2.Makefile2、Makefile14二、内核基本配置2.Makefile●CPU体系结构:ARCH。●路径信息:TOPDIR,SUBDIRS●内核组成信息:HEAD,CORE_FILES,NETWORKS,DRIVERS,LIBS●编译信息:CPP,CC,AS,LD,AR,CFLAGS,LINKFLAGS●配置变量CONFIG_*二、内核基本配置2.Makefile●CPU体系结构:AR15二、内核基本配置2.Makefile3、Rules.make变量Rules.make是编译规则文件,所有的Makefile中都会包括Rules.make。Rules.make文件定义了许多变量,最为重要是那些编译、链接列表变量,包括以下这些变量:●O_OBJS,L_OBJS,OX_OBJS,LX_OBJS:本目录下需要编译进Linux内核vmlinux的目标文件列表,其中OX_OBJS和LX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号;二、内核基本配置2.Makefile3、Rules.mak16二、内核基本配置2.Makefile●M_OBJS,MX_OBJS:本目录下需要被编译成可装载模块的目标文件列表。同样,MX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号;●O_TARGET,L_TARGET:每个子目录下都有一个O_TARGET或L_TARGET,Rules.make首先从源代码编译生成O_OBJS和OX_OBJS中所有的目标文件,然后使用$(LD)-r把它们链接成一个O_TARGET或L_TARGET。O_TARGET以.o结尾,而L_TARGET以.a结尾。二、内核基本配置2.Makefile●M_OBJS,MX_17二、内核基本配置2.Makefile4、子目录下的Makefile子目录Makefile用来控制本级目录以下源代码的编译规则。二、内核基本配置2.Makefile4、子目录下的Make18二、内核基本配置3.具体配置操作内核源码的配置文件有自己的格式,这些文件中定义了makefile的使用命令。1、配置命令在Linux内核中,配置命令有多种方式,如表所示:二、内核基本配置3.具体配置操作内核源码的配19二、内核基本配置3.具体配置操作2、配置语言配置语言在这里面使用很简单明了,主要包括: ●顶层菜单 ●询问语句 ●定义语句 ●依赖语句 ●选择语句 ●if语句 ●Source语句 ●菜单块(menublock)语句二、内核基本配置3.具体配置操作2、配置语言20二、内核基本配置3.具体配置操作3、缺省配置Linux内核支持非常多的硬件平台,对于具体的硬件平台而言,有些配置就是必需的,有些配置就不是必需的。另外,新增加功能的正常运行往往也需要一定的先决条件,针对新功能,必须作相应的配置。因此,特定硬件平台能够正常运行对应着一个最小的基本配置,这就是缺省配置。二、内核基本配置3.具体配置操作3、缺省配置21二、内核基本配置3.具体配置操作

Linux内核中针对每个ARCH都会有一个缺省配置。在向内核代码增加了新的功能后,如果新功能对于这个ARCH是必需的,就要修改此ARCH的缺省配置。二、内核基本配置3.具体配置操作Linux内22二、内核基本配置3.具体配置操作4、帮助文件在配置Linux内核时,遇到不懂含义的配置选项,可以查看它的帮助,从中可得到选择的建议。所有配置选项的帮助信息都在Documentation/Configure.help中,它的格式为:<description><variablename><helpfile>二、内核基本配置3.具体配置操作4、帮助文件23二、内核基本配置3.具体配置操作<description>给出本配置选项的名称,<variablename>对应配置变量,<helpfile>对应配置帮助信息。在帮助信息中,首先简单描述此功能,其次说明选择了此功能后会有什么效果,不选择又有什么效果。二、内核基本配置3.具体配置操作<description>24二、内核基本配置4.添加自己代码对于一个开发者来说,将自己开发的内核代码加入到Linux内核中,需要有三个步骤:1)首先确定把自己开发代码放入到内核的位置;2)其次,把自己开发的功能增加到Linux内核的配置选项中,使用户能够选择此功能;3)最后,构建子目录Makefile,根据用户的选择,将相应的代码编译到最终生成的Linux内核中去。二、内核基本配置4.添加自己代码对于一个开25三、内核定制1.源码获取2.移植过程三、内核定制1.源码获取26三、内核定制1.源码获取源码的获取有很多途径,我们可以从/pub/linux/kernel/v2.6/获取,这是Linux内核的官方网站,定期发布最新的内核,以修补Linux内核在使用中的各种bug,可以根据自己的需要下载适合自己的版本。1.源码获取三、内核定制1.源码获取源码的获取有很多途径27三、内核定制2.移植过程Linux内核的移植过程比较繁琐,具体步骤:1、解压内核文件解压文件可以点击右键,选择“extracthere”命令;也可以在终端中,输入如下命令: tarxfvlinux-2.6.29.tar.bz2然后进入内核目录,输入如下命令: cdlinux-2.6.292.移植过程三、内核定制2.移植过程Linux内核的移植28三、内核定制2、修改机器码内核的机器码必须跟Bootloader中一致,不管是u-boot还是vivi,在smdk2440使用的uboot的机器码是168,这里需要修改机器码,否则会出现不能启动的情况。机器码保存在内核源码的“arch/arm/tools/mach-types”文件中,大概在379行,把原来的数字“362”改为“168”。也可以修改uboot中的机器码,在“\include\asm-arm\mach-types.h”文件中,找到“#defineMACH_TYPE_S3C2440168”,将其中的数字“168”改成与linux内核一致的机器码,注意,这个机器码要没有使用的,否则会编译中提示冲突。然后保存即可。2.移植过程三、内核定制2、修改机器码2.移植过程29三、内核定制3、修改内核源码根目录下的Makefile文件内核的编译是根据Makefile文件中的内容进行的,所以首先需要修改根目录下的Makefile文件。更改目标代码的类型,并未编译内核指定一个编译器。修改后详细内容显示如下:#ARCH?=arm#CROSS_COMPILE?=arm-linux-

ARCH是指架构,这里我们选择arm架构,所以修改成:“#ARCH?=arm”;CROSS_COMPILE是指编译器,由于要在开发板上运行,需要使用交叉编译器,所以改为:“#CROSS_COMPILE?=arm-linnux-”。2.移植过程三、内核定制3、修改内核源码根目录下的Makefile文件30三、内核定制4、修改“arch/arm/plat-s3c24xx/common-smdk.c”文件,修改NandFlash的分区信息和NandFlash的硬件信息。这个文件的修改有两处,具体为:●smdk_default_nand_part,●smdk_nand_info2.移植过程三、内核定制4、修改“arch/arm/plat-s3c2431三、内核定制5、修改时钟频率修改平台的时钟频率,以满足smdk2440工作频率。修改内核源码,否则在超级终端中会出现乱码。6、增加Yaffs2文件系统的支持解压Yaffs2并以打补丁的方式将其加入Linux内核。最新的yaffs2源代码包可以从http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs.tar.gz?view=tar获得。具体操作命令如下:#cdyaffs2#./patch-ker.shc/(linux内核路径)2.移植过程三、内核定制5、修改时钟频率2.移植过程32三、内核定制7、配置内核先拷贝s3c2440开发板的默认配置到内核根目录下,以简化配置过程,使用如下命令:#cparch/arm/configs/s3c2440_defconfig.config#makemenuconfig2.移植过程三、内核定制7、配置内核2.移植过程33三、内核定制下面是Linxu内核的几个主要配置选项:(1) Generalsetup常规选项设置(2)SystemType:系统类型(3)Bootoptions:引导选项(4)Enableloadablemodulesupport:对模块的支持(5)DeviceDrivers:设备驱动(6)Filesystems:文件系统2.移植过程三、内核定制下面是Linxu内核的几个主要配置选项:2.移植34三、内核定制8、编译配置好编译选项之后就可以编译内核了,输入以下命令: makezImage系统就开始编译内核了。一般内核编译需要一定的时间,十几分钟到几十分钟不等,具体视个人机器而定。编译结束之后,会在“/arch/arm/boot/”目录下面和者根目录下面生成一个名为“zImage”的内核镜像文件。同时在根目录中生成另外三个文件,如图所示:2.移植过程三、内核定制8、编译2.移植过程35三、内核定制2.移植过程三、内核定制2.移植过程36三、内核定制vmlinux、System.map和initrd-x.x.x.img三种文件时Linux内核编译之后可以生成的三种镜像文件格式。这是这三个镜像文件之间略有不同,下面详细比较说明各种格式的文件特性:1、vmlinuxvmlinux是可引导的、压缩的内核。“vm”代表“VirtualMemory”。Linux支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。2.移植过程三、内核定制vmlinux、System.m37三、内核定制2、System.mapSystem.map是一个特定内核的内核符号表。它是当前运行的内核的System.map的链接。它是由“nmvmlinux”产生的,并且将不相关的符号滤除掉。3、initrd-x.x.x.imginitrd是“initialramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。例如ubuntu的initrd.img主要是用于加载ext3等文件系统及scsi设备的驱动。2.移植过程三、内核定制2、System.map2.移植过程38四、网卡驱动1.驱动源码获取2.修改驱动源码3.配置并编译四、网卡驱动1.驱动源码获取39四、网卡驱动在内核里面网卡驱动是相当完善的,这里需要注意一件事情,从2.6.25开始的内核的“drivers/net/dm9000.c”这个文件对应的DM9000的驱动(版本为1.3版)并不适合DM9000E这颗芯片,而在笔者使用的目标板上面用的是DM9000E这颗芯片,所以我们需要更换“dm9000.c”这个驱动程序,只要找到1.2版的DM9000的驱动就可以支持DM9000E这颗芯片了。1.驱动源码获取四、网卡驱动在内核里面网卡驱动是相当完善的,40四、网卡驱动我们可以从/pub/linux/kernel/v2.6/下载一个linux-2.6.24.tar.bz2的源码包,然后解压,提取“drivers/net/dm9000.c”这个文件,这个驱动文件是1.2版本的,用它去替换掉里面的对应源码即可开始进行我们的移植操作。1.驱动源码获取四、网卡驱动我们可以从ftp://ftp.k41四、网卡驱动

我们只需要进行简单的修改就可以成功的驱动上开发板上面的DM9000的网卡芯片。找到内核源码中的“arch/arm/plat-s3c24xx/common-smdk.c”文件,然后主要对它进行修改:●添加对dm9000网卡的支持(46行)●在151行左右,添加部分代码(见教材)●在199行左右,添加部分代码(见教材)●在73行添加部分代码(见教材)●在414行添加部分代码(见教材)2.修改驱动源码四、网卡驱动我们只需要进行简单的修改就可以成42四、网卡驱动●在428行添加部分代码(见教材)●在628行添加部分代码(见教材)●另外,这样编译之后网卡已经能够驱动,在linux中能正常使用,但是,如果使用nfs却不能正常下载文件系统,此时我们还必须修改dm9000.c这个文件。2.修改驱动源码四、网卡驱动●在428行添加部分代码(见教材)2.修改驱43四、网卡驱动修改完以上的内容之后,输入一下命令进行内核的重新编译: #makemenuconfig编译完成之后,进入配置单,然后添加上对DM9000网卡的配置,具体命令如下:3.配置并编译四、网卡驱动修改完以上的内容之后,输入一下命令44四、网卡驱动DeviceDrivers--->Networkdevicesupport--->Ethernet(10or100Mbit)--->-*-GenericMediaIndependentInterfacedevicesupport<*>DM9000support(4)DM9000maximumdebuglevel配置好后,保存配置单,然后重新编译出镜像,再将镜像烧写到开发板中。3.配置并编译四、网卡驱动DeviceDrivers--->3.配置45五、内核裁剪1.取消虚拟内存的支持2.取消多余的调度器3.取消对旧版本二进制执行文件的支持4.取消不必要的设备的支持5.取消不需要的文件系统的支持五、内核裁剪1.取消虚拟内存的支持46五、内核裁剪1.取消虚拟内存的支持

虚拟内存一般并不需要,可以删除。进入“Generalsetup”菜单项,将“Supportforpagingofanonymousmemory(swap)”项去选即可。具体命令显示如下:Generalsetup--->[]Supportforpagingofanonymousmemory(swap)五、内核裁剪1.取消虚拟内存的支持虚拟内存一47五、内核裁剪2.取消多余的调度器

一般我们使用的调度器是默认的IO调度器,所以可以删除其他的调度器。进入“Enabletheblocklayer”菜单项,再进入子菜单项“IOSchedulers”,将“AnticipatoryI/Oschdeuler”、“DeadlineI/Oscheduler”和“CFQI/Oscheduler”三项去选即可。具体命令显示如下:五、内核裁剪2.取消多余的调度器一般我们使用48五、内核裁剪2.取消多余的调度器-*-Enabletheblocklayer--->IOSchedulers---><>AnticipatoryI/Oscheduler<*>DeadlineI/Oscheduler<>CFQI/OschedulerDefaultI/Oscheduler(Deadline)--->五、内核裁剪2.取消多余的调度器-*-Enablethe49五、内核裁剪3.取消对旧版本二进制执行文件的支持

对旧版本二进制执行文件的支持这项功能一般也是多余的,可以删除。进入“Userspacebinaryformats”菜单项,将“Kernelsupportfora.outandECOFFbinaries”项去选即可。具体命令显示如下:Userspacebinaryformats---><>Kernelsupportfora.outandECOFFbinaries五、内核裁剪3.取消对旧版本二进制执行文件的支持50五、内核裁剪4.取消不必要的设备的支持一般对不需要的设备支持驱动也删除,这里比较多,具体的命令显示请参见教材。五、内核裁剪4.取消不必要的设备的支持一般51五、内核裁剪5.取消不需要的文件系统的支持

对多余的文件系统,我们也会将其删除以减小内核的大小。有关Linux文件系统的概念,我们将会再下一章进行具体介绍。具体命令为:Filesystems---><>Secondextendedfssupport<>Ext3journallingfilesystemsupport<>Ext4dev/ext4extendedfssupportdevelopment(EXPERIMENTAL)五、内核裁剪5.取消不需要的文件系统的支持52五、内核裁剪5.取消不需要的文件系统的支持Miscellaneousfilesystems---><>JournallingFlashFileSystemv2(JFFS2)support完成以上的优化配置有,内核镜像会由之前的1.9MB缩减到1.7MB左右。五、内核裁剪5.取消不需要的文件系统的支持Miscella53第八章定制内核移植第八章定制内核移植54重点内容:内核源码组织内核的定制Makefile定制网卡驱动内核裁剪第八章定制内核移植重点内容:第八章定制内核移植55一、Linux内核源码组织Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间。其文件结构图如图所示:一、Linux内核源码组织Linux用来支持56一、Linux内核源码组织这里有的目录是包含多个部分的内容。具体各个目录的内容组成如下:●arch:arch目录包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是IntelCPU及与之相兼容体系结构的子目录;●include:include目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在include/linux子目录下;一、Linux内核源码组织这里有的目录是包含57一、Linux内核源码组织●init:init目录包含核心的初始化代码(不是系统的引导代码),有main.c和Version.c两个文件;●mm:mm目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下;●drivers:drivers目录中是系统中所有的设备驱动程序。它又进一步划分成几类设备驱动,每一种有对应的子目录,如声卡的驱动对应于drivers/sound;●ipc:ipc目录包含了核心进程间的通信代码;一、Linux内核源码组织●init:init目录包含核心58一、Linux内核源码组织●modules:modules目录存放了已建好的、可动态加载的模块;●fs:fs目录存放Linux支持的文件系统代码。不同的文件系统有不同的子目录对应,如ext3文件系统对应的就是ext3子目录;●Kernel:Kernel内核管理的核心代码放在这里。同时与处理器结构相关代码都放在arch/*/kernel目录下;●net:net目录里是核心的网络部分代码,其每个子目录对应于网络的一个方面;一、Linux内核源码组织●modules:modules59一、Linux内核源码组织●lib:lib目录包含了核心的库代码,不过与处理器结构相关的库代码被放在arch/*/lib/目录下;●scripts:scripts目录包含用于配置核心的脚本文件;●documentation:documentation目录下是一些文档,是对每个目录作用的具体说明。一般在每个目录下都有一个depend文件和一个Makefile文件。这两个文件都是编译时使用的辅助文件。一、Linux内核源码组织●lib:lib目录包含了核心的60二、内核基本配置1.内核配置系统2.Makefile3.具体配置操作4.添加自己代码二、内核基本配置1.内核配置系统61二、内核基本配置1.内核配置系统ARM-Linux内核的配置系统由三个部分组成:Makefile、配置文件和配置工具,它们之间的关系如图所示:后缀名为.in的文件为提供选项的文件,通过配置工具配置之后生成配置文件,最后按照选项来调用源码编译成待烧录到目标板的镜像文件zImage。整个过程都是由Makefile文件来调用管理的。二、内核基本配置1.内核配置系统ARM-Li62二、内核基本配置1.内核配置系统1、MakefileMakefile是Linux系统中非常重要的一个组成部分,这我们前面也有所介绍。因为在几乎每一个子目录下都会有Makefile文件。其中位于根目录下的Makefile文件是总纲式Makefile文件,其它任何Makefile文件都是直接或间接被它调用。Makefile文件定义了各个目录下文件如何被编译,并最终形成zImage文件。当然zImage文件的产生还要借助.config文件,它会告诉Makefile文件哪些文件被编译进内核,哪些源文件没有被用户选中,并不需要被编译进内核文件中。二、内核基本配置1.内核配置系统1、Makefile63二、内核基本配置1.内核配置系统2、配置文件在ARM-Linux系统中,配置文件存放在各个子目录下,它们的名字通常被称为config.in或Config.in文件,其中后缀名为in的表示的是提供选项,而后缀名为config的则是表示是表示进行选择了某些选项之后的配置文件。存放在arch/arm目录下的config.in文件为总纲领式配置文件,其它config.in文件都是直接或间接被该文件调用。这些配置文件按照一定的格式编写,用户通过特定的工具可以读这些配置文件来进行ARM-Linux系统的配置,最终配置的选项结果存放在内核根目录.config文件中。二、内核基本配置1.内核配置系统2、配置文件64二、内核基本配置1.内核配置系统3、配置工具配置工具一般包括配置命令解释器和配置用户界面。前者主要作用是对配置脚本中使用的配置命令进行解释;而后者则是提供基于字符界面、基于Ncurses图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于Makeconfig、Makemenuconfig和makexconfig。这些配置工具都是使用脚本语言,如Tcl/Tk、Perl编写的(也包含一些用C编写的代码)。二、内核基本配置1.内核配置系统3、配置工具65二、内核基本配置2.MakefileMakefile是分布在Linux内核源码的各个层次目录中,定义Linux内核的编译规则。其主要作用是根据配置的情况,构造出需要编译的源文件列表,然后分别编译,并把目标代码链接到一起,最终形成Linux内核二进制文件。1、Makefile概述由于Linux内核源代码是按照树形结构组织的,所以Makefile也被分布在目录树中。Linux内核中的Makefile以及与Makefile直接相关的文件有:二、内核基本配置2.MakefileMak66二、内核基本配置2.Makefile●Makefile:顶层Makefile,是整个内核配置、编译的总体控制文件;●.config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果;●arch/*/Makefile:位于各种CPU体系目录下的Makefile,其中“*”表示不同的平台,如arch/arm/Makefile,是针对arm平台的Makefile;●各个子目录下的Makefile:比如drivers/Makefile,负责所在子目录下源代码的管理与编译;●Rules.make:规则文件,被所有的Makefile使用。二、内核基本配置2.Makefile●Makefile:顶67二、内核基本配置2.Makefile2、Makefile中的变量顶层Makefile定义并向环境中输出了许多变量,为各个子目录下的Makefile传递一些信息。有些变量,比如SUBDIRS,不仅在顶层Makefile中定义并且赋初值,而且在arch/*/Makefile还作了扩充。常用的变量有以下几类:●版本信息版本信息有:VERSION,PATCHLEVEL,SUBLEVEL,EXTRAVERSION,KERNELRELEASE。二、内核基本配置2.Makefile2、Makefile68二、内核基本配置2.Makefile●CPU体系结构:ARCH。●路径信息:TOPDIR,SUBDIRS●内核组成信息:HEAD,CORE_FILES,NETWORKS,DRIVERS,LIBS●编译信息:CPP,CC,AS,LD,AR,CFLAGS,LINKFLAGS●配置变量CONFIG_*二、内核基本配置2.Makefile●CPU体系结构:AR69二、内核基本配置2.Makefile3、Rules.make变量Rules.make是编译规则文件,所有的Makefile中都会包括Rules.make。Rules.make文件定义了许多变量,最为重要是那些编译、链接列表变量,包括以下这些变量:●O_OBJS,L_OBJS,OX_OBJS,LX_OBJS:本目录下需要编译进Linux内核vmlinux的目标文件列表,其中OX_OBJS和LX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号;二、内核基本配置2.Makefile3、Rules.mak70二、内核基本配置2.Makefile●M_OBJS,MX_OBJS:本目录下需要被编译成可装载模块的目标文件列表。同样,MX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号;●O_TARGET,L_TARGET:每个子目录下都有一个O_TARGET或L_TARGET,Rules.make首先从源代码编译生成O_OBJS和OX_OBJS中所有的目标文件,然后使用$(LD)-r把它们链接成一个O_TARGET或L_TARGET。O_TARGET以.o结尾,而L_TARGET以.a结尾。二、内核基本配置2.Makefile●M_OBJS,MX_71二、内核基本配置2.Makefile4、子目录下的Makefile子目录Makefile用来控制本级目录以下源代码的编译规则。二、内核基本配置2.Makefile4、子目录下的Make72二、内核基本配置3.具体配置操作内核源码的配置文件有自己的格式,这些文件中定义了makefile的使用命令。1、配置命令在Linux内核中,配置命令有多种方式,如表所示:二、内核基本配置3.具体配置操作内核源码的配73二、内核基本配置3.具体配置操作2、配置语言配置语言在这里面使用很简单明了,主要包括: ●顶层菜单 ●询问语句 ●定义语句 ●依赖语句 ●选择语句 ●if语句 ●Source语句 ●菜单块(menublock)语句二、内核基本配置3.具体配置操作2、配置语言74二、内核基本配置3.具体配置操作3、缺省配置Linux内核支持非常多的硬件平台,对于具体的硬件平台而言,有些配置就是必需的,有些配置就不是必需的。另外,新增加功能的正常运行往往也需要一定的先决条件,针对新功能,必须作相应的配置。因此,特定硬件平台能够正常运行对应着一个最小的基本配置,这就是缺省配置。二、内核基本配置3.具体配置操作3、缺省配置75二、内核基本配置3.具体配置操作

Linux内核中针对每个ARCH都会有一个缺省配置。在向内核代码增加了新的功能后,如果新功能对于这个ARCH是必需的,就要修改此ARCH的缺省配置。二、内核基本配置3.具体配置操作Linux内76二、内核基本配置3.具体配置操作4、帮助文件在配置Linux内核时,遇到不懂含义的配置选项,可以查看它的帮助,从中可得到选择的建议。所有配置选项的帮助信息都在Documentation/Configure.help中,它的格式为:<description><variablename><helpfile>二、内核基本配置3.具体配置操作4、帮助文件77二、内核基本配置3.具体配置操作<description>给出本配置选项的名称,<variablename>对应配置变量,<helpfile>对应配置帮助信息。在帮助信息中,首先简单描述此功能,其次说明选择了此功能后会有什么效果,不选择又有什么效果。二、内核基本配置3.具体配置操作<description>78二、内核基本配置4.添加自己代码对于一个开发者来说,将自己开发的内核代码加入到Linux内核中,需要有三个步骤:1)首先确定把自己开发代码放入到内核的位置;2)其次,把自己开发的功能增加到Linux内核的配置选项中,使用户能够选择此功能;3)最后,构建子目录Makefile,根据用户的选择,将相应的代码编译到最终生成的Linux内核中去。二、内核基本配置4.添加自己代码对于一个开79三、内核定制1.源码获取2.移植过程三、内核定制1.源码获取80三、内核定制1.源码获取源码的获取有很多途径,我们可以从/pub/linux/kernel/v2.6/获取,这是Linux内核的官方网站,定期发布最新的内核,以修补Linux内核在使用中的各种bug,可以根据自己的需要下载适合自己的版本。1.源码获取三、内核定制1.源码获取源码的获取有很多途径81三、内核定制2.移植过程Linux内核的移植过程比较繁琐,具体步骤:1、解压内核文件解压文件可以点击右键,选择“extracthere”命令;也可以在终端中,输入如下命令: tarxfvlinux-2.6.29.tar.bz2然后进入内核目录,输入如下命令: cdlinux-2.6.292.移植过程三、内核定制2.移植过程Linux内核的移植82三、内核定制2、修改机器码内核的机器码必须跟Bootloader中一致,不管是u-boot还是vivi,在smdk2440使用的uboot的机器码是168,这里需要修改机器码,否则会出现不能启动的情况。机器码保存在内核源码的“arch/arm/tools/mach-types”文件中,大概在379行,把原来的数字“362”改为“168”。也可以修改uboot中的机器码,在“\include\asm-arm\mach-types.h”文件中,找到“#defineMACH_TYPE_S3C2440168”,将其中的数字“168”改成与linux内核一致的机器码,注意,这个机器码要没有使用的,否则会编译中提示冲突。然后保存即可。2.移植过程三、内核定制2、修改机器码2.移植过程83三、内核定制3、修改内核源码根目录下的Makefile文件内核的编译是根据Makefile文件中的内容进行的,所以首先需要修改根目录下的Makefile文件。更改目标代码的类型,并未编译内核指定一个编译器。修改后详细内容显示如下:#ARCH?=arm#CROSS_COMPILE?=arm-linux-

ARCH是指架构,这里我们选择arm架构,所以修改成:“#ARCH?=arm”;CROSS_COMPILE是指编译器,由于要在开发板上运行,需要使用交叉编译器,所以改为:“#CROSS_COMPILE?=arm-linnux-”。2.移植过程三、内核定制3、修改内核源码根目录下的Makefile文件84三、内核定制4、修改“arch/arm/plat-s3c24xx/common-smdk.c”文件,修改NandFlash的分区信息和NandFlash的硬件信息。这个文件的修改有两处,具体为:●smdk_default_nand_part,●smdk_nand_info2.移植过程三、内核定制4、修改“arch/arm/plat-s3c2485三、内核定制5、修改时钟频率修改平台的时钟频率,以满足smdk2440工作频率。修改内核源码,否则在超级终端中会出现乱码。6、增加Yaffs2文件系统的支持解压Yaffs2并以打补丁的方式将其加入Linux内核。最新的yaffs2源代码包可以从http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs.tar.gz?view=tar获得。具体操作命令如下:#cdyaffs2#./patch-ker.shc/(linux内核路径)2.移植过程三、内核定制5、修改时钟频率2.移植过程86三、内核定制7、配置内核先拷贝s3c2440开发板的默认配置到内核根目录下,以简化配置过程,使用如下命令:#cparch/arm/configs/s3c2440_defconfig.config#makemenuconfig2.移植过程三、内核定制7、配置内核2.移植过程87三、内核定制下面是Linxu内核的几个主要配置选项:(1) Generalsetup常规选项设置(2)SystemType:系统类型(3)Bootoptions:引导选项(4)Enableloadablemodulesupport:对模块的支持(5)DeviceDrivers:设备驱动(6)Filesystems:文件系统2.移植过程三、内核定制下面是Linxu内核的几个主要配置选项:2.移植88三、内核定制8、编译配置好编译选项之后就可以编译内核了,输入以下命令: makezImage系统就开始编译内核了。一般内核编译需要一定的时间,十几分钟到几十分钟不等,具体视个人机器而定。编译结束之后,会在“/arch/arm/boot/”目录下面和者根目录下面生成一个名为“zImage”的内核镜像文件。同时在根目录中生成另外三个文件,如图所示:2.移植过程三、内核定制8、编译2.移植过程89三、内核定制2.移植过程三、内核定制2.移植过程90三、内核定制vmlinux、System.map和initrd-x.x.x.img三种文件时Linux内核编译之后可以生成的三种镜像文件格式。这是这三个镜像文件之间略有不同,下面详细比较说明各种格式的文件特性:1、vmlinuxvmlinux是可引导的、压缩的内核。“vm”代表“VirtualMemory”。Linux支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。2.移植过程三、内核定制vmlinux、System.m91三、内核定制2、System.mapSystem.map是一个特定内核的内核符号表。它是当前运行的内核的System.map的链接。它是由“nmvmlinux”产生的,并且将不相关的符号滤除掉。3、initrd-x.x.x.imginitrd是“initialramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。例如ubuntu的initrd.img主要是用于加载ext3等文件系统及scsi设备的驱动。2.移植过程三、内核定制2、System.map2.移植过程92四、网卡驱动1.驱动源码获取2.修改驱动源码3.配置并编译四、网卡驱动1.驱动源码获取93四、网卡驱动在内核里面网卡驱动是相当完善的,这里需要注意一件事情,从2.6.25开始的内核的“drivers/net/dm9000.c”这个文件对应的DM9000的驱动(版本为1.3版)并不适合DM9000E这颗芯片,而在笔者使用的目标板上面用的是DM9000E这颗芯片,所以我们需要更换“dm9000.c”这个驱动程序,只要找到1.2版的DM9000的驱动就可以支持DM9000E这颗芯片了。1.驱动源码获取四、网卡驱动在内核里面网卡驱动是相当完善的,94四、网卡驱动我们可以从/pub/linux/kernel/v2.6/下载一个linux-2.6.24.tar.bz2的源码包,然后解压,提取“drivers/net/dm9000.c”这个文件,这个驱动文件是1.2版本的,用它去替换掉里面的对应源码即可开始进行我们的移植操作。1.驱动源码获取四、网卡驱动我们可以从ftp://ftp.k95四、网卡驱动

我们只需要进行简单的修改就可以成功的驱动上开发板上面的DM9000的网卡芯片。找到内核源码中的“arch/arm/plat-s3c24xx/common-smdk.c”文件,然后主要对它进行修改:●添加对dm9000网卡的支持(46行)●在151行左右,添加部分代码(见教材)●在199行左右,添加部分代码(见教材)●在73行添加部分代码(见教材)●在414行添加部分代码(见教材)2.修改驱动源码四、网卡驱动我们只需要进行简单的修改就可以成96四、网卡驱动●在428行添加部分代码(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论