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

本文分享了在学习Linux内核模块编程过程中遇到的问题及解决方案,重点介绍了字符设备驱动的编写经验,包括处理函数unregister_chrdev的返回值变化、替换已废弃的put_usr函数等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习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. 结束时,不要忘记删除设备和模块


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值