Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文档系统,网络接口,进程间通信。


  1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程式选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,假如某个进程在等待其他资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
  
  2.内存管理(MM)允许多个进程安全的共享主内存区域。Linux 的内存管理支持虚拟内存,即在电脑中运行的程式,其代码,数据,堆栈的总量能够超过实际内存的大小,操作系统只是把当前使用的程式块保留在内存中,其余的程式块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程式块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
  
  3.虚拟文档系统(Virtual File System,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 内核源代码的结构

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!