本文是制作最小linux内核系列的最后一篇,这篇相对简单:把内核配置界面下"Device Driver"选项中一些编译进内核的驱动编译成模块,并把这些模块安装到initrd.img。当引导系统时,内核从initrd.img中加载模块,最终使系统正常工作起来。

首先配置内核选项,执行make menuconfig进入Device Driver选项:

将"Serial ATA and Parallel ATA drivers"编译为模块,并将其中的子项"AHCI SATA support"编译为模块



进入Device Driver选项-"Block devices",将RAM block device support编译为模块:


进入Device Driver选项-"SCSI device support",将SCSI disk support编译为模块:


进入Device Driver选项-"SCSI device support"-"SCSI low-level driver"中LSI MPT相关的选项编译成模块:


至此配置结束。准备编译内核,执行make all -j4。请注意,生成新的bzImage后不要急吼吼执行命令cp bzImage然后就重新引导系统。Why?新生成的kernel中没有磁盘驱动,引导过程中会报panic。那磁盘驱动去哪了?恩,还在内核目录下,只不过需要把他们安装到制作initrd.img文件的目录中。命令如下:

make modules_install INSTALL_MOD_PATH=/home/eugen/Desktop/initramfs
参数modules_install用于告诉make工具准备安装内核模块;而INSTALL_MOD_PATH后面跟着的路径是我用于制作initrd.img文件的目录。安装后,可以看到initramfs/lib目录下多了两个目录分别为firmware/目录,用于存放设备固件和modules/目录,用于存放驱动模块:



图中modules/目录下的3.13.11-ckt39目录是我使用的linux内核源码的版本号;3.13.11-ckt39/下存放了加载模块时的用于匹配设备PID VID的modules.alias文件,模块依赖关系modules.dep文件等,而kernel/目录存放了引导内核时用到的模块:


最后重新引导系统看看定制的结果:

lsmod查看系统已加载的模块,很不幸,busybox中没有这个命令。换个方式用cat /proc/modules来列举内核模块


从中我们看到了libahci/libata/mptscsih等以前被编译进内核的模块。另外,我们进入/lib/modules路径后也能看到这些设备驱动是以.ko可加载模块的形式存放在根文件系统中。



参考文档:王柏生 <深度探索Linux操作系统系统构建和原理解析>

Logo

更多推荐