您的位置:首页 > 运维架构 > Linux

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

2013-06-24 19:28 399 查看
最近学习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. 结束时,不要忘记删除设备和模块
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