};
设备驱动程序的主体可以说是写好了。现在要把驱动程序嵌入内核。驱动程序可以按照两种方式编译。一种是编译进 kernel,另一种是编译成模块(modules),如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以推荐使用模块方式。
int init_module(void)
{
int result;
result = register_chrdev(0, “test”, &test_fops); 对设备操作的整个接口
if (result 《 0) {
printk(KERN_INFO “test: can‘t get major number\n”);
return result;
}
if (test_major == 0) test_major = result; /* dynamic */
return 0;
}
在用 insmod 命令将编译好的模块调入内存时,init_module 函数被调用。在这里,init_module 只做了一件事,就是向系统的字符设备表登记了一个字符设备。register_chrdev 需要三个参数,参数一是希望获得的设备号,如果是零的话,系统将选择一个没有被占用的设备号返回。参数二是设备文件名,参数三用来登记驱动程序实际执行操作的函数的指针。
如果登记成功,返回设备的主设备号,不成功,返回一个负值。
void cleanup_module(void)
{
unregister_chrdev(test_major,“test”);
}
在用 rmmod 卸载模块时,cleanup_module 函数被调用,它释放字符设备 test 在系统字符设备表中占有的表项。
一个极其简单的字符设备可以说写好了,文件名就叫 test.c 吧。
下面编译 :
$ gcc -O2 -DMODULE -D__KERNEL__ -c test.c –c 表示输出制定名,自动生成 .o 文件
得到文件 test.o 就是一个设备驱动程序。
如果设备驱动程序有多个文件,把每个文件按上面的命令行编译,然后
ld ?-r ?file1.o ?file2.o ?-o ?modulename。