ITEEDU

Linux系统学习基础

第一章 开发工具学习

第二章 Linux内核制作

第三章 initramfs制作

第四章 Linux系统制作原理

第五章 文件系统启动方式配制

编译加载linux驱动和内核模块

到目前为止,我们在构建initramfs时还没有涉及内核模块的支持,所用到的硬件驱动程序都是直接编译到内核中。现在我们就看看如何使initramfs支持内核模块。

编译内核模块

首 先,内核配置要支持模块,并支持内核模块的自动加载功能:在内核配置菜单中的激活下面的配置项,编译进内核

Load module support / Enable loadable module support / Automatic  kernel loading ;

然后把需要的硬件驱动程序配置模块形式,比如把我的机器上的硬盘控制器的驱动编译成模块,则选择

Device Driver 
|---->SCSI device support 
|---->SCSI disk support 
|----->verbose SCSI error reporting (不是必须的,但可方便问题定位) 
|----->SCSI low-level drivers 
|---->Serial ATA (SATA) support 
|---->intel PIIX/ICH SATA support 

把它们配置成模块。

最后,编译内核,并把编译好的内核模块安装到image的目录下:

make
make INSTALL_MOD_PATH=~/initramfs-test/image modules_install

命 令执行完毕后,在image/lib/modules/2.6.17.13/kernel/drivers/scsi目录下安装了4个内核模文 件:scsi_mod.ko、sd_mod.ko、ata_piix.ko、libata.ko,它们就是所需的硬盘控制器的驱动程序。

加载内核模块

busybox的modprobe命令执行不正常,不能加载内核 模块。怀疑是busybox的modprobe命令配置或编译有问题。否则可以自动加载驱动。先用insmod命令依次加载。查看/lib/modules /2.6.17.13/modules.dep,弄清楚了4个模块的依赖关系,执行下面的命令加载:

insmod scsi_mod
insmod libata
insmod ata_piix
insmod sd_mod

然后再用

 mdev -s

命令生成硬盘的设备文件。 好了,可以安装硬盘分区,了并把根文件系统切换到硬盘分区:

mount /dev/sda8 /mnt 
exec switch_root /mnt /sbin/init 

系统正常启动到了CLFS,我们可以做到用initramfs中的硬盘控制器的驱动模块安装硬盘分区了。

最终init文件

分区要换成自己的分区。

#!/bin/sh 
mount -t proc proc /proc 
mount -t sysfs sysfs /sys 
insmod scsi_mod
insmod libata
insmod ata_piix
insmod sd_mod
mdev -s 
mount /dev/sda8 /mnt 
exec switch_root /mnt /sbin/init