这里不只是讲怎样编译、安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件。最后还利用学到的编译、安装Linux内核去修改Linux的01调度变成随机调度。如果你只是需要编译、安装内核的几条指令,那么翻到文章中后部分吧。如果有哪里写错或者写得不太清楚的请指正。谢谢你的阅读!
内核嘛,就是Linux的核心,如果你用Linux只是为了听听歌,看看电影,上上网,那么我想Linux是不太适合你的。但能打开这篇文章,那么你应该就是对Linux有兴趣了。这里我们一起编译下这个世界上IT里最完美的艺术品!----Linux内核
编译前先来看看Linux内核的源码目录结构。有助于认识Linux内核,熟悉了她,就不会再有恐惧与无助的感觉。
内核源码录目结构:
1) Documentation 这里没有代码,有的只是一些各种各样文档,但可以给我们足够多的帮助。
2) arch 所有与体系结构有关的源代码都在这里,还有在include/asm-*/目录里。所支持的体系结构都在arch目录下有对应的子目录,而且最少都包含3个子目录。
kernel:支持体系结构特有的如信号处理、SMP等的实现。
lib:体系结构特有的对strlen、memcpy之类的通用函数的实现。
mm:很明显啦,这个是体系结构相关的内存管理的实现。
大多数的子目录都包含boot这个子目录,在硬件平台上启动内核的所使用的部分或全部代码。
3) drivers 这里有显卡、scsi适配器pic总线、usb总线和其他的linux支持的外围设备和总线的驱动程序。是内核中最大的一个目录。
4) fs 文件系统。这里有VFS、各个不同文件系统的代码都在这里。
5) include 包含了内核中大部分的头文件。
6) ipc 进程间通信,包含了信号量、共享内存和其他形式的ipc的代码。
7) kernel 包括了进程的调度、创建、撤销和平台相关的的另一部分的核心代码。是内核最核心的部分。
8) init 内核初始化部分的代码。包括main.c及创建早期用户空间的代码等。
9) lib 库代码
10) mm 与体系结构无关的内存管理部分的代码。
11) net 网络部分的实现代码,常见的协议如TCP/IP、IPX。
12) scripts 这里没有代码,只有一些用来配置内核的脚本文件。当我们编译内核的时候,运行make menuconfig 之类的命令时我们就是与这个目录下的脚本在交互。
13) block block层的实现。
14) security linux安全模型的代码。
15) crypto。 内核本身的加密API,实现了常用的加密算法和散列算法,和一些压缩、CRC校验算法。
16) sound 声卡驱动及其他声音相关的代码。
17) usr 用于打包的与压缩的cpio等。
各个文件如图:
到这里,当你打开linux源代码时就不会再觉得那么无助了。下面我们继续。
下面介绍几个重要文件。
1) vmlinuz 内核引导文件
vmlinuz是可引导的压缩内核,“vm”代表“Virtual Memory”。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz不是可执行 的Linux内核(网上说是可以执行的内核,可能有误。因为是压缩的,要执行必须解压。望大神指教!),因此在启动阶段首要的工作就是自解压内核映像,它位于/boot/vmlinuz,它一般是一个软链接。zImage(vmlinuz,小内核小于512kb)和bzImage(vmlinuz,大内核大于512kb)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。
2) vmlinux
vmlinuz 是vmlinux的压缩版。
vmlinuz结构如图:
3) initrd.img
initrd.img,即"initrd RAM disk",是一个小的映象,包含一个最小的linux系统。通常的步骤是先启动内核,对vmlinuz内核文件解压后但在真正根文件系统启动前,initrd.img文件会被加载到内存中。内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块,然后发现真正的root分区,挂载并执行/sbin/init。如果没有initrd.img,那么内核就试图直接挂载root分区。