Linux内核主要由5个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口和进程间通信。
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结构描述了虚拟内存的一个区域。(www.xing528.com)
●Inode:虚拟文件系统(VFS)中的文件、目录等均由对应的索引节点(inode)代表。每个VFS索引节点中的内容由文件系统专属的例程提供。VFS索引节点只存在于内核内存中,实际保存于VFS的索引节点高速缓存中。如果两个进程用相同的进程打开,则可以共享inode的数据结构,这种共享是通过两个进程中的数据块指向相同的inode完成的。Linux核心源程序通常安装在/usr/src/linux目录下,在该目录下有以下一些目录和文件:
●COPYING:GPL版权声明。对具有GPL版权的源代码改动而形成的程序,或使用GPL工具而产生的程序。
●CREDITS:对Linux作出很大贡献的一些人的信息。
●Makefile:用来组织内核的各模块,记录模块之间的相互联系和依托关系。
●ReadMe:核心及其编译配置方法的简单介绍。
●Rules.make:各种Makefilemake所使用的一些共同规则。
●Arch/:所有和体系结构相关的核心代码,每一个子目录都代表一种支持的体系结构。
●Include/:包括编译核心所需的大部分头文件。
●Init/:包含核心的初始化代码。
●Mm/:包含所有独立于CPU体系结构的内存管理代码。
●kernel/:主要的核心代码。
●Drivers/:放置系统所有的设备驱动程序。
●Documentation/:文档目录,没有内核代码,只是一套有用的文档。
●Fs/:所有文件系统代码和各种类型的文件操作代码。
●ipc/:包含核心的进程间通信的代码。
●Lib/:放置核心的库代码。
●Net/:核心与网络相关的代码。
●Modules/:模块文件目录。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。