11.4.4 驱动程序的编译与装载

写完了设备驱动程序,下一项任务就是对驱动程序进行编译和装载。在Linux里,除了直接修改系统内核的源代码,把设备驱动程序加进内核外,还可以把设备驱动程序作为可加载的模块,由系统管理员动态地加载它,使之成为内核的一部分。也可以由系统管理员把已加载的模块动态地卸载下来。Linux中,模块可以用C语言编写,用gcc编译成目标文件(不进行链接,作为*.o文件存盘),为此需要在gcc命令行里加上-c的参数。在编译时,还应该在gcc的命令行里加上这样的参数:-D__KERNEL__ -DMODULE。由于在链接时,gcc只允许一个输入文件,因此一个模块的所有部分都必须在一个文件里实现。            

编译好的模块*.o放在/lib/modules/xxxx/misc下(xxxx表示内核版本),然后用depmod -a 使此模块成为可加载模块。模块用insmod命令加载,用rmmod命令来卸载,并可以用lsmod命令来查看所有已加载的模块的状态。                                     

编写模块程序的时候,必须提供两个函数,一个是int init_module(void),供insmod在加载此模块的时候自动调用,负责进行设备驱动程序的初始化工作。init_module返回0以表示初始化成功,返回负数表示失败。另一个函数是void  cleanup_module (void),在模块被卸载时调用,负责进行设备驱动程序的清除工作。                                                                          

在成功的向系统注册了设备驱动程序后(调用register_chrdev成功后),就可以用mknod命令来把设备映射为一个特别文件,其它程序使用这个设备的时候,只要对此特别文件进行操作就行了。