收藏 分销(赏)

Linux内核和结构.ppt

上传人:快乐****生活 文档编号:5887444 上传时间:2024-11-22 格式:PPT 页数:134 大小:1.54MB
下载 相关 举报
Linux内核和结构.ppt_第1页
第1页 / 共134页
Linux内核和结构.ppt_第2页
第2页 / 共134页
Linux内核和结构.ppt_第3页
第3页 / 共134页
Linux内核和结构.ppt_第4页
第4页 / 共134页
Linux内核和结构.ppt_第5页
第5页 / 共134页
点击查看更多>>
资源描述

1、,第,10,章,Linux,内核的移植,ARM,原理与应用,上讲知识回顾,实验,6 GPIO,编程,本讲学习内容,10.1 Linux,移植概述,1,),Linux,移植的概念,2,),Linux,移植的准备,3,)移植过程的基本内容,10.2 Linux,内核和结构,1,),Linux,内核概念,2,),Linux,内核的结构,3,)嵌入式,Linux,的代码结构,要求理解移植的概念,掌握,Linux 2.4,和,2.6,移植的方法,10.1.1 Linux,移植的概念,Linux,移植就是把,Linux,操作系统针对具体的目标平台做必要改写之后,安装到该目标平台,使其正确地运行起来,即把内

2、核从一种硬件平台转移到另外一种硬件平台上运行。,10.1 Linux,移植概述,对于嵌入式,Linux,系统来说,有各种体系结构的处理器和硬件平台,并且用户需要根据需求自己定制硬件板。只要硬件平台有变化,即使是非常小的变化,也需要做一些移植工作。,内核移植工作主要是,修改跟硬件平台相关的代码,一般不涉及,Linux,内核通用的程序,。移植的难度也取决于两种硬件平台的差异。,Linux,针对于特定的硬件平台的软件包叫做,BSP,(,Board Support Package,)。,目前,Linux,内核的社区已经对常见的硬件平台做了很多工作,移植工作已经简单了。,通常都可以找到相同处理器的参考板

3、,并且可以获取到,Linux,内核源代码。,10.1.2 Linux,移植的准备,移植之前,需要做一些准备工作:,1,)选择参考板,获取,Linux,内核源代码。,2,)分析内核代码,弄清楚哪些设备有驱动程序,哪些还没有。确信,Linux,对参考板的支持情况,配置编译,Linux,内核,在目标板上运行测试。最新的,Linux,内核版本对开发板可能支持得最好,但是也可能需要在老内核版本上打补丁。,分析平台相关的部分代码实现;,分析内核编译组织方式;,分析内核启动的初始化程序;,分析驱动程序的实现。,10.1.3,移植过程的基本内容,1),获取某一版本的,Linux,内核源码,2),根据具体目标平

4、台对源码进行必要的改写(主要是修改体系结构相关部分),3),添加一些外设的驱动,打造一款适合需要的目标平台的新操作系统,4),对该系统进行针对具体目标平台的交叉编译,,生成一个内核映象文件,5),通过一些手段把该映象文件烧写(安装)到目标平台中。,通常,对,Linux,源码的改写工作难度较大,:,1),要求对,Linux,内核结构要非常熟悉,2),要求对目标平台的硬件结构要非常熟悉,3),要求对相关版本的汇编语言较熟悉,4),开发者所要做的就是从目标平台提供商的网站上下载相关版本,Linux,内核的补丁(,Patch,)。,5),把它打到,Linux,内核上,再进行交叉编译就行。,10.2.1

5、 Linux,内核概念,内核,(,kernel,)是操作系统的内部核心程序,它向外部提供了对计算机系统资源进行请求和管理的调用接口和服务。,内核,是一个操作系统的核心,它负责,管理系统的进程、内存、设备驱动程序、文件和网络系统,,决定着系统的性能和稳定性。,10.2 Linux,内核和结构,Linux,内核,以独占的方式执行最底层任务,保证系统正常运行,协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等。,在,Linux,操作系统中,可以将操作系统的代码分成两部分:,1),内核所在的地址空间称为,内核空间,;,2),在内核以外,剩下的程序统称为外部管理程

