linux的根文件系统可以存储在很多的介质上,如SCSI、IDE、USB等,如果将这些驱动都编译进了内核,那么内核将会变得非常臃肿、庞大啊!所以linux的kernel只保留了最基本的启动代码,而把各种的硬件设备的支持以模块的形式放在了initrd.img中。这样的好处是在启动的过程中可以从initrd所挂载的根文件系统中装载所需要的模块,从而可以在kernnel不变的情况下,修改initrd的内容达到灵活地支持不同的硬件。在启动完成的最后阶段,根文件系统重新挂载到其他设备上去。
举个例子,你的硬盘是SCSI接口但你的内核又不支持这种接口,你的内核就没有办法访问硬盘,也就没法加载硬盘上的文件系统,这个怎么办呢?? initrd.img是个ram disk的映像文件。ram disk是占用一部分的内存模拟成磁盘,让我们的操作系统访问。ram disk是标准内核文件认识的设备(/dev/ram0)文件系统也是标准内核认识的文件系统。内核加载这个ram disk作为根文件系统并开始执行其中的某个文件--init(2.6以上的内核是 init文件,位于/sbin/)来加载各种模块,服务等。经过一些配置和运行后,就可以去物理磁盘加载真正的root分区了,然后又是一些配置等,最后启动成功。
所以initrd.img的作用就是将一些驱动程序和命令工具打包到img里从而简化内核,这完全符合linux的设计思想和linux的哲学思想啊!
4) system.map,内核符号表,位于/boot/System.map 。当你编译一个新的内核的时候,内核的各个符号的地址就会变化,旧的内核符号表的信息对于新的内核来说是错误的,如果还用旧的内核符号表就会出错,所以会产生一个新的内核符号表即system.map