linux内核完全解读.docx》由会员分享,可在线阅读,更多相关《linux内核完全解读.docx(8页典藏版)》请在人人文库网上搜索。

linux内核开发是什么_linux网络内核_linux网络内核分析与开发

Linux内核剖析入门针对很多Linux爱好者对内核很有兴趣却无从下口,本文致力介绍一种剖析linux内核源码的入门方式,而不是解说linux复杂的内核机制;一核心源程序的文件组织:1Linux核心源程序一般都安装在/usr/src/linux下,但是它有一个特别简单的编号约定:任何质数的核心(比如2.0.30)都是一个稳定地发行的核心,而任何质数的核心(比如2.1.42)都是一个开发中的核心。本文基于稳定的2.2.5源代码,第二部份的实现平台为RedhatLinux6.0。2核心源程序的文件按树状结构进行组织,在源程序树的最下层你会看见这样一些目录:Arch:arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,比如i386就是关于intelcpu及与之相兼容体系结构的子目录。PC机通常都基于此目录;Include:include子目录包括编译核心所须要的大部份头文件。与平台无关的头文件在include/linux子目录下,与intelcpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;Init:这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心怎样工作的一个特别好的起点。

linux网络内核分析与开发_linux网络内核_linux内核开发是什么

Mm:这个目录包括所有独立于cpu体系结构的显存管理代码,如页式储存管理显存的分配和释放等;而和体系结构相关的显存管理代码则坐落arch/*/mm/,比如arch/i386/mm/Fault.cKernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;Drivers:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block下为块设备驱动程序,例如ide(ide.c)。假如你希望查看所有可能包含文件系统的设备是怎样初始化的,你可以看drivers/block/genhd.c中的device_setup()。它除了初始化硬碟linux应用程序,也初始化网路,由于安装nfs文件系统的时侯须要网路其他:如,Lib放置核心的库代码;Net,核心与网路相关的代码;Ipc,这个目录包含核心的进程间通信的代码;Fs,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,比如fat和ext2;Scripts,此目录包含用于配置核心的文件等。

linux网络内核_linux网络内核分析与开发_linux内核开发是什么

通常,在每位目录下,都有一个.depend文件和一个Makefile文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;并且,在有的目录下还有Readme文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解;二剖析实战:为你的内核降低一个系统调用其实,Linux的内核源码用树状结构组织得十分合理、科学,把功能相关联的文件都置于同一个子目录下,这样促使程序更具可读性。但是,Linux的内核源码实在是太大并且十分复杂,虽然采用了很合理的文件组织方式,在不同目录下的文件之间还是有好多的关联,剖析核心的一部份代码一般会要查看其它的几个相关的文件,但是可能这种文件还不在同一个子目录下。体系的庞大复杂和文件之间关联的纷繁复杂,可能就是好多人对其望而生畏的主要诱因。其实,这些令人生畏的劳动所带来的回报也是十分令人着迷的:你除了可以从小学到好多的计算机的底层的知识(如下边将提到的系统的引导),感受到整个操作系统体系结构的精妙和在解决某个具体细节问题时,算法的巧妙;并且更重要的是:在源码的剖析过程中,你都会被一点一点地、潜移默化地专业化;甚至,只要剖析非常之一的代码后,你还会深刻地感受到,哪些样的代码才是一个专业的程序员写的,哪些样的代码是一个业余爱好者写的。

linux网络内核_linux网络内核分析与开发_linux内核开发是什么

为了使读者能更好的感受到这一特性,下边举了一个具体的内核剖析实例,希望能通过这个实例,使读者对Linux的内核的组织有些具体的认识,从中读者也可以学到一些对内核的剖析技巧。以下即为剖析实例:【一】操作平台:硬件:cpuintelPentiumII;软件:RedhatLinux6.0;内核版本2.2.5【二】相关内核源代码剖析:1系统的引导和初始化:Linux系统的引导有好几种方法:常见的有Lilo,Loadin引导和Linux的自举引导(bootsect-loader),而前者所对应源程序为arch/i386/boot/bootsect.S,它为实模式的汇编程序,限于篇幅在此不做剖析;无论是哪种引导方法,最后都要跳转到arch/i386/Kernel/setup.S,setup.S主要是进行时模式下的初始化,为系统步入保护模式做打算;随后,系统执行arch/i386/kernel/head.S(对经压缩后储存的内核要先执行arch/i386/boot/compressed/head.S);head.S中定义的一段汇编程序setup_idtlinux,它负责构建一张256项的idt表(InterruptDescriptorTable),此表保存着所有自陷和中断的入口地址;其中包括系统调用总控程序system_call的入口地址;其实,除此之外linux网络内核分析与开发,head.S还要做一些其他的初始化工作;2系统初始化后运行的第一个内核程序asmlinkagevoid_initstart_kernel(void)定义在/usr/src/linux/init/main.c中,它通过调用usr/src/linux/arch/i386/kernel/traps.c中的一个函数void_inittrap_init(void)把各自陷和中断服务程序的入口地址设置到idt表中,其中系统调用总控程序system_cal就是中断服务程序之一;void_inittrap_init(void)函数则通过调用一个宏set_system_gate(SYSCALL_VECTOR,&system_call);把系统调用总控程序的入口挂在中断0x80上;其中SYSCALL_VECTOR是定义在/usr/src/linux/arch/i386/kernel/irq.h中的一个常量0x80;而system_call即为中断总控程序的入口地址;中断总控程序用汇编语言定义在/usr/src/linux/arch/i386/kernel/entry.S中;3.中断总控程序主要负责保存处理机执行系统调用前的状态,检验当前调用是否合法,并依据系统调用向量,使处理机跳转到保存在sys_call_table表中的相应系统服务类库的入口;从系统服务类库返回后恢复处理机状态退回用户程序;而系统调用向量则定义在/usr/src/linux/include/asm-386/unistd.h中;sys_call_table表定义在/usr/src/linux/arch/i386/kernel/entry.S中;同时在/usr/src/linux/include/asm-386/unistd.h中也定义了系统调用的用户编程插口;4.由此可见,linux的系统调用也象dos系统的int21h中断服务,它把0x80中断作为总的入口,之后转入保存在sys_call_table表中的各类中断服务类库的入口地址,产生各类不同的中断服务;由以上源代码剖析可知,要降低一个系统调用就必须在sys_call_table表中降低一项,并在其中保存好自己的系统服务类库的入口地址,之后重新编译内核,其实,系统服务类库是必不可少的。

linux内核开发是什么_linux网络内核_linux网络内核分析与开发

由此可知在此版linux内核源程序中,与系统调用相关的源程序文件就包括以下这种:1arch/i386/boot/bootsect.S2arch/i386/Kernel/setup.S3arch/i386/boot/compressed/head.S4arch/i386/kernel/head.S5init/main.c6arch/i386/kernel/traps.c7arch/i386/kernel/entry.S8arch/i386/kernel/irq.h9include/asm-386/unistd.h其实,这只是涉及到的几个主要文件。而事实上,降低系统调用真正要更改文件只有include/asm-386/unistd.h和arch/i386/kernel/entry.S两个;【三】对内核源码的更改:1.在kernel/sys.c中降低系统服务类库如下:asmlinkageintsys_addtotal(intnumdata)inti=0,enddata=0;while(i=numdata)enddata+=i+;returnenddata;该函数有一个int型入口参数numdata,并返回从0到numdata的累加值;其实也可以把系统服务类库置于一个自己定义的文件或其他文件中,只是要在相应文件中作必要的说明;2.把asmlinkageintsys_addtotal(int)的入口地址加到sys_call_table表中:arch/i386/kernel/entry.S中的最后几行源代码更改前为:...longSYMBOL_NAME(sys_sendfile).longSYMBOL_NAME(sys_ni_syscall)/*streams1*/.longSYMBOL_NAME(sys_ni_syscall)/*streams2*/.longSYMBOL_NAME(sys_vfork)/*190*/.reptNR_syscalls-190.longSYMBOL_NAME(sys_ni_syscall).endr更改后为:...longSYMBOL_NAME(sys_sendfile).longSYMBOL_NAME(sys_ni_syscall)/*streams1*/.longSYMBOL_NAME(sys_ni_syscall)/*streams2*/.longSYMBOL_NAME(sys_vfork)/*190*//*addbyI*/.longSYMBOL_NAME(sys_addtotal).reptNR_syscalls-191.longSYMBOL_NAME(sys_ni_syscall).endr3.把降低的sys_call_table表项所对应的向量,在include/asm-386/unistd.h中进行必要声明,以供用户进程和其他系统进程查询或调用:降低后的部份/usr/src/linux/include/asm-386/unistd.h文件如下:..#define_NR_sendfile187#define_NR_getpmsg188#define_NR_putpmsg189#define_NR_vfork190/*addbyI*/#define_NR_addtotal1914.测试程序(test.c)如下:#include#include_syscall1(int,addtotal,int,num)main()inti,j;doprintf(Pleaseinputanumbern;while(scanf(%d,&i)=EOF);if(j=addtotal(i)=-1)printf(Erroroccurredinsyscall-addtotal();n;printf(Totalfrom0to%dis%dn,i,j);对更改后的新的内核进行编译,并引导它作为新的操作系统,运行几个程序后可以发觉一切正常;在新的系统下对测试程序进行编译(*注:因为原内核并未提供此系统调用,所以只有在编译后的新内核下,此测试程序能够可能被编译通过),运行情况如下:$gcc-otesttest.c$./testPleaseinputanumber36Totalfrom0to36is666可见,更改成功;并且,对相关源码的进一步剖析可知linux网络内核分析与开发,在此版本的内核中,从/usr/src/linux/arch/i386/kernel/entry.S文件中对sys_call_table表的设置可以看出,有好几个系统调用的服务类库都是定义在/usr/src/linux/kernel/sys.c中的同一个函数:asmlinkageintsys_ni_syscall(void)return-ENOSYS;诸如第188项和第189项就是这么:...longSYMBOL_NAME(sys_sendfile).longSYMBOL_NAME(sys_ni_syscall)/*streams1*/.longSYMBOL_NAME(sys_ni_syscall)/*streams2*/.longSYMBOL_NAME(sys_vfork)/*190*/..而这两项在文件/usr/src/linux/include/asm-386/unistd.h中却声明如下:..#define_NR_sendfile187#define_NR_getpmsg188/*somepeopleactuallywantstreams*/#define_NR_putpmsg189/*somepeopleactuallywantstreams*/#define_NR_vfork190由此可见,在此版本的内核源代码中,因为asmlinkageintsys_ni_syscall(void)函数并不进行任何操作,所以包括getpmsg,putpmsg在内的好几个系统调用都是不进行任何操作的,即有待扩展的空调用;但它们却一直占用着sys_call_table表项,恐怕这是设计者们为了便捷扩展系统调用而安排的;所以只需降低相应服务解释器(如降低服务解释器getmsg或putpmsg),就可以达到降低系统调用的作用。结语:其实对于庞大复杂的linux内核而言,一篇文章远远不够,并且与系统调用相关的代码也只是内核中非常微小的一部份;但重要的是技巧、掌握好的剖析技巧;所以上的剖析只是起个引导的作用,而正真的剖析还有待于读者自己的努力。

本文原创地址://lrxjmw.cn/lnhjdrmzncym.html编辑:刘遄,审核员:暂无