6、序,它们大部分是对外围设备的管理和界面操作,外部管理程序与用户进程所占据的地址空间称为,外部空间,。,通常,一个程序会跨越两个空间。,当执行到内核空间的一段代码时,称程序处于,内核态,当程序执行到外部空间代码时,称程序处于,用户态,。,在普通单一内核系统中,所有内核代码都是被静态编译和链接的。,在,Linux,中,可以动态装入和卸载内核中的部分代码。,Linux,中将这样的代码段称做,模块,(,module,),并对模块给予了强有力的支持。在,Linux,中,可以在需要时自动装入和卸载模块。,2.Linux,内核的结构,Linux,内核主要由,5,个模块构成,它们分别是:,(,1,)进程调度模

7、块,:控制进程对,CPU,资源的使用。,(,2,)内存管理模块,:确保所有进程能够安全地共享机器主内存区;虚拟内存管理。,(,3,)文件系统模块,:支持对外部设备的驱动和存储。,(,4,)进程间通信模块:,支持多种进程间的信息交换方式。,(,5,)网络接口模块:,提供对多种网络通信标准的访问并支持许多网络硬件。,Linux,内核结构如下图所示。,系统中能够随机(不需要按顺序)访问固定大小数据片(,chunks,)的设备被称作,块设备,,这些数据片就称作块。最常见的块设备是,硬盘,,除此以外,还有,软盘驱动器、,CD-ROM,驱动器和闪存,等等许多其他块设备。注意,它们都是以安装文件系统的方式使

8、用的,这也是块设备的一般访问方式。,另一种基本的设备类型是,字符设备,。字符设备按照字符流的方式被有序访问,像串口和键盘就都属于字符设备。如果一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备;反过来,如果一个设备是随机(无序的)访问的,那么它就属于块设备。,所有的模块都与进程调度模块存在依赖关系。因为它们都需要依靠进程调度程序来挂起(暂停)或重新运行它们的进程。通常,一个模块会在等待硬件操作期间被挂起,而在操作完成后才可继续运行。,进程调度子系统,需要使用内存管理器来调整一特定进程所使用的物理内存空间。,进程间通信子系统,则需要依靠内存管理器来支持共享内存通信机制。,虚拟文件系

9、统,也会使用网络接口来支持网络文件系统(,NFS,),同样也能使用内存管理子系统来提供内存虚拟盘(,ramdisk,)设备。,内存管理子系统,也会使用文件系统来支持内存数据块的交换操作。,Linux,内核模块之间的依赖关系如下图 所示。,3.,嵌入式,Linux,的代码结构,Linux,的最大优点就是它的源码公开。但是,随着,Linux,的发展,现在的,Linux,内核代码高达上百万行,如果对内核的代码结构一无所知的话,那么这个工作是不可能完成的。因此对内核代码结构的了解非常重要。,安装好的,Linux,或从,www.kernel.org,等内核网站下载的,Linux,内核,展开后都在一个名为

10、,Linux,的目录中。,1),该目录下的,ReadMe,,该文件对,Linux,内核安装、,编译、配置方法等的简单介绍;,2),该目录下的,Makefile,是第一个,Makefile,文件,用来组织内核的各模块,记录各模块相互之间的联系和依赖关系,编译时使用。,仔细阅读各子目录下的,Makefile,文件对弄清各个文件之间的联系和依赖关系很有帮助。,内核源代码布局:,安装的时候,如果选择了,Kernel Develop,,则会在,/usr/scr/linux,下找到源代码。根据各个目录的名字,可以容易猜出各个目录里面的文件的功能。,Linux2.4.x,/,arch,/drivers,/,

11、fs,/include,/Documentation,/,ipc,/kernel,/lib,/mm,/init,/,net,/scripts,/,arm,/alpha,/m68k,/boot,/mach-,pxa,/kernel,/lib,/mm,/,asm,-arm,/,linux,/net,/arch-,pxa,/proc-,armv,Rules.make,:,各种,Makefile,所使用的一些共同规则。,documentation/,:,文档目录,没有内核代码。,arch/,:,包括了所有和体系结构相关的核心代码。,每一个子目录都代表一种支持的体系结构,例如,m68k,就代表由,Fre

