Linux设备驱动程序有两种加载方式。一种是直接编译进Linux内核,在Linux启动时加载;另一种是采用内核模块方式,这种模块可动态加载与卸载。
如果希望将新驱动程序编译进内核,需要修改内核代码和编译选项。下面以字符型设备为例,说明如何在Linux内核中添加一个新的设备驱动程序。如果驱动程序代码源文件为infrared_s3c2410.c,将infrared_s3c2410.c复制到内核代码的/drivers/char目录,并在该目录下的Kconfig文件最后增加如下语句:
config INFRARED_REMOTE
tristate"INFRARED Driver for REMOTE"
depends on ARCH_S3C64XX||ARCH_S3C2410
default y
help
在该目录下的Makefile中添加如下语句:
Obj-$(CONFIG_INFRARED_REMOTE)+=infrared_s3c2410.o(https://www.xing528.com)
进入Linux内核源代码目录,执行make menuconfig命令后,选择【device drivers】->【character devices】,进入如图1-3所示的内核配置窗口,可见最后一行即新增的驱动:

图1-3 在内核中增加新驱动程序
在内核配置窗口中可以使用上下键、空格键和回车键进行选择、移动和取消选择。内核配置窗口中以<>带头的行是内核模块的配置,以[]带头的行是内核功能的配置。选项前如果为<*>,表示相应的模块将被编译进内核。如果选项前是<>则表示不编译进内核。这里在【INFRARED Driver for REMOTE】行前面设置为<*>,则infrared_s3c2410.o将被编译进内核。在使用make zImage命令编译内核时所有设置为<*>的项将被包含在内核映像中。
采用可加载模块方式让驱动程序的运行更加灵活,也更利于调试。可加载模块用于扩展Linux操作系统的功能。使用内核模块的优点是可以按照需要进行加载,而且不需要重新编译内核。这种方式控制了内核的大小,而模块一旦被插入内核,它就和内核其他部分一样,可以访问内核的地址空间、函数和数据。可加载模块通常以.ko为扩展名。在图1-3中选项前如果为<M>,表示编译成可加载模块。在使用make modules命令编译内核时,所有设置为<M>的项将被编译。make modules结束后可以使用下面的命令安装内核中的可加载模块文件到一个指定的目录:
make modules_install INSTALL_MOD_PATH=/home/usr/modules
使用make命令编译内核相当于执行make zImage和make modules两个命令。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
