Linux 内核模块编程的第一个字符设备驱动

时间:2023-01-04 12:09:22

最近学习Linux 内核模块编程,看的是《Linux内核模块编程指南》这本书,在字符设备驱动这一节遇到了几个问题,简单的记录一下。

1.  ret = unregister_chrdev (...)

    在编译时,出错:

  error: void value not ignored as it ought to be

   在cleanup_module(...)中调用的这个函数说是没有返回值,查了一下,应该是在以前版本的内核中是有返回值的,但是在一些较新版本的内核中没有返回值了,所以这个问题比较好解决,只要去掉返回值,后面的if同时去掉就可以了。

2. put_usr( ...)?

  同样,在编译时,这个地方也出现了问题
 

   error: implicit declaration of function ‘put_usr’ [-Werror=implicit-function-declaration]
   但是当我查Linux内核的API时却没有查到这个函数,但是查到了

 __put_user( x,  ptr )
  这个函数,所以将原文中的

  put_usr(*(msg_Ptr++), buffer++);
  改为

 __put_user(*(msg_Ptr++), buffer++);
  即可。这样便可以编译通过。

3. 程序的执行过程

  首先要加载模块,假设最终生成的模块名是chardev.ko,用insmod命令加载

insmod  ./chardev.ko
然后使用 dmesg 命令查看输出,看到会让用mknod命令来生成设备

mknod /dev/hello c 248 0
执行命令后会生成 字符设备/dev/hello ,这样我们便可以使用cat命令来显示设备的内容了:

Linux 内核模块编程的第一个字符设备驱动

因为每次调用cat 打开设备时在函数 device_open(...)中都会增加一个计数器,所以会看到上述的输出,而当要向设备中写入内容时,因为没有实现写函数,只是简单的输出提示信息,当然这也要用dmesg才能看的到

Linux 内核模块编程的第一个字符设备驱动

dmesg的输出:

Linux 内核模块编程的第一个字符设备驱动

4. 结束时,不要忘记删除设备和模块