资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Linux,系统应用,第十章,系统内核裁减,1,一、系统内核的工作机制,Linux,系统大致可分为三层:,靠近硬件的底层是内核,即,Linux,操作系统常驻内存部分。,中间层是内核之外的,shell,层,即操作系统的系统程序部分。,最高层是应用层,即用户程序部分,第八讲 系统内核裁剪,2,学习过计算机组成原理和操作系统课程之后,我们知道硬件和软件之间并不是直接通信的;它们之间的关系是很象洋葱的层次关系。用户与硬件打交道是通过,shell,命令解释器和系统内核。,系统内核解释硬件的电信号,并把它们翻译成,shell,可用的东西,如果应用程序在运行,它们则运行于,shell,之上。,内核是唯一能访问硬件,管理整体系统的核心软件,是,Linux,系统的灵魂,它的作用与其他的操作系统的内核相似:负责管理内存、文件系统、驱动程序,排定,Linux,内各个操作执行的次序,负责把系统资源分配给线上用户。,3,一般说来,可以将操作系统划分为内核和系统程序两部分。,进程控制系统用于进程管理、进程同步、进程通信、进程调度和内存管理等。,内存管理控制内存分配与回收。,文件系统管理文件、分配文件空间、管理空闲空间、控制对文件的访问并为用户检索数据。,Linux,系统支持三种类型的硬件设备:字符设备、块设备和网络设备。,核心底层的硬件控制负责处理中断以及与机器通信。,如,shell,4,系统内核的工作机制(续),系统内核的一些核心函数在,/usr/src/linux-2.4.20-8/kernel,目录下。该目录下的程序文件有:,Linux,是开放的操作系统,其源代码是免费的。通过学习这些源代码可以学到许多东西;因为在,/kernel,目录下的关键文件解释了系统内核是如何工作的。例如、了解系统内核的,panic,、,fork,和其它一些系统函数,会使你对内核如何与硬件和用户环境交互有更好的理解。当然、要读懂它不但要有,C,的基础还要查阅文献资料。,5,例,info.c,/*,linux/kernel/info.c,*Copyright(C)1992 Darren,Senn,*/,/*This implements the,sysinfo,()system call*/,#include,#include,#include,#include,#include,asmlinkage,long,sys_sysinfo(struct,sysinfo,*info),struct,sysinfo,val,;,memset(char,*)&,val,0,sizeof(struct,sysinfo,);,cli,();,val.uptime=jiffies/HZ;,val.loads0=avenrun0 (SI_LOAD_SHIFT-FSHIFT);,val.loads1=avenrun1 (SI_LOAD_SHIFT-FSHIFT);,val.loads2=avenrun2 (SI_LOAD_SHIFT-FSHIFT);,6,例,info.c,val.procs,=nr_threads-1;,sti,();,si_meminfo(&val,),si_swapinfo(&val,);,unsigned long,mem_total,sav_total,;,unsigned,int,mem_unit,bitcount,;,/*If the sum of all the available memory(i.e.ram+swap),*is less than can be stored in a 32 bit unsigned long then,*we can be binary compatible with 2.2.x kernels.If not,*well,in that case 2.2.x was broken anyways.,*,*-Erik Andersen */,mem_total,=,val.totalram,+,val.totalswap,;,if(,mem_total,val.totalram,|,mem_total,1),bitcount,+;,mem_unit,=1;,sav_total,=,mem_total,;,mem_total,=1;,if(,mem_total,sav_total,),goto,out;,/*If,mem_total,did not overflow,multiply all memory values by,*,val.mem_unit,and set it to 1.This leaves things compatible,*with 2.2.x,and also retains compatibility with earlier 2.4.x,*kernels.*/,8,例,info.c,val.mem_unit,=1;,val.totalram,=,bitcount,;,val.freeram,=,bitcount,;,val.sharedram,=,bitcount,;,val.bufferram,=,bitcount,;,val.totalswap,=,bitcount,;,val.freeswap,=,bitcount,;,val.totalhigh,=,bitcount,;,val.freehigh,linux-2.4.20-8,drwxr-xr-x,15 root root 1024 May 14 11:37 linux-2.4.20-8,drwxr-xr-x,3 root root 1024 May 4 14:38,sendmail,12,2,、删除过时的目标文件,进入,/usr/src/linux-2.4.20-8/,目录,运行,make,mrproper,命令以清除过时的目标文件。,3,、重新设置系统内核,一共有三种方式来运行重新设置的命令:,设置屏幕的类型 命令,文本,make,config,NCurses,make,menuconfig,X,图形,make,xconfig,裁剪系统内核(续),13,在三种方式中,,xconfig,程序是 图形用户界面,,,整个设置界面简洁明了,帮助文件也容易获取。,裁剪系统内核(续),14,menuconfig,程序是菜单光标界面,用户利用光标键和空格键进行设置。,在,xconfig,、,menuconfig,中可以回退做修改,但在,config,中则不能,因为它只在整个设置中一直向你提问。,裁剪系统内核(续),15,重新设置系统内核(续),在,/usr/src/linux-2.4.20-8/,目录下运行设置程序。,以下用,xconfig,设置程序为例说明。,xconfig,主屏幕有许多设置选项,这里只简单介绍几个,其它的选项,可查看帮助文件。,(,1,),代码成熟级别选项(,Code maturity level options,),如果你想对新的驱动程序做,beta,测试,则可以选中,y,该选项,否则一般选,n,。,这是内核的一个内置特性,不能作为一个模块,所以,m,选项钮不使能(灰色)。,(,2,),可装载模块支持(,Loadable module support,),选中该项以使用模块。如果激活了可装载模块支持选项,一般也要指定模块的自动装载。,16,(,3,)网络设备支持(,Network device support,),定义使用网络的方式。,重新设置系统内核(续),17,(,4,)字符设备(,Character devices,),定义使用各种字符设备的方式。,重新设置系统内核(续),18,设置选项很多,这里只介绍几种,其目的是让大家了解内核裁剪的方法。,在作完选项的选择后,不要忘记保存设置后退出,保存按钮如左图所示。当然、你也可以不保存退出,或者保存到系统配置文件中。,重新设置系统内核(续),19,4,、重新编译系统内核,编译之前,运行带有,clean,和,dep,选项的,make,文件以清除过时的目标文件并建立合适的独立性(如果要正确编译代码,必须要满足该要求)。命令为:,make clean,;,make,dep,如果没有错误提示,就运行,make,zImage,命令。该命令将在,/usr/src/linux-2.4.20-8/arch/i386/boot,目录下安装一个全新的内核。该内核文件称为,zImage,。,如果给内核添加了许多驱动程序或各种各样的支持,可能需要使用,make,bzImage,命令,该命令可以作出一个很大的映象文件,该文件可以带有所有的选项进行启动。,运行,make modules,运行,make,modules_install,重新设置系统内核(续),20,重新编译系统内核(续),如果看到类似于以下的提示,就已经完成了创建工作。,Root device is(3,1),Boot sector xxx bytes.,Setup is,xxxx,bytes.,System is xxx,kB,Sync,Make1:Leaving directory/usr/src/linux-2.4.20-8/arch/i386/boot,重新编译内核时,会花费比较多的时间;具体的时间取决于你选择内核的大小、处理器的速度等因数。一般在嵌入式系统中内核比较精悍,编译过程会比较快;另外、如果没有运行其他的负载密集型的应用程序(如,X,图形程序),编译过程会更快。,编译完成后,在,/usr/src/linux-2.4.20-8/arch/i386/boot,下就会有,zImage,或,bzImage,文件。,21,重新编译系统内核(续),5,、,备份正在使用的系统内核,在把新的系统内核移植到根目录时,作好老系统内核的备份是非常重要的!一旦新系统内核崩溃,用应急启动盘进入,Linux,系统,恢复旧系统内核。,cd,/boot,mv,vmlinuz-2.4.20-8,vmlinuz.old,内核重建前文件名为,vmlinuz-2.4.20-8,。,复制新内核到根目录:,cp/,usr/src/linux-2.4.20-8/arch/i386/boot/zImage/boot,如果你用,gurb.conf,或,LILO,文件配置启动,则要修改该文件。,22,#grub.conf generated by anaconda,#,#Note that you do not have to rerun grub after making changes to this file,#NOTICE:You do not have a/boot partition.This means that,#all kernel and,initrd,paths are relative to/,eg,.,#root(hd0,1),#kernel/boot/,vmlinuz,-version,ro,root=/dev/hda2,#,initrd,/,boot/initrd-version.img,#boot=/dev/,hda,default=0,timeout=10,splashimage,=(hd0,1)/boot/grub/splash.xpm.gz,title Red Hat Linux(2.4.20-8),root(hd0,1),kernel/boot/vmlinuz-2.4.20-8,ro,root=LABEL=/,initrd,/boot/initrd-2.4.20-8.img,title,WinXP,rootnoverify,(hd0,0),chainloader,+1,重新编译系统内核(续),23,把,grub.conf,文件中的下面一行:,kernel/boot/vmlinuz-2.4.20-8,ro,root=LABEL=/,改,为:,kernel/boot/,zImage,ro,root=LABEL=/,修改后保存文件,重启系统。则,Linux,以新裁剪过的内核启动了。,如果是嵌入式系统开发,则可以把裁剪过的内核烧制到开发板中进行测试。,重新编译系统内核(续),24,
展开阅读全文