12、esale,开发的,68000,系列,CPU,。,linux,内核庞大,结构复杂,对,linux,内核的统计:接近,1,万个文件,,4,百万行代码。,drivers/,:,放置系统所有的设备驱动程序,包括各种块设备和字符设备的驱动程序。,每种驱动程序各占用一个子目录,如,/block,下为块设备驱动程序,即,ide(ide.c,),。,fs,/,:,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录都支持一个文件系统,如,FAT,和,Ext2,。还有一些共同的源程序则用于“虚拟文件系统,VFS”,。,include/,:,包括编译核心所需要的大部分头文件。与平台无关的头文件在,inc

13、lude/linux,子目录下,与,Intel CPU,相关的头文件在,include/asm-i386,子目录下,而,include/scsi,目录则是有关,scsi,设备的头文件目录。,通用的子目录,asm,则根据系统的配置而“符号连接”到具体,CPU,的专用子目录,如,asm-i386,、,asm-m68k,等。除此之外,还有通用的子目录,Linux,、,net,等。,init/,:,包含核心的初始化代码,(,注意:不是系统的引导代码,),,即内核的,main(),函数及其初始化过程,包含两个文件,main.c,和,Version.c,,这是研究核心如何工作的起点之一。,ipc,/,:,

14、包含核心的进程间通信的代码,,包括,util.c,、,sem.c,、,msg.c,等文件。,kernel/,:,主要的核心代码,,此目录下的文件实现了大多数,Linux,系统的内核函数,其中最重要的文件当属,sched.c,;同样,和体系结构相关的代码在,arch/*/kernel,中。,lib/,:,放置核心的库代码。,mm/,:,包括所有独立于,CPU,体系结构的内存管理代码,,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于,arch/*/mm/,,如,arch/i386/mm/Fault.c,。,modules/,:,模块文件目录,一般为空目录,用于存放编译时产生

15、的模块目录文件。,net/,:,内核与网络相关的代码,包含了各种不同网卡和网络规程的驱动程序。,scripts/,:,用于系统配置的命令文件,为脚本文件,用于对核心的配置。,Linux 2.4,内核配置、编译概述,1)Linux,内核的配置,Linux,内核的配置系统由三个部分组成,:,Makefile,:分布在,Linux,内核源代码中的,Makefile,,定义,Linux,内核的编译规则。,配置文件,(,config.in,Kconfig,):给用户提供配置选择的功能。,配置工具,10.3 Linux 2.4,内核的移植,包括配置命令解释器(对配置脚本中使用的配置命令进行解释)。配置用户

16、界面主要有三种:,(,1,)基于字符的界面,makeconfig,;,(,2,)基于,Ncurses,的文本模式图形用户界面,makemenuconfig,;,(,3,)基于,Xwindows,图形界面的用户配置界面,makexconfig,。,从,GCC,的编译到,Makefile,的引入,一、确认已经装好了,GCC,和,Make,的软件包,可以使用,whereis,命令查看:,如果,whereis gcc,和,whereis,make,命令有结果,说明安装了这两个软件,可以继续往下做。,从,GCC,的编译到,Makefile,的引入,二、使用,GCC,编译运行一个,HelloWorld,程

17、序(只涉及单个文件),可以在任何一个目录编写,C,程序然后编译运行,我这个实例在自己主目录进行:,然后就进入了编写程序的界面:,按回车退出,vim,编辑器,退回到终端,以下是之后的编译运行截图:,三、使用,GCC,编译运行一个多文件程序(包含主程序和子程序),这里我们要写两个,C,程序文件,一个文件里面写个被调函数,另外一个文件中,main,函数调用第一个文件的函数,如下所示:,ex_display.c,的代码如下,同样的写完后,ESC,然后输入,:wq,退出:,然后保存退出,如下是编译运行过程:,四、使用,Makefile,解决多文件编译运行的问题,正如上节的红框框里面所叙述,如果一个程序涉

