Linux内核体系结构(Linux Kernel Architecture Over View)
序言
记得几年前我刚刚接触Linux,刚刚听说操作系统内核的概念,想起学习Linux的内核,去阅读Linux内核的源码,但一直到现在,才能走到内核的门口,速度之慢,实在是羞愧难当。这篇文章早就想写了,但是一拖再拖,也想过像那些大牛要写就写有水平的文章,而且一出就出一系列~,现在什么都不管,但是想想凡事岂能一步登天?慢慢的来吧,我的博客当作是我的学习笔记好了。
大二的时候想学习内核源码,没有专业基础的知识,去读源码的确比较盲目,但是我在应用层摸索徘徊了很长的时间,浪费了很多宝贵的时光,还有考研的一年~。Linux内核现在发展很快,已经到了2.6.23版本了,几十兆的代码,读到老死都读不完,其实想学习内核的朋友刚开始像我当时找不到方向就应该先去看书,《Linux Kernel Development》Robert Love,《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 linux2.6.23 linux来生成(这里假设你是2.6.23的内核),如果你没有在/usr/src/下找到内核源码,不要灰心,可以到http://www.kernel.org/这个网站上下载,这是内核的官方网站,里面有各个版本的源码,要是你想要读linux0.11版本的源码,可以到邪恶八进制
(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/这个网站上去阅读,很方便,可以在线交互式的阅读源码。