Linux设备驱动程序有两种加载方式。第一种是直接编译进Linux内核,在Linux启动时加载;第二种是采用内核模块方式,利用模块可动态加载。
如果希望将新驱动程序编译进内核,需要修改内核代码和编译选项。下面以字符型设备为例,说明如何在Linux 2.6内核中添加一个新的设备驱动程序。如果驱动程序代码源文件为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
进入Linux 2.6内核源代码目录,执行make menuconfig命令后,单击【device drivers】→【character devices】,进入如图1-3所示的内核配置窗口。
在内核配置窗口中可以使用上下键、空格键和回车键来进行选择、移动和取消选择。内核配置窗口中以< >开头的行表示内核模块的配置,以[ ]开头的行表示内核功能的配置。选项前如果为<*>,表示相应的模块将被编译进内核。如果选项前是< >则表示不编译进内核。这里在【INFRARED Driver for REMOTE】行前面配置为<*>,则infrared_ s3c2410.o将被编译进内核。在使用make zImage命令编译内核时所有配置为<*>的项都将被包含在内核映像中。
图1-3 在内核中增加新驱动程序
采用可加载模块方式可以让驱动程序的运行更加灵活,也更利于调试。可加载模块是用于扩展Linux系统功能的。使用模块的优点是可以按照需要进行加载,而且不需要重新编译内核。这种方式控制了内核的大小,而模块一旦被插入内核,它就和内核其他部分一样,可以访问内核的地址空间、函数和数据。可加载模块通常以.ko为扩展名。在图1-3中选项前如果为,表示编译成可加载模块。在使用make
modules命令编译内核时,所有配置为的项都将被编译。make modules结束后可以使用下面的命令安装内核中的可加载模块文件到一个指定的目录:- make modules_install INSTALL_MOD_PATH=/home/usr/modules
如果使用make命令编译内核相当于执行make zImage和make modules两个命令