Linux内核体系结构(Linux Kernel Architecture Over View)
序言
记得几年前我刚刚接触Linux,刚刚听说操作系统内核的概念,想起学习Linux的内核,去阅读Linux内核的源码,但一直到现在,才能走到内核的门口,速度之慢,实在是羞愧难当。这篇文章早就想写了,但是一拖再拖,也想过像那些大牛要写就写有水平的文章,而且一出就出一系列~,现在什么都不管,但是想想凡事岂能一步登天?慢慢的来吧,我的博客当作是我的学习笔记好了。
大二的时候想学习内核源码,没有专业基础的知识,去读源码的确比较盲目,但是我在应用层摸索徘徊了很长的时间,浪费了很多宝贵的时光,还有考研的一年~。Linux内核现在发展很快,已经到了
介绍内核结构
操作系统内核和操作系统应用层的关系可以引用《Linux Kernel Development》上的一幅图来表示一下:
图一 OS结构图
最上层的是应用程,我们平时接触的应用软件都在上面,例如浏览器、QQ之类的等等。在Windows系统中分为ring0~ring3的运行级别,相应的Linux内核中也有这样的运行等级。图中的System Call Interface就是系统调用接口,当应用程序需要访问内核时通过系统调用是唯一的合法通道,系统调用,就是用户程序空间通往内核的唯一合法桥梁。通过了系统调用,就到了内核。Linux内核主要由五大块组成:进程调度,内存管理,文件系统,设备驱动,网络子系统。(我面试时被问过,竟然没有答好,该死!!)内核的下面是设备驱动,驱动用于硬件和操作系统的连接,那设备驱动下面自然就是硬件了。
图二 Linux Kernel Architecture
我认为这幅取自《Linux Device Driver》的Linux内核结构图把内核描述得视乎更精彩一些,我们可以清晰的看到调度进程、内存管理,文件系统,设备驱动,和网络子系统的作用功能。对于理论上over view的认识,这样差不多了。
Linux内核源码结构
我们平时安装了Linux操作系统,但是有时候找不到源码,很多书上说在/usr/src/下可以找到内核源码,但是若你安装时没有选上或者像Fedora6那样压根没有明显的选择的安装源码,那你在/usr/src/下是找不到内核源代码的,以前的内核版本中常说内核源码储存在/usr/src/linux 目录中,你到/usr/src/用ls –l命令查看一下,可以看见一般linux这个目录是一个连接,相当于Windows中的快捷方式,可以用命令ln –s linux
(http://forum.eviloctal.com/index.php)的网站上下载,我就是在那里下到了0.11版本的内核,传说linus本人当年写完的就是那个内核:)。我假设已经下载好了一个内核,到/usr/src/下解压,就可以得到内核源码,我们可以用它来编译一个新的内核给我们使用,也可以用来做其他目的,编译内核不是这里的主题,我在这里不过多讲述,有兴趣的朋友可以参考我转摘的一篇编译内核的文章或者上互联网搜索。
Linux 内核源代码的结构如下:
目录 |
描述 |
arch |
|
crypto |
|
Documentation |
|
drivers |
|
fs |
|
include |
|
init |
|
ipc |
|
kernel |
|
lib |
|
mm |
|
net |
|
scripts |
|
security |
|
sound |
|
usr |
当你解压好后源码已经整齐的呈现在你的面前,感觉直接去啃源码不是大牛很困难,最好配合着书或者其他的资料来看,看几遍收效会好很多。源码到底可读性不如文字好,这里只是希望你知道内核是个什么东西,要是想深入的学习最好是配合资料的去读源码或者直接读源码。像《Understanding Linux kernel》或者情景分析这样的书配合源码阅读很不错,推荐。:)
另外阅读源码也可以到http://lxr.linux.no/这个网站上去阅读,很方便,可以在线交互式的阅读源码。
关于内
这个我们可以不去理会它,争论这些没有什么意义,我们去看有用的地方。
以下
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)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。
除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的过程。例如:分配和释放内存空间的过程,打印警告或错误信息的过程,还有系统的调试例程等等。
结语
这篇文章仅仅粗略的说明了内核的一些基本的东西,希望能对你有帮助,我真心的希望你加入到开源世界来共同学习和交流,在这里我的文章主要作伪笔记,要是有达人瞅见了,望能斧正:)