18、及的文件很多的话,每个都得写出来,很是麻烦,所以,Makefile,就出现了,请看教程:,然后保存退出,运行,make,命令:,五、,Makefile,和,shell script,方法的对比,有人说,我把之前的所有命令,全写到,shell script,里面,不就达到,Makefile,的效果了,没错确实最终效果是相同的,但是,Makefile,却有这些好处:,简化编译执行的命令(并没有,gcc,c,的过程),一次,make,后,下次只会编译改动的文件,其它的文件不会再编译了,其它还有一些优点,不过这第二个优点,对于大型项目来说,好处太大了!,2)Linux,内核的编译,Linux,内核的编

19、译主要流程及命令:,#make menuconfig,-,配置编译选项,#make dep,-,生成变量依赖关系信息,.,#make clean -,删除生成的模块和目标文件,.,#make zImage,-,编译内核生成映象,.,#make modules -,编译模块,.,#make modules_install,-,安装编译完成的模块,.,3)Linux,内核映像,压缩内核映像所在路径:,arch/arm/boot/zImage,vmlinuz,是可引导的、压缩的、可执行的内核。老的,zImage,解压缩内核到低端内存(第一个,640K,),,bzImage,解压缩内核到高端内存(,1

20、M,以上)。,如果内核比较小,可以采用,zImage,或,bzImage,之一,两种方式引导的系统运行时是相同的。大的内核采用,bzImage,,不能采用,zImage,。,vmlinux,是未压缩的内核,,vmlinuz,是,vmlinux,的压缩文件。,4),内核映象的烧写,有两种烧写方式:,(,1,)使用,vivi,中提供的,xmodem,协议下载,(,2,)在开发板的,linux,系统启动后,使用,imagewrite,工具:,imagewrite,/dev/mtd/0 zImage:192k,5,)内核配置中添加一个编译模块,在内核配置中添加一个编译模块的方法:,(,1,)在内核的驱

21、动目录下编写驱动模块代码 如:,kernel-2410s/drivers/char/demo.o,(,2,)在该级目录下的,Config.in,中添加对该模块的编译条件变量。,如:,CONFIG_ S3C2410_DEMO,,该变量可以设置为三种状态:,Y-,将该功能模块编译进内核,N-,不将该功能模块编译进内核,M-,将该功能编译成模块的方式,可以在需要时动态插入到内核中的模块,(,3,)在,Makefile,中将编译选项与具体要编译的代码相关联,根据编译选项变量的状态决定编译。,#Object file lists.obj-y:=obj-m:=obj-n:=obj-$(CONFIG_S3C

22、2410_DEMO)+=demo.o,(,4,)使用,make menuconfig,对该功能模块进行配置,设置完成后,会生成更新的,.config,文件。,拷贝,demo.o,,运行测试程序,test_demo,,以,*,和,M,方式编译,demo,驱动,并下载测试。,2.Linux 2.4,移植实例,1),下载源码,建立工作目录,Linux,内核源码可以从以下网址下载:,www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.18.tar.gz,解压:,tar jxvf,linux-2.4.18-rmk7-pxal-mz4.tar.bz2,交叉编译工具

23、:,armgcc2.95.3.tar.bz2,2),移植步骤如下:,(1)cd,kernel,#cd,/usr/src/linux-2.4,进入内核源码目录后,才能够正确执行所有的内核配置、编译命令。,(2)make mrproper,目的是清除原先此目录下残留的,.config,和,.o,文件(,object,文件),如果是第一次编译内核,那么这一步就可以省略,但是如果已经编译过多次内核的话,这一步一定要,不然以后出现很多小问题,.,(3),修改,Makefile,,改为交叉编译,(4),修改分区表,drivers/mtd/nand/smc_s3c2410.c,如下所示:,static st

24、ruct mtd_partition smc_partitions,=,name:bootloader,size:0 x80000,offset:0 x0,mask_flags,:0,/*force read-only*/,name:param,size:0 x80000,offset:0 x80000,mask_flags,:0,/*force read-only*/,name:kernel,size:0 x300000,offset:0 x100000,mask_flags,:0,/*force read-only*/,name:root,size:0 x1400000,offset:0

