Linux 2.6、4.3内核编译过程的感受与总结

之前编译过2.4.10版本的内核,很好编译,中间曾经漏下了SCSI low-level drivers下的BusLogic SCSI support选项导致没法启动系统,后来打开该选项后就行了,随手关闭一些没用的选项后编译速度非常快,30秒之内完成编译。当初以为内核编译也不过如此,直到这四天开始编译更新的内核才让我吃了大亏。 我起初的想法是编译一个极其简洁的内核,去掉网络、USB、光驱、等等所有没必要的东西,只留下核心功能,越精简越好,于是在1月21号我就下载了linux-2.6.34.tar.gz源码包,然后开始make menuconfig配置内核,当时只想着精简功能以便缩短编译时间,只关注有没有编译错误,期间由于gcc 3.4兼容版和binutils 2.20版本不匹配导致了链接失败,后来更新了gcc到4.4.7版本就好了。整个过程我都在关注编译时间是否缩短,忙活了一天,效果明显。一路精简下去,把便宜时间缩减到了2-3分钟左右,当时很高兴,觉得要成功了。 结果到了1月22号我开始引导系统时发现根本没法启动,解决一个错误又出一个错误,都是关闭了不该关闭的选项造成的,最终也没启动成功。我知道是有些重要选项被我关了,…

Linux 0.12内核与现代内核在内存管理上的区别

0.12内核的内存管理比较简单粗暴,内核只用了一个页目录,只能映射4G的线性空间,所以每个进程的虚拟空间(逻辑空间)只能给到64M,最多64个进程;每个进程都有对应的任务号nr,当一个进程需要分配进程空间时,只需要nr乘以64M就可以得出该进程空间的线性起始地址。然后该进程的代码段、数据段描述符里面的基址字段会被设定为(nr x 64M),同时可以为进程分配页目录项和页目录表用以承载映射关系。 之后如果进程要访问自己空间内的某个地址时就会首先用基地址与程序内32位偏移地址(逻辑地址)合成出线性地址,这个合成出来的线性地址一定在(段基址)~(段基址+段限长)之间,也就是(nr x 64M ~ nr x 64M+64M)之间。然后用这个线性地址遵循:“页目录项-页表-页表表项”这样的顺序找到对应的页表表项,也就找到了物理地址,就可以真正的存取数据了。 但是在现代内核里,内存管理有很多不同。 首先,线性地址空间不会改变,32位CPU可寻址4G线性空间。这个是唯一的。 但是每个进程都有自己各自独立的4G虚拟空间,那么这是如何做到的呢?其实是每个进程给它一个自己的页目录,这样每个进程就能拥有4G的虚拟空间(逻辑空间)…