Linux内核文件主要有三个,vmlinuz,initrd.img和System.map。对于内核学习的人来说,这三个文件非常重要。
1.vmlinuz
vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存。
vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建。zImage适用于小内核的情况,它的存在是为了向后的兼容性。二是内核编译时通过命令make bzImage创建。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。
zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。
另外,vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
2.initrd.img
initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。initrd主要是用于加载ext3等文件系统及scsi设备的驱动。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一 个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd.img是用gzip压缩的文件。
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它 Linux发行版或许有相应的命令。这是个很方便的实用程序。
3.System.map
System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。
内核符号表是怎么创建的呢? System.map是由“nm vmlinux”产生并且不相关的符号被滤出。
nm /boot/vmlinux-2.6.32-10 > System.map
下面几行来自/usr/src/linux-2.6/Makefile:
nm vmlinux | grep -v ‘compiled\|\.o$$\|
[aUw]\|\.\.ng$$\|LASH[RL]DI’ | sort > System.map
4.initrd和initramfs的区别
首先要介绍kernel启动init的两种方案。
第一种是,ramdisk,就是把一块内存(ram)当做磁盘(disk)去挂载,然后找到ram里的init进行执行。
第二种是,ramfs,直接在ram上挂载文件系统,执行文件系统中的init。
initrd(init ramdisk)就是ramdisk的实现,initramfs就是ramfs的实现。
tmpfs,是ramfs的增强版方案。rootfs,是ramfs/tmpfs的一个特殊实例。所以initramfs也可以是tmpfs/rootfs的实现。
不要被文件名迷惑,kernel 2.6 以来都是 initramfs 了,只是很多还沿袭传统使用 initrd 的名字。
参考: https://blog.csdn.net/zhongbeida_xue/article/details/106627102