zoukankan      html  css  js  c++  java
  • Linux内核结构

    1.5.3 Linux内核的抽象结构

    Linux内核由5个 主要的子系统组成:如图1.2

    图1.2  Linux内核子系统及其之间的关系

    1.进程调度(SCHED)控制着进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待 CPU 资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。

      2.内存管理(MM)允许多个进程安全地共享主内存区域 。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。

    内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。

    3. 虚拟文件系统(VirtulFile System VFS)隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,VFS还支持多达数十种不同的文件系统,这也是Linux较有特色的一部分。

    虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2, fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

    4.网络接口(NET)提供了对各种网络标准协议的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。

    5. 进程间通信(IPC)支持进程间各种通信机制。

    从图1.2可以看出,处于中心位置的是进程调度,所有其它的子系统都依赖于它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其它子系统(内存管理,虚拟文件系统及进程间通信)以相似的理由依赖于进程调度。

     各个子系统之间的依赖关系如下:

    · 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事,就是要将程序和数据装入内存。

    · 进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有内存,还可存取共同的内存区域。

    ·虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK 设备。

    · 内存管理与虚拟文件系统之间的关系: 内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

    除了图1.2所显示的依赖关系以外,内核中的所有子系统还要依赖一些共同的资源,但在图中并没有显示出来。这些资源包括所有子系统都用到的过程,例如,分配和释放内存空间的过程,打印警告或错误信息的过程,还有系统的调试例程等等。

    1.6 Linux内核源代码

    1.6.1 多版本的内核源代码

         对不同的内核版本,系统调用一般是相同的。新版本也许可以增加一个新的系统调用,但旧的系统调用将依然不变,这对于保持向后兼容是非常必要的—一个新的内核版本不能打破常规的过程。在大多数情况下,设备文件将仍然相同,而另一方面,版本之间的内部接口有所变化。

         Linux内核源代码有一个简单的数字系统,任何偶数内核(如2.0.30)是一个稳定的版本,而奇数内核(如2.1.42)是正在发展中的内核。这本书是基于稳定的2.4.16 源代码树。发展中的内核总是有最新的特点,支持最新的设备,尽管它们还不稳定,也不是你所想要的,但它们是发展最新而又稳定的内核的基础。

         目前,较新而又稳定的内核版本是2.2.x和2.4.x,因为版本之间稍有差别,因此,如果你想让一个新驱动程序模块既支持2.2.x,也支持2.4.x,就需要根据内核版本对模块进行条件编译。

         对内核源代码的修改是以补丁文件的形式发布的。patch实用程序用来对内核源文件进行一系列的修订,例如,如果你有2.4.9内核源代码,而你想移到2.4.16,你可以获得2.4.16的补丁文件,应用patch来修订2.4.9源文件。例如:

    $ cd/usr/src/linux

    $ patch-p1 < patch-2.4.16

    1.6.2  Linux内核源代码的结构

         Linux内核源代码位于/usr/src/linux目录下,其结构分布如图1.3所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系。下面是对每一个目录的简单描述。

           include/子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其它模块重建内核。

          init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。

         arch/子目录包含了所有硬件结构特定的内核代码,如图1.3,arch/ 子目录下有i386和alpha模块等等。

         drivers/ 目录包含了内核中所有的设备驱动程序,如块设备,scsi 设备驱动程序等等。

         fs/ 目录包含了所有文件系统的代码,如:ext2, vfat模块的代码等等。  

         net/ 目录包含了内核的连网代码。

         mm/ 目录包含了所有的内存管理代码。

         ipc/ 目录包含了进程间通信的代码。

         kernel/  目录包含了主内核代码        

         图1.3显示了八个目录,即 init, kernel, mm, ipc, drivers, fs, arch 及net 的包含文件都在"include/" 目录下。在Linux内核中包含了  drivers, fs,arch及 net 模块,这就使得Linux内核既不是一个层次式结构,也不是一个微内核结构,而是一个“整体式”结构。因为系统调用可以直接调用内核层,因此,该结构使得整个系统具有较高的性能,其缺点是内核修改起来比较困难,除非遵循严格的规则和编码标准。  

          在图1.3中所显示的模块结构,代表了一种工作分配单元,利用这种结构,我们期望Linus Torvalds能维护和增强内核的核心服务,即,init/,kernel/, mm/及 ipc/,其它的模块drivers, fs, arch及net也可以作为工作单元,例如,可以分配一组人对块文件系统进行维护和进一步的开发,而另一组人对scsi文件系统进行完善。图1.3类似于Linux的自愿者开发队伍一起工作来增强和扩展整个系统的框架。

    图1.3 Linux源代码的分布结构

  • 相关阅读:
    log4j(二)——如何控制日志信息的输出?
    Java生成指定范围内的工具类
    JavaBean和Map转换封装类
    cron表达式详解
    数据库主键按照固定前缀生成工具类
    邮件发送工具类
    NFC
    牛逼辩论
    快速排序
    希尔排序
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/3651438.html
Copyright © 2011-2022 走看看