当前位置: 首页 > news >正文

04-最简单的字符设备驱动

设备驱动分类

linux设备驱动一般分为3类,字符设备,块设备,网络设备。前两个在/dev目录下有对应的设备节点,网络设备比较特殊,没有。通过ls -l /dev/xx可以看出设备类型:

thammer@test:~$ ls -l /dev/nvme0n1
brw-rw---- 1 root disk 259, 0 10月  9 08:59 /dev/nvme0n1
thammer@test:~$ ls -l /dev/tty
crw-rw-rw- 1 root tty 5, 0 10月 10 15:25 /dev/tty

b开头的表示块设备(block),以c开头的表示字符设备(character)。块设备一般是指硬盘(HDD),固态硬盘(SSD),移动存储介质如SD卡,TF卡,U盘等,其他拥有设备节点的驱动基本都属于字符设备。暂时仅关注字符设备驱动。

极简字符设备驱动

#include <linux/module.h>
#include <linux/fs.h>// 主设备号
static int major;
static char devName[] = "mychardev";// 对应应用空间的open系统调用
static int chardev_open(struct inode *inode, struct file *file)
{printk(KERN_INFO "chardev open\n");return 0;
}// 对应应用空间的close系统调用
static int chardev_release(struct inode *inode, struct file *file)
{printk(KERN_INFO "chardev release\n");return 0;
}// 字符设备驱动对应的文件操作结构
static struct file_operations fOpts = {.owner = THIS_MODULE,.open = chardev_open,.release = chardev_release
};//加载内核模块后的入口函数
static int __init chardev_drv_init(void)
{printk(KERN_INFO "chardev driver init\n");//向内核注册字符设备驱动major = register_chrdev(0, devName, &fOpts);if (major < 0){printk(KERN_ERR "chardev driver regist\n");return major;}printk(KERN_INFO "got major:%d\n", major);return 0;
}//卸载内核模块后的清理函数
static void __exit chardev_drv_exit(void)
{//向内核注销字符设备驱动unregister_chrdev(major, devName);printk(KERN_INFO "chardev driver exit\n");
}module_init(chardev_drv_init);
module_exit(chardev_drv_exit);MODULE_LICENSE("GPL");

编译该字符设备驱动的Makfile:

KERN_DIR=/usr/src/linux-headers-$(shell uname -r)all:make -C ${KERN_DIR} M=$(shell pwd) modulesclean:make -C ${KERN_DIR} M=$(shell pwd) modules cleanobj-m += chardev_drv.o

编译后,插入驱动模块

make
sudo insmod chardev_drv.ko

通过dmesg可以看到内核日志输出:

[ 5476.132713] chardev driver init
[ 5476.132717] got major:237

到此应用程序如果要操作这个驱动,还缺乏对应的设备节点。这里需要我们手动创建设备节点:

sudo mknod /dev/testchardev c $(cat /proc/devices | grep mychardev | awk '{print $1}') 0

mknode命令用于手动创建设备节点,其命令创建设备节点的格式为:

mknod [选项]... 节点路径 类型 [主设备号 次设备号]
  • 选项:一般可以通过-m指定创建的设备节点的文件权限。也可以在创建后通过chmod修改。
  • 节点路径:习惯位于/dev下面或者其子目录,但是这仅仅是一个习惯而已,实际如果你想要,可以是任意位置。
  • 类型:就是c,b等,还可以是比较少见的p或者up表示管道,uc等价。
  • 主,次设备号:当类型为p时不能指定主,次设备号,其他类型时,必须指定。
http://www.hskmm.com/?act=detail&tid=28191

相关文章:

  • 完整教程:手机可视化方案(针对浓度识别)
  • AI元人文系列文章:决策范式与无为而治
  • SAP导入证书
  • Kubernetes存储卷:保障有状态应用的数据持久化
  • MySQL的查询操作语法要点
  • 华为链路聚合配置
  • 手机adb 调试自己
  • 离线安装 mysql
  • what is a good parent
  • 2025 年公共/商场/学校/地铁/电影院/会所/机场/卫生间隔断厂家选购指南:优质厂商推荐与实用选择策略
  • 为什么不该用 Double 表示金额及解决方案
  • Windows开发环境安装备忘录
  • Vue.use(Vuex)
  • [Gym-100343E]Convex Permutominoes 题解
  • MyBatis 中的动态 SQL 的相关使用方法(Javaee/MyBatis) - 教程
  • 网络优化问题
  • Java环境安装备忘录
  • 深入解析:【Spring MVC终极指南】一文掌握请求处理与响应!从Servlet原生方式到SpringMVC高效优雅写法
  • foobar2000 v2.25.2 汉化版
  • 比特币地址投毒攻击深度剖析
  • 为什么大家都爱用微擎?这几点真的太香了
  • 【JS逆向百例】某坤行 1101,雪球 1038,新 acw_sc__v2 逆向分析
  • JAVA 的模板方法模式解析
  • 《构建之法-现代软件工程》 -阅读和提问作业1
  • 计算机视觉与AI在人体成分分析中的技术突破
  • 2024-网鼎杯web-PyBlockly
  • 关于微信小程序申请地理位置接口申请
  • c++学习总结
  • 2025 年大闸蟹蟹卡 / 大闸蟹礼盒 / 大闸蟹礼券 / 好蟹汇大闸蟹选择指南:生态养殖与全国服务双保障解析
  • 分享一个超级耐玩的游戏 转载 植物大战僵尸融合版最新版(v3.0.1)支持安卓版+PC电脑版