25、x0400000,mask_flags,:0,/*force read-only*/,name:user,size:0 x2800000,offset:0 x1400000,mask_flags,:0,/*force read-only*/,;,(5),加入,LED,灯驱动,将,LED,灯驱动程序放在,drivers/char/,目录下;,在,drivers/char/,目录下编辑,Config.in,文件,找到,source drivers/serial/Config.in,;在其下面加入对,LED,的配置:,dep_tristate,Support MY2410 LEDS CONFIG_M

26、Y2410_LEDS,在,drivers/char/,目录下:,vi Makefile,在,196,行加上:,obj-$(CONFIG_MY2410_LEDS)+=my2410_leds.o,保存退出。,(6),加入,YAFFS,支持驱动,从官网,(,www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs/,),下载源码,(yaffs.tar.gz,),解压,在,Linux,内核,kernel/fs,/,目录下新建,yaffs,目录,将,yaffs,源码中的文件,:,yaffs_fs.c yaffs_guts.c,yaffs_mtdif.c yaffs_ecc.c

27、,devextras.h yaffs_guts.h,yaffs_mtdif.h yaffs_ecc.h,yaffsinterface.h yportenv.h,复制到该目录下,然后创建,yaffs_config.h,文件,加入源码中使用到的宏定义,#ifdef,_YAFFS_CONFIG_H_,#define _YAFFS_CONFIG_H_,#define CONFIG_YAFFS_MTD_ENABLED,#define CONFIG_YAFFS_USE_OLD_MTD,#endif,保存退出,并将其放入其他源文件中;在该目录下创建,Makefile,文件,内容如下:,O_TARGET:=y

28、affs.o,obj-y:=yaffs_fs.o yaffs_guts.o yaffs_mtdif.o yaffs_ecc.o,obj-m,:=$(O_TARGET),include$(TOPDIR)/Rules.make,保存退出。,在,fs,目录的,Makefile,文件中加入,yaffs,子目录,如下:,70,行处:,subdir-$(CONFIG_YAFFS_FS)+=yaffs,在,fs,目录的,Config.in,文件中加入,YAFFS,选项,如下:,50,行处:,if “$CONFIG_MTD_SMC”=“y”;then,tristate Yaffs filesystem,on

29、NAND CONFIG_YAFFS_FS,fi,注意:,if,的,与字符间要用空格隔开。,将,yaffs_mtdif.c,中用,nand_oobinfo,定义的两个结构体注释掉;否则编译时将出现如下错误:,yaffs_mtdif.c:33 variable yaffs_oobinfo has initializer,but incomplete type,yaffs_mtdif.c:34 unknow field useecc specified in initializer,(7)make menuconfig,此步骤为配置内核参数的过程。该步是编译内核过程中最繁琐的一步。要选择诸多参数。“

30、,Y”,将该功能编译进内核;“,N”,不将该功能编译进内核;“,M”,将该功能编译成可以在需要时动态插入到内核的模块;,选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于缩减内核,减少内核消耗的内存。与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。,设置好内核参数很关键。设置的一些主要参数有:(,1,),Loadable module support,(,2,),General setup,(,3,),Networking options,(,4,),USB Support,选择“,Load an Alternate Configuration

31、File”,菜单后写入“,arch/arm/def-configs/smdk2410”,;,在内核配置选项,Character devices,中选中,Support MY2410 LEDS,项;,在内核配置选项,File system,中选中,Yaffs filesystem,on NAND,项;,(8)make dep,对内核原代码的文件进行完整性和依赖性进行检验,确保关键文件在正确的位置。,(9),进行,make clean,清除一些不必要的文件,(10),进行,make bzImage,操作,该步骤即生成新内核的步骤。所费时间较长。,(11),进行,make modules,操作,该步

32、骤把在,make menuconfig,里边所选择的设置,全部编译成模块。,(13),进行,make modules_install,操作,安装,module,的过程。,(14)cp/usr/src/linux/arch/arm/boot/zImage/tftpboot,/.,(15),在,VIVI,下通过串口或,tftp,协议下载内核映象文件,下载内核到开发板中:,tftpboot 33000000 uImage,;,将,uImage,烧入,NAND Flash,中:,nand write.jffs2 33000000 100000$(filesize,),。,注意:这里,make,,生成,

