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

2017-03-14

编译加载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

更多相关阅读

最新发布的文章