喜欢Liunx,C,爱好嵌入式技术,爱好Qt 等跨平台技术
分类: IT业界
2013-08-26 21:01:17
从题目中可以看到,这篇文章是以我读《Linux内核设计与实现》而想到的其他我读过的书,所以,这篇文章的主要支撑点是《Linux内核》。
开始读这本书已经是很久以前的事了,不过,由于时间和精力原因,没有认真的分析和深入研究这本书所涉及的诸多内容,现在想来,仍旧很是遗憾,直到最近,再次把这本书拿过来阅读,才勉强可以说是对书中的知识点有了一定的了解,我说的这种了解,远达不到精通的地步,可能略懂才更适合我。
好吧,首先先简单的介绍下这本书。这本书的作者是:Robert Love ,相信系统的学习过Linux的朋友都应该知道这个人,可是,很遗憾,我在百度百科里查不到他的介绍。这是一本翻译过来的书,书的原名叫做《Linux Kernel Development》,我目前看的是第三版,如下图所示。相对前两版来说,第三版中增加了几章非常好的内容,比如,内核数据结构。这本书基于Linux2.6内核展开讨论,对实现Linux内核进行了多方面的分析。
作者在序言里写下读者应该怎么去看这本书,这本书适合的阅读人群。我在这里也多说几句吧。其实,开发内核和驱动的人相对来说不多,不过,很多人喜欢Linux系统,想去了解这个系统,当学习到了一个新的高度的时候,就想去深入内核,去感受怎样实现这个系统,那么,我建议你好好看这本书,绝对是一个不错的选择。
介绍这本书,我从它的内容说起吧。
这两章的内容我们可以在任何一本介绍Linux的书中看到,第一章是对Linux的历史和发展进行介绍,第二章是教我们怎样获取Linux内核源码。这里我又要多说几句了,如果,我们用书中的方法,可能你等了好久也获取不到,因为网络限制,你连接不到服务器,解决办法有两个,最简单的是搜索别的资源;第二个,如果你会的话,翻墙吧。
这一章介绍内核最基本的东西--进程,分析了进程的创建,休眠和销毁等各个进程声明周期。这一章的内容不是很难,相信,如果你读过系统编程之类的书就应该知道在内核中怎么创建和销毁进程,而这里所说的那两个函数(fork和wait)是不是很眼熟呢?从这里我想提到两本书,其中一本也是Robert Love的作品--《Linux系统编程》,如下左图所示。从名字我们就可以看出,这本书侧重点是系统编程,所以,书中所述都是系统调用,是一本不错的工具书,不过,书中内容简短,需要更详细的介绍还是需要看另外一本书--《Unix环境高级编程》,如下右图所示。这本书读过的人肯定很多,它很厚,却很吸引人,如果你想了解更多的系统编程之类的知识,去看看这本书吧。
这一章介绍的内容在Linux相关的书中也有介绍,不过不是很多,不过,这一章的内容让我想起了“很久以前”我学过的一门课--《操作系统》,确实,在那里有介绍关于进程调度和进程调度算法之类的,在《内核设计》这本书中,进程调度的介绍很全面,但是篇幅简短,也是需要一定的知识储备,如果你看不懂或是对书中的内容有所疑问的话,建议你看看这本相对简单的书--《计算机操作系统》,哈哈,没错,就是这本教科书,如下图所示:
只看这一章的题目或许你会认为这一章介绍的是系统调用函数,不过,看看书中的内容你就会知道,这里介绍的不是那些接口的调用,毕竟那些太简单,只要你会用就行。这一章介绍的是系统调用是怎样实现的。当我们在写代码的时候用到系统调用,我们需要传入相应的参数便可由内核执行,那么这些函数是怎么实现的呢,是怎么被注册到内核中的呢,我能不能写系统调用给我或者他人使用呢,那看看这一章吧,绝对会让你受益匪浅。
这一章的内容相比前两版是作者新加入的。这一章里介绍的数据结构包含有链表,队列,红黑树等,这里介绍的数据结构比之前我们学过的数据结构难理解,原因有两个,主要的是作者介绍的不够详细,第二个是对原有数据结构加入面向对象的思想。当然,我们也可以参考相应的介绍数据结构的书来重新回顾下书中所说的知识点,这里,我就不推荐太难的了,毕竟我水平有限,也不大看得懂,建议大家看看严奶奶的那本《数据结构》,如下图所示:
这两章的标题分别叫做中断和中断处理,下半部和退后执行的工作。中断,这个词我们经常会看到,它是CPU接收硬件发送消息的一种处理,当接收到中断消息后会通知相应的中断处理程序执行相应的工作,然而,中断处理程序可能会有一些耗时的操作,那么这时就需要把响应中断先执行,也就是CPU通知硬件接收到了硬件所发送的中断,而把耗时的工作放在以后“有空”的时候执行,一般,这个有空指的就是中断处理程序返回时。对待这两章,如果你想深入的研究,就去好好翻翻计算机体系结构相关的书。好吧,这里我也推荐一本比较简单的书,也是一本我学习过的教科书,哈工大的唐奶奶的书--《计算机组成原理》,如下图所示:
第九章的标题是内核同步介绍,第十章紧接着上一章,这一章介绍的是内核同步方法。这两个标题中都提到的是内核同步。关于什么是同步,我在这里就不多做介绍了。正是因为Linux是多线程的操作方式,所以,避免不了存在竞争,然后,我们就需要处理同步。这两章的篇幅不是很多,但是内容很多,甚至可以说是有点复杂,涉及到多种处理同步的方法,有些方法还很难理解,由此可见作者写这本书的定位不是没有基础的人群,所以,如果你想把这两章看明白,还是建议你去看看基础点的书吧。
我们都知道,CPU存在一个时钟中断,它存在一个周期,到了一定的时间后,就会触发中断,那么这个是怎样实现的呢?我们的计算机在右下角会显示当前的时间,这个又是怎么实现的呢?这一章就是介绍诸如此类的问题,可能我们不常用这些知识点,但是,扩充下自己的知识量也不失为一件快事,所以,这一章的内容我没有深入的去研究,只是“匆匆”浏览了下。
既然这本书名字叫内核,所以,这一章所说的内存管理指的是内核怎样去管理它使用的那部分内存,这一章中的内容很好,而且较为详细,一共23页,建议大家好好学习这一章的内容,看看Linux的设计者是怎么让内核去管理它所占据的内存的,同时,也为以后的章节打下基础,例如进程的内存管理。
你在使用操作系统的时候对于文件系统这个概念可能并不陌生,但是你知道为什么我们可以写一份代码可以在几乎所有不同的文件系统上执行。哈哈,当时我也不清楚,不过,看了这一章的内容后,明白了许多,注意,这里我说的是明白了许多,并不是说“我明白了”。因为,我并没有去查看实现这些通用系统调用的源码,我只是明白了为什么可以这样做,它是怎样执行的,但是我不懂是怎么实现的。在这本书里并没有介绍这些通用函数是怎样实现的,我认为作者是为了节省不必要的篇幅,因为这些内容显然超出了这本书的主题。
什么是块?我们的计算机中都存在硬盘,硬盘最小的寻址单位叫做扇区,但是在计算机中,计算机对硬盘的寻址是多个扇区(一般是4个),而这多个扇区就被称作是“块”。这一章介绍的是内核的IO操作,其中的重点内容是IO调度策略,确实,就像书中说的一样,如果不存在这样的一组策略,那么即使是你的IO请求不多,也会使你的计算机性能急剧降低。可见,这些调度策略是多么的重要,所以,这一章的内容需要认真的学习,研究,这么重要的一章篇幅仍旧是不多,所以,需要把这一章弄明白去查一些资料也就显得很正常了,这里,我没有什么推荐的书籍,遇到不懂的就开始百度或者谷歌吧,这也是最快的学习方法。
第十二章我我介绍了需要好好看看内存管理那一章,因为后面这一章需要那一章的知识,这也体现了内容的呼应。在书内容的开始就介绍了进程,但是没有多做讨论,毕竟开始就不好理解容易让人失去看这本书的兴趣,所以,作者把它放在了这里,其实这样说可能不太准确,因为如果你认真学习过编程语言,那么当你的程序运行的时候你可以写出相应的代码测试进程的每一部分。既然这里说到了编程语言,我再说下语言的事,我喜欢用C,C++,Java写程序,Java没看过什么书,因为都是面向对象,所以,不用过多的去学习语言,我建议学习C和C++,看看下面的这两本书会是不错的选择,这两本书都偏向语言本身,而且都提供了较多的测试代码,适合语言的初学者。
注:由于没有找到一样大小的图片,这里贴的很不好看,很是抱歉。。。。。。
记得上大学的时候看《计算机操作系统》这本书中提到过时间和空间局部性原理的时候用到了缓存,当时也提到了缓存查找用到了TLB(快表),不过,当时只是应付考试记住那些东西就行,现在看这本书的这一章感觉特别亲切,因为至少见过那些东西。然而,这一章介绍的内容比大学时候的那些要难的太多,作者在这一章中也费了好多笔墨,对这一章的描述很是清晰,建议应该好好这一章的内容,这是几乎所有的操作系统都需要实现的东西。
十七章以后的内容我就没再翻了,因为现在还没到做驱动和内核开发那一步,而后面的那些内容我认为更合适于实战,所以,后面的内容并没有去研究了。
好吧,我给出一点读这本书的建议。不得不说,这本书介绍的内容较难,如果你只打算读一遍,那么建议你不要花时间了。其实这本书的每一章内容都可以编写出一本很厚的书,我们通常见到的介绍内核的书一般是一本书介绍一个子系统或者是整合成一本书,不过,那个厚度绝对不比《牛津词典》薄多少。而《Linux内核设计与实现》这本书仅有335页,Linux的诸多子系统大多分成了章节或者几章内容来介绍,而且我们可以看到每一章的内容大多都在20页左右,可见作者把内容精简了太多,几乎可以说是“字字珠玑”。所以,不花大量的时间很难把上面介绍的知识点弄懂,当然,如果你是Linux方面的专家,那么这句话不适合你。还有,由于Linux2.6内核很是庞大,所以,建议大家读这本书之前先看看简单的内核版本,我在这里首推0.11版,也就是Linus编写的第一个Linux系统,简单易学,而且也完整的包含了Linux的各个子系统。所以,这里我推荐最后一本书《Linux内核设计的艺术》,这本书以Linux0.11内核源码展开讨论,书中源码配合图解展开论述,非常适合内核初学者初探内核世界的奥秘,如下图所示:
说完了这些偏技术性的书之外,再说下Linux入门适合看的书,其实我感觉学习Linux没有那么难,但是需要你找到一个好方法,最好是有人指导,当然,如果没能找到人指导你,就看看下面这段话吧.
如果你想知道这个东西是怎么回事,你就去做,去看,去体会。所以,你最好在你的电脑上安装Linux系统,入门的话建议安装Ubuntu,非常简单也非常易用的操作系统。接着,建议你准备一本书--《鸟哥的Linux私房菜之基础学习篇》,这本书有两个版本,另一个是《系统运维篇》,开始学习当然是第一个,也就是下左图所示的这本。这本书的作者是台湾人,介绍自己原本是Linux菜鸟,现在俨然成为Linux大牛,他以自己学习的经历和方法教你认识这个操作系统,之后介绍Linux的许多常用命令,看到这时你应该把上面的命令尝试着敲一遍,做到学为所用。这本书以简单易懂的方式介绍Linux,教你学习这个系统,个人认为可以算作是入门的经典之作,所以,推荐在这篇文章中。不过,当你拿到这本书的时候可能会感觉很沮丧,因为它实在是太厚了,你可能没那么多的时间。好吧,我再推荐另外一本书,这本书的作者是印度人,书很薄,我印象中就两百多页吧,书的名字叫做《Linux Shell脚本攻略》,虽然看名字似乎是在教你怎么去写Shell脚本,但是就我看完这本书之后感觉还是挺适合学习Linux常用命令的,所以,入门的话看看这本书也是不错之选,当然,可能大部分人觉得这本书介绍的内容稍难,这里我讲下看这本书的经验。我看这本书的目的是为了能看懂Shell脚本,Shell脚本其实就是Linux命令的组合再加上一些简单的语法,我可不打算去写Shell脚本。所以,这本书里牵扯到脚本编写的部分,直接略过就行,看懂命令,知道是怎么回事就可以了。个人感觉,绝对是一本好书。如下右图所示。
最后,我介绍一本我将要看的书--《Unix网络编程》,相信知道这本书的朋友很多,这是一本介绍网络编程的经典之作,书分为两卷,设计的也很好看,如下图所示。不过,确实需要花费好多时间,因为两本书都很厚。Unix设计的原则是“一切皆文件”,当你看了一些介绍Linux/Unix的书籍之后,你会明白这句话的道理;不过,还有一句话说的也很好,“一切皆Socket”,这也是形容Unix,Unix最大的特点就是它的网络行为,所以,学习了“本地”内容之后,去看看Internet吧。