};

设备驱动程序的主体可以说是写好了。现在要把驱动程序嵌入内核。驱动程序可以按照两种方式编译。一种是编译进 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。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查