楚门 发表于 2014-10-16 17:42:16

linux内核原理01——前言

本帖最后由 楚门 于 2014-10-16 17:47 编辑

想起来也有快2年没在鱼C上写东西了,一来实在没有写东西的习惯,二来自己这点水平也实在没啥东西可写。但高手都有写博客的习惯,咱写不了博客就写点不疼不痒的帖子吧。
学习linux内核也有一段时间了,期间读了些零零散散的书籍,零零散散的章节,零零散散的文章,有的时候好像感觉自己对某个模块大彻大悟了,但过了一段时间再来看相关资料好像又感觉自己以前的理解是错误的,总之自从跳进了kernel这个坑,就感觉自己很难爬出去了。但自己走上了技术的这条道路,尤其是IT这条路,那就必须得有不服输的精神,敢于去探究事物内在本质的Hacker精神。很多前辈也说过内核这东西不是要靠天赋才能征服的,靠的仅仅是今天的努力和明天的更努力,想想自己学习kernel的历程,也许真的是因为很少做总结的原因,才导致现在的只知树叶不知森林,于是就萌生了这个写读书笔记的想法。只是不知到自己能不能坚持下去。由于水平有限,总结的不一定都是正确的,如有错误也欢迎指正,大神勿喷。好了言归正传。
本系列笔记主要是以《深入理解linux内核》和《深入linux内核架构》这两本书作为参考,相信学习过linux kerenl的人都熟悉这两本书的,具体这两本书怎么样,可以去豆瓣上看看这两本书的书评,说来《架构》这本书的作者居然是搞量子物理的,封面的样子看起来也是个年轻帅小伙,实在让我等汗颜啊!
需要准备的东西:
    1.linux内核源码,kernel.org上可以下载到,我是用的是linux2.6.24版本的代码。
    2.浏览代码的工具,VIM+ctags,当然windows下也有浏览源代码的工具(Source Insight)但本人还是喜欢VIM,使用linux一段时间之后在去win下写代码总是会不自觉的去按ESC,实在是太蛋疼了,当然用什么工具取决于你自己的喜好。
    3.扎实的C语言基础和少量汇编的基础,因为整个kernel是用C写成的,其中使用了少量特定于平台(CPU)的汇编语言,其中也用到了不少C语言中比较高级的技巧,另外还有大量GCC对C语言的扩展。
    4.当然如果对某些特定平台的架构有了解的话那就很好了。当然你必须得有使用linux的经验,就像Linus Torvalds说的:想要弄懂linux,你得先学会使用他。
有了这些背景知识就可以开始linux kernel之旅了。
我在学习的过程中走了不少弯路,也得到了不少的经验教训,虽然这些经验在网上都有大片的陈述,但是除非自己亲生经历,否则很难体会这些经验的宝贵。总的来说就是在学习kernel的过程中,不要一上来就深入到代码的森林中,这样会把自己碰的头破血流,而且非常打击自己的自信心。在深入到代码之前先要对某个主题有一个全方位的把握,内核的这块功能是干什么的?为什么要提供这种功能?它的好处是什么?对这些东西有了一个大概的认知之后再去阅读代码,当然这个时候阅读代码不能直接深入到各个功能函数里面去,要首先弄清楚,为了实现这些功能,kernel里面使用了哪些数据结构,这些数据结构之间以一种什么样的关系和组织方式来提供实现这些功能的基础,等到把这些数据结构的关系理清了,剩下的就只是用时间去磨代码了。说了这么多,稍微举个例子简单的说明一下吧。
就拿linux的VFS(virtual filesystem虚拟文件系统)来说,它是使linux能够支持60多种文件系统的基础,从这一点就能看出linux VFS的强大之处,VFS是有关文件系统的系统调用(对用户层的接口)和底层文件系统驱动的一个内核中间软件抽象层,这样使得用户层的文件访问代码不必在意底层文件系统的具体实现,底层文件系统只要实现了VFS所规定的接口就可以加入到linux内核中,这也就是UNIX的一切皆文件的设计哲学的体现,linux继承了这种设计哲学。那么想要弄懂VFS的实现就必须先弄清楚VFS内部用到的数据结构,struct super_block;struct inode;struct dentry;struct file;struct fs_struct;struct files_struct这6大数据结构,以及它们之间的关系,在这个过程中会认识到struct dentry这个数据结构所起到的关键作用,当然还有一些xxx_operations之类有关操作以上数据结构的操作集合,具体就不浪费篇幅在这里说了,以后学到了这里在写相关的笔记,弄清楚这些数据结构之后,就可以自己在脑海里绘制整个VFS的数据结构网络图了,这样对VFS就有了比较清晰的认识,接下来就可以分析某个具体的功能函数是如何执行的了,那就靠时间去磨就好了。如果看不懂上面写的东西,暂且略过好了。
学习linux kernel不是一朝一夕的事,需要长时间的积累,也是对自己毅力的挑战,在未来的某个时刻顿悟之后,我相信我能看到属于我的那片彩虹。也希望能和大家共同学习,共同进步。


c/c++编程

zh741 发表于 2014-10-16 17:59:25

已关注{:9_228:}

cyshhm 发表于 2015-1-18 16:33:41

我也很想学习Linux内核源代码啊!不知道方向啊

zhouxcpython 发表于 2016-6-17 14:54:43

感谢分享
页: [1]
查看完整版本: linux内核原理01——前言