最近学习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命令来显示设备的内容了:
因为每次调用cat 打开设备时在函数 device_open(...)中都会增加一个计数器,所以会看到上述的输出,而当要向设备中写入内容时,因为没有实现写函数,只是简单的输出提示信息,当然这也要用dmesg才能看的到
dmesg的输出:
4. 结束时,不要忘记删除设备和模块