33、vmlinux,镜像。,由于本内核不能直接生成,uImage,,可根据,U-BOOT,根目录下的,README,的说明来制,uImage,;,make,生成,vmlinux,后,还要做如下工作:,arm-linux-objcopy O binary R.note R.comment S vmlinux linux.bin,;将,vmlinux,转换为二进制格式;,gzip-9 linux.bin,压缩,mkimage A arm O linux T kernel C gzip a 0 x30008000 e 0 x30008000 n“Linux Kernel Image”d linux.bi

34、n.gz uImage,构造头部信息(包含文件名称、大小、类型、,CRC,校验码等)。,3.Linux,操作系统启动,Boot Loader,把操作系统的代码调入内存后,会把控制权交给操作系统,由操作系统的启动程序来完成剩下的工作。,Linux,操作系统启动的步骤如下:,1,)把控制权交给,Setup.S,这段程序;,2,)进入保护模式,同时把控制权交给,Head.S,;,3,),Head.S,调用,/init/main.C,中的,start_kernel,函数,启动程序从,start_kernel,(),函数继续执行;,4,)建立,init,进程。,下面是其主要过程:,首先,,Setup.S

35、,对已经调入内存的操作系统代码进行检查,如果没错,它会通过,BIOS,中断获取内存容量,硬盘等信息(实模式),准备让,CPU,进入保护模式。,(,1,)先屏蔽中断信号,(,2,)调用指令,lidt,和,lgdt,,对中断向量表寄存器,IDTR,进行初始化,(,3,)对,8259,中断控制器进行编程,(,4,)协处理器重新定位,完成这几件事后,,Setup.S,设置保护模式的标志,重取指令,再用一条跳转指令,jmpi,0 x100000,KERNEL_CS,。进入保护模式下的启动阶段,控制权交给,Head.S,。,在,Head.S,文件中,也要先做屏蔽中断一类的工作,然后对中断向量表做一定的处理

36、,Boot Loader,读入内存的启动参数和命令行参数,,Head.S,把它们保存在,empty_zero_page,页中。,主要功能:,(,1,)检查,CPU,类型,(,2,)对协处理器进行检查,(,3,)页初始化,调用,setup_paging,这个子函数,(,4,)因为已进入保护模式,段机制的多任务属性体现,最后,Head.S,调用,/init/main.c,中的,start_kernel,函数,把控制权交给它,这个函数是整个操作系统初始化的最重要的函数,一旦它执行完,整个操作系统的初始化也就完成了。,计算机在执行,start_kernel,前以进入了保护模式,使处理器完全进入了全面执

37、行操作系统代码的状态。但直到目前为止,这都是针对处理器的。而一旦,start_kernel,开始执行,,Linux,内核就一步步展现。,Start_kernel,执行后,就可以以一个用户的身份登陆和使用,Linux,了。,main.c,中其他较为重要的函数如下:,(,1,),Setup_arch,(),最基本硬件的初始化,(,2,),Paging_init,(),线性地址空间映射,(,3,),Trap_init,(),中断向量表初始化,(,4,),Int_IRQ,与中断有关的初始化,(,5,),Sched_init,(),进程调度初始化,(,6,),Console_init,(),对中断的初始

38、化,(,7,)对文件系统的初始化,(,8,),Inode_init,()i,节点管理机制初始化,(,9,),Name_cache_init,(),目录缓存机制初始化,(,10,),Buffer_init,(),块缓存机制初始化,启动到了目前这种状态,只剩下运行,/etc,下的启动配置文件。这时初始化程序并没有完成操作系统各个部分的初始化,更关键的文件系统的安装还没有涉及,这是在,init,进程建立后完成的。就是,start_kernel,(),最后部分内容。,建立,init,进程:,Linux,要建立的第一个进程是,init,进程,启动所需的,Shell,脚本文件,,Linux,系统启动所必须

