3.1.3 有效载荷——vmlinux

在编译时,kbuild分别构建内核各个子目录中的目标文件,然后将它们链接为vmlinux。为了缩小内核体积,kbuild删除了vmlinux中一些不必要的信息,并将其命名为vmlinux.bin,最后将vmlinux.bin压缩为vmlinux.bin.gz。在默认情况下,内核使用gzip压缩,当然也可以在配置时指定使用lzma等压缩格式。gzip的压缩比相对较小,但是压缩速度相对较快。

那么为什么内核要进行压缩呢?

1)最初,因为在某些体系架构上,特别是i386,系统启动时运行于实模式状态,可以寻址空间只能在1MB以下,如果内核尺寸过大,将无法正常加载,因此,对内核进行了压缩。在内核加载完毕后,CPU切换到保护模式,可以寻址更大的地址空间,于是就可以将压缩过的内核展开了。

2)另外一个原因是,2.4及更早版本的内核,需要可以容纳在一张软盘上,所以内核也要进行压缩。

以上都是历史原因了,如今有些Bootloader,如GRUB,在加载内核期间就已经将CPU切换到保护模式了,寻址空间的限制早已不是问题。而且,如今软盘基本已经被其他介质替代,容量已不是问题。

但是内核的压缩还是保留了下来,毕竟还要考虑到某些尺寸受限的情况。而且,现代CPU解压的速度要远大于IO的速度,在启动时虽然解压要耗费一点时间,但是更小的内核也减少了加载时间。