您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

Linux内核布局详解

发布日期:2011-05-03


     Linux内核紧张由五个子体系构成:进程调理,内存办理,假造文件体系,网络接口,进程间通讯。 
     1.进程调理(SCHED):控制进程对CPU的访问。当须要选择下一个进程运行时,由调理步调选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,要是某个进程在等待别的资源,则该进程是不可运行进程。Linux利用了比较大抵的基于优先级的进程调理算法选择新的进程。 

     2.内存办理(MM)允很多个进程沉寂的共享主内存地区。Linux的内存办理支持假造内存,即在谋略机中运行的步调,其代码,数据,堆栈的总量可以超过跨过实际内存的大小,利用体系只是把当前利用的步调块生存在内存中,别的的步调块则生存在磁盘中。须要时,利用体系认真在磁盘和内存间互换步调块。内存办理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对调;硬件干系的部分为内存办理硬件提供了假造接口。 

     3.假造文件体系(VirtualFileSystem,VFS)潜伏了种种硬件的细致细节,为全部的配置提供了同一的接口,VFS提供了多达数十种差别的文件体系。假造文件体系可以分为逻辑文件体系和配置驱动步调。逻辑文件体系指Linux所支持的文件体系,如ext2,fat等,配置驱动步调指为每一种硬件控制器所编写的配置驱动步调模块。 

     4.网络接口(NET)提供了对种种网络标准的存取和种种网络硬件的支持。网络接口可分为网络协讲和网络驱动步调。网络协议部分认真实现每一种大概的网络传输协议。网络配置驱动步调认真与硬件配置通讯,每一种大概的硬件配置都有相应的配置驱动步调。 

     5.进程间通讯(IPC) 支持进程间种种通讯机制。 
     处于中间位置的进程调理,全部别的的子体系都依赖它,由于每个子体系都须要挂起或光复进程。一样通常环境下,当一个进程等待硬件利用完成时,它被挂起;当利用真正完成时,进程被光复实行。比喻,当一个进程通过网络发送一条消息时,网络接口须要挂起发送进程,直到硬件告成地完成消息的发送,当消息被告成的发送出去以后,网络接口给进程返回一个代码,表现利用的告成或失败。其他子体系以相似的来由依赖于进程调理。 

     各个子体系之间的依赖干系如下: 

     进程调理与内存办理之间的干系:这两个子体系相互依赖。在多道步调环境下,步调要运行必须为之创建进程,而创建进程的第一件变乱,便是将步调和数据装入内存。 

     进程间通讯与内存办理的干系:进程间通讯子体系要依赖内存办理支持共享内存通讯机制,这种机制容许两个进程除了拥有本身的私有空间,还可以存取共同的内存地区。 

     假造文件体系与网络接口之间的干系:假造文件体系利用网络接口支持网络文件体系(NFS),也利用内存办理支持RAMDISK配置。 

     内存办理与假造文件体系之间的干系:内存办理利用假造文件体系支持互换,互换进程(swapd)定期由调理步调调理,这也是内存办理依赖于进程调理的唯一缘故因由。当一个进程存取的内存映射被换出时,内存办理向文件体系发出恳求,同时,挂起当前正在运行的进程。 

     除了这些依赖干系外,内核中的全部子体系还要依赖于一些共同的资源。这些资源包括全部子体系都用到的进程。比喻:分派和开释内存空间的进程,打印告诫或错误信息的进程,另有体系的调试例程等等。 

     体系数据布局 

     在linux的内核的实现中,有一些数据布局利用频度较高,他们是: 
     task_struct. 
      Linux内核利用一个数据布局(task_struct)代表一个进程,代表进程的数据布局指针形成了一个task数组(Linux中,任务和进程是雷同的术语),这种指针数组偶然偶尔也称为指针向量。这个数组的大小由NR_TASKS(默以为512),表明Linux体系中最多能同时运行的进程数量。当创建新进程的时间,Linux为新进程分派一个task_struct布局,然后将指针生存在task数组中。调理步调不绝维护着一个current指针,他指向当前正在运行的进程。 
      Mm_struct 

     每个进程的假造内存由一个mm_struct布局来代表,该布局实际上包括了当前实行映像的有关信息,并且包括了一组指向vm_area_struct布局的指针,vm_area_struct布局形貌了假造内存的一个地区。 

     Inode 

     假造文件体系(VFS)中的文件、目次等均由映射的索引节点(inode)代表。每个VFS索引节点中的内容由文件体系专属的例程提供。VFS索引节点只存在于内核内存中,实际生存于VFS的索引节点高速缓存中。要是两个进程用雷同的进程打开,则可以共享inade的数据布局,这种共享是通过两个进程中数据块指向雷同的inode完成。 

     Linux的细致布局 
     所谓细致布局是指体系实现的布局。 
     Linux的细致布局雷同于抽象布局,这种映射性是由于抽象布局源头于细致布局,我们的分别没有严格依照源代码的目次布局,且和子体系的分组也不完全结婚,但是,它很靠近源代码的目次布局。 
     只管前面的讨论的抽象布局表现了各个子体系之间只有很少的依赖干系,但是细致布局的5个子体系之间有高度的依赖干系。我们可以看出,细致布局中的很多依赖干系并没有在抽象布局中出现。 
     Linux内核源代码 
     如今,较新而又稳固的内核版本是2.0.x和2.2.x,由于版本差别稍有差别,因此要是你想让一个新的驱动步调既支持2.0.x,又支持2.2.x,就须要根据内核版本举行条件编译,要作到这一点,就要支持宏LINUX_VERSION_CODE,倘若内核的版本用a.b.c来表现,这个宏的值便是216a+28b+c。要用到指定内核版本的值,我们可以用KERNEL_VERSION宏,我们也可以本身去定义它。 
     对内核的修改用补丁文件的要领颁发的。Patch实用步调用来用来对内核源文件举行一系列的修改。比喻:你有2.2.9的源代码,但想移到2.2.10。就可以得到2.2.10的补丁文件,应用patch来修改2.2.9源文件。比喻: 

     $ cd /usr/src/linux 
     $ patch –pl < patch-2.2.10 
     Linux 内核源代码的布局 
     Linux内核源代码位于/usr/src/linux目次下。 
     /include子目次包括了创建内核代码时所需的大部分包括文件,这个模块利用其他模块重修内核。 
     /init 子目次包括了内核的初始化代码,这是内核变乱的开始的出发点。 
     /arch子目次包括了全部硬件布局特定的内核代码。如:i386,alpha 
     /drivers子目次包括了内核中全部的配置驱动步调,如块配置和SCSI配置。 
     /fs子目次包括了全部的文件体系的代码。如:ext2,vfat等。 
     /net子目次包括了内核的连网代码。 
     /mm子目次包括了全部内存办理代码。 
     /ipc子目次包括了进程间通讯代码。 
     /kernel子目次包括了主内核代码。 
     从那边开始阅读源代码? 
     在Internet,有人制作了源代码导航器,为阅读源代码提供了精良的条件,站点为lxr.linux.no/source。 
     下面给出阅读源代码的线索: 
     体系的启动和初始化: 
     在基于Intel的体系上,当loadlin.exe或LILO把内核装入到内存并把控制权转达给内核时,内核开始启动。关于这一部分请看,arch/i386/kernel/head.S,head.S举行特定布局的设置,然后跳转到init/main.c的main()例程。 
     内存办理: 
     内存办理的代码紧张在/mm,但是特定布局的代码在arch/*/mm。缺页克制处理惩罚处罚的代码在/mm/memory.c ,而内存映射和页高速缓存器的代码在/mm/filemap.c 。缓冲器高速缓存是在/mm/buffer.c 中实现,而互换高速缓存是在mm/swap_state.c和mm/swapfile.c。

     内核: 
     内核中,特定布局的代码在arch/*/kernel,调理步调在kernel/sched.c,fork的代码在kernel/fork.c,内核例程处理惩罚处罚步调在include/linux/interrupt.h,task_struct数据布局在inlucde/linux/sched.h中。 
     PCI: 
      PCI伪驱动步调在drivers/pci/pci.c,其定义在inclulde/linux/pci.h。每一种布局都有一些特定的PCI BIOS代码,Intel的在arch/alpha/kernel/bios32.c中。 
     进程间通讯: 
     全部的SystemVIPC东西权限都包括在ipc_perm数据布局中,这可以在include/linux/ipc.h中找到。SystemV消息是在ipc/msg.c中实现。共享内存在ipc/shm.c中实现。信号量在ipc/sem.c中,管道在/ipc/pipe.c中实现。 

     克制处理惩罚处罚: 
     内核的克制处理惩罚处罚代码险些全部的微处理惩罚处罚器特有的。克制处理惩罚处罚代码在arch/i386/kernel/irq.c中,其定义在include/asm-i386/irq.h中。