39、的,Shell,脚本文件,用户登陆后自己设定的,Shell,脚本文件。,系统启动所必须的脚本存放在系统默认的配置文件目录,/etc,下。首先调用的是,/etc/inittab,。,1.,嵌入式,linux,2.6,概述,为了进一步促进这方面的应用,在,Linux 2.6,中,引入了很多非常有利于嵌入式应用的功能。这些新功能包括实时性能的增强、更方便的移植性、对大容量内存的支持、支持微控制器和,I/O,系统的改进等。,linux-2.6,内核的新特征如下:,10.4 linux,2.6,内核移植,1,)改进了响应时间,在,2.6,内核以前,要想让,Linux,获得更好的响应能力,就需要一些特殊的

40、补丁。通常情况下,需要用户从厂商处购买补丁来改进中断性能和调度反应时间。如今,,2.6,内核把这些改进加入到了主流的内核当中,因此无需再对其进行特殊的配置。,2,)抢占式内核,Linux 2.6,内核在一定程度上使用了可抢占的模式。因此,在一些时效性比较强的事件中,,Linux 2.6,要比,2.4,具有更好的响应能力。当然了,它实际上并不是一个真正的,RTOS,,,但是与以前的内核相比较,“停顿”的感觉要少得多。,3,)高效的调度程序,在,2.6,版本中,进程调度经过重新编写,去掉了以前版本中效率不高的算法。调度程序每次不再扫描所有的任务,而是在一个任务变成就绪状态时将其放到一个名为“当前队

41、列”的队列之中。当进程调度程序运行时,它只选择队列中最有利的任务来执行。这样,调度就可以在一个恒定的时间里完成。,当任务执行时,它就会得到一个时间段,或在其转到另外一个线程之前得到一段时间的处理器使用权。当它的时间段用完之后,任务就会被移到另外一个名为“过期”的队列中。而在该队列中,任务会根据其优先级进行排序。,4,)新的同步措施,多进程应用程序有时需要共享一些资源,比如共享内存或设备。为了避免竞争的出现,,程序员会使用一个名为互斥的功能来确保同一时刻只有一个任务在使用资源。到目前为止,,Linux,还是通过一个包含在内核中的系统调用来完成互斥的实现,并由该系统调用来决定一个线程是等待还是继续

42、执行。但当决定继续执行时,这个耗时的系统调用就不需要了。,5,)共享内存的改进,嵌入式系统有时也是一个有很多处理器的设备,比如在电信网络或大型存储系统中就是如此。而不论是均衡或是松散连接的多处理器,一般都是共享内存的。均衡多进程的设计是所有的处理器都有对内存有均等使用权,而限制使用内存的决定性因素是进程的效率。,Linux2.6,为多程序提供了一种不同的途径,即所谓的,NUMA(Non,Uniform Memory Access),。这种方法中,内存和处理器是相互连接的,但是对于每一个处理器,一些内存是“关闭”的,而有的内存则是“更远”的。这就意味着当内存竞争出现时,“更近”的处理器对就近的内

43、存有更高的使用权。,6,),POSIX,线程、信号和计时器,与,POSIX,线程一起,,2.6,把,POSIX,信号和,POSIX,高精度计时器作为了主流内核的一个组成部分。,POSIX,信号比以前,Linux,版本中使用的,Unix,模式的信号有了很大的改进。新的,POSIX,信号不能被丢失,并且可以携带信息作为参数。,POSIX,信号也可以从一个,POSIX,线程传送至另外一个线程,而不是像,Unix,信号一样,只能从一个进程至另外一个进程。嵌入式系统通常要求硬件能够在固定的时间安排下来运行任务。,POSIX,计时器可以轻松地让任何一个任务都可以周期性地得到预定安排的时间。计时器的时钟可以

