节前上班的日子老是那么清闲,这么集中的时间,正好集中学习一下。一直以来都作的是Java开发,对不了解底层,总以为心有不安。听到别人提及“进程切换”、“内存管理”、“内核态和用户态”,也老是以为似懂非懂。因此就干脆把目标定大一点,学学Linux内核吧!linux
其实若是你使用Linux系统,那么内核的源码就直接在/usr/src目录下了。不过仍是建议去下载一份最新的源码!哪里下载呢?Linux的做者-大名鼎鼎的Linus Torvalds也是Git的做者,因此你知道最新的源码去哪里下载了吧!赶忙去https://github.com/torvalds/linux拉一份最新代码吧!git
git clone https://github.com/torvalds/linux
代码一共有1.4G,因此耐心等待一会吧…github
编译内核是个苦力活。首先,你必须得在Linux系统下,由于编译Linux是依赖gcc的。而后,你编译的版本得跟当前版本一致(博主不彻底确定,可是实践下来是这样)。安全
而后就是编译了!Linux内核编译反而会简单,由于它没有太多的依赖要编译。因此能够用经常使用的三段式(须要root权限):网络
make config make make install #install就替换当前内核了,三思然后行!
make config
是交互式的,会须要指定使用什么不使用什么。不过这选项实在太多了点,第一次大概选了几百个选项吧…后面才知道,能够图个方便,用make allyesconfig
来替代了。反正咱们只是看看能不能编译嘛,嗯。make
是个很漫长的过程。make install
会替换当前内核了,咱们这边就不替换了。总之到了这里,已经有一些成就感了!编辑器
关于Linux的代码结构有不少文章,例如这篇:http://blog.csdn.net/liaoshengjiong/article/details/3957654,就不赘述了。查看一下代码,乖乖,一共500多万行,估计一两年也读不完吧!个人目的只是了解底层的基本原理,没有必要深刻到各类细节。更况且,好多驱动、文件、内存的概念也不熟悉,怎么办呢?仍是先看书吧!性能
我以前的观点是读源码前至少了解项目的领域知识。对于Java码农来讲,操做系统毕竟不是熟悉的领域,一开始就看源码不太现实。一两本参考书是必不可少的。这里我也浏览过几本书,最后以为比较好的是《Linux内核设计与实现》,这本书大部分是理论为主,可是最后总会介绍到大体对应的代码在哪里,就起到很是好的提纲挈领的效果。对于有过一些代码经验的人来讲,会以为异常亲切。关键是,它只有200页!学习
浏览的另外几本书,包括大名鼎鼎的《深刻理解计算机系统》,这本书全面详尽,可是更适合作教材,实践性弱了点(虽然它也有不少例子)。还有一本《深刻理解LINUX内核》,内容对于入门又深了一点。一句话,讲了“深刻”的都不太适合入门!还有本《30天自制操做系统》,不是说书很差,而是太基础了点,看到“用二进制编辑器写代码”就看不下去了。atom
好了,下面开始学习了。其实弄了那么多,我想说一件事就是,内核虽然很难,不少人只靠研究它就已经成了大牛。可是它难在于,越是底层的东西,对质量、稳定性、性能要求越高,同时须要考虑的状况越多,可是其实其理论和思想,可能你们都是耳熟能详的。操作系统
例如,在“进程管理”部分,咱们常见的“进程描述符”对应的是sched.h
中的一个结构:task_struct
:
struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ struct thread_info *thread_info; atomic_t usage; unsigned long flags; /* per process flags, defined below */ unsigned long ptrace; … }
而进程是保存在一个带优先级的双向链表里的,这跟Java里的PriorityQueue原理类似。怎么样,是否是以为“进程调度”也没有那么神秘了呢?
同理,咱们常常说“内核态”和“用户态”,实际上二者的代码都是c实现,搞出一个“内核态”是为了安全和某些性能的考虑,可是区别也没有想象中的那么大!其实这跟咱们熟悉的“平台”和“业务逻辑”是否是有那么点类似呢?
总之,掌握基本的内核知识,应该仍是不难的!好处就是,之后对程序设计的理解会更进一步了!
关于内核实现的一些原理的具体内容,《Linux内核设计与实现》(Linux Kernel Development,简称LKD)已经比较全面了,网络上的资料也很是多。这系列博文主要想站在初学者的角度,在了解How以前,先了解What跟Why,从而对内核有个稳固的大局观。同时会寻根究底的方式,找到对应的内核代码,知足一下考究的爱好。 PS:博主对c和Linux的理解都是入门水平都算不上,若是有问题欢迎指正,我会很开心接受的!