44、达到很高的精度,从而可以让软件工程师更加精确地控制任务的调度。,7,)支持通用设计,嵌入式世界里的硬件设计通常都要经过定制,以满足特定的应用程序。因此,设计人员经常需要使用原始的方式来解决设计上的问题。比如,为特定目的制造的主板可能使用不同的,IRQ,管理器而不是使用类似的设计。,在,2.6,内核中,就引入了一个名为子框架的概念。在新的定义中,各组件被清晰地分开,并且可以独立进行更改或替换,而不会对其它的组件或软件包造成影响,或者影响非常小。,8,)设备、总线和,I/O,现在,Linux,正在变成行业用户的第一选择。,2.6,内核包含了,ALSA,(,Advanced Linux SoundA

45、rchitecture,),该体系结构可以安全地使用,USB,和,MIDI,设备。通过使用,ALSA,,系统可以同时播放和记录音频。,用于支持视频的,Video4Linux,系统,在,2.6,中也焕然一新。虽然其不能向后兼容,但却可用于最新的广播、电视、数码相机和其它的多媒体。,Linux 2.6,使用的是,USB 2.0,,它要比一般的,USB,快,40,倍。可以预见,在不久的将来,高速设备将非常普及,而在对,USB 2.0,支持方面,,Linux,可以说是一个先行者。,9,)支持,64,位处理器和微控制器,使用,2.6,内核,对于那些需要大量内存的嵌入式,Linux,开发人员就可以选择,6

46、4,位的处理,器。也提供了对微处理控制器的支持。,2.linux,内核源代码目录,由于,linux,内核版本不断升级更新,所以最好下载新版本的内核源码。,Linux,官方发布的内核版本可以从以下网站获取:,www.kernel.org,。获取,linux,内核源码之后,就可以仔细分析内核源码了。,Linux,内核源代码非常庞大,随着版本的发展不断增加新的内容。,初次接触,linux,内核,可以仔细阅读顶层目录的,readme,,它是,linux,内核的概述和编译命令说明。内核源码的顶层目录下有许多子目录,分别存放内核子系统的各个源文件。目录说明如下表所示。,3.linux,2.6,移植实例,嵌

47、入,linux,系统在开发阶段,一般采用的是开发机和目标板的开发模式,在开发机上安装交叉工具链,配置,TFTP,,,NFS,等的服务,在目标板上通过,TFTP,下载文件,通过,NFS,挂载跟文件系统。,1,)配置开发机(,PC,)的环境,启动,TFTP,服务:,TFTP,是简单的文件传输协议,适合目标板的,bootloader,使用。通过以下命令启动,tftp,服务:,#/etc/init.d/xinetd,restart,安装,GCC,交叉工具链:在开发嵌入式,linux,过程中,会用到不同的交叉工具链,这里安装,4.3.3,版本的工具链,步骤如下:,#mkdir/usr,/local/ar

48、m;,如果目录存在,就不需要建立,将实验提供的,4.3.3,工具链拷贝到该目录解压它,:,#tar zxvf,4.3.3_my2410.tgz,然后,在需要使用交叉编译是,只要在终端输入如下命令:,#export PATH=/usr,/local/arm/,版本,/bin:$PATH,在需要更改不同版本的工具链时,重新启动一个终端,然后再一次输入上面的命令即可。,2,)移植,linux-2.6.30,到,my2410,开发板,linux-2.6,内核已经支持,S3C24x0,处理器的多种硬件板,这里我们用开发板光碟提供的内核为例,实现内核的移植。,主要步骤如下,:,(,1,)准备工作,(,2,

49、)修改顶层,Makefile,(,3,)修改内核源码,(,4,)配置编译内核,(,5,)下载到开发板上运行,(,1,)准备工作,建立工作目录,下载源码,安装交叉工具链,步骤如下。,#mkdir /root/build_kernel,#mkdir /root/build_kernel/linux,#cd /root/build_kernel/linux,将实验提供的内核,my2410-linux-kernel-2.6.30.4.tar.bz2,解压:,#tar jxvf,my2410-linux-2.6.30.4.tar.bz2,#export PATH=/usr/local/arm/4.3.3

50、/bin:$PATH,。,(,2,)修改顶层,Makefile,修改内核目录树根下的的,Makefile,,指明体系结构是,arm,,交叉编译工具是,arm-linux,-;,#cd,/root/build_kernel/linux/my2410-linux-2.6.30.4,#vi Makefile,找到,ARCH,和,CROSS_COMPILE,,修改,ARCH:=arm,CROSS_COMPILE:=arm-linux,-,保存退出。,(,3,)修改内核源码,如果要用,u-boot,来引导,linux,内核,则需要修改内核源码;如果用,gec2410_bois,程序来引导,linux,内

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服