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

news/2025/10/10 18:58:18/文章来源:https://www.cnblogs.com/thammer/p/19133456

设备驱动分类

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.mzph.cn/news/934342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:手机可视化方案(针对浓度识别)

完整教程:手机可视化方案(针对浓度识别)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

AI元人文系列文章:决策范式与无为而治

AI元人文系列文章:决策范式与无为而治 引言:当算力遇见道法 在人工智能呼啸而来的今天,我们正忙于追问“AI能做什么?”——它能以超越人类的速度解题、生成、预测。然而,一个更具颠覆性的问题悄然浮现:当AI无所不…

用批处理材料实现Excel和word文件的重造

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android Activity 生命周期深度解析:从原理到实战,面试考点全覆盖 - 指南

Android Activity 生命周期深度解析:从原理到实战,面试考点全覆盖 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

SAP导入证书

SAP导入或更新某个网站的证书 - 鲸与海 - 博客园

洛谷《深入浅出程序设计竞赛(基础篇)》题解

洛谷《深入浅出程序设计竞赛(基础篇)》题解相关链接:洛谷《能力全面提升综合题单》选解 《深入浅出程序设计竞赛(基础篇)》题解 刷题网址:题单列表 - 洛谷 顺序结构 刷题网址:【入门1】顺序结构 - 题单 - 洛谷 …

实用指南:Linux编译SRS并测试RTMP流

实用指南:Linux编译SRS并测试RTMP流2025-10-10 18:49 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

华为链路聚合配置

实验7 以太网接口和链路配置 实验目标:掌握接口速率和双工模式的配置方法掌握使用手动模式配置链路聚合的方法掌握使用静态LACP模式配置链路聚合的方法掌握在静态LACP模式下配置接口优先级的方法实验拓扑: 为了提高…

iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略 - 详解

iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略 - 详解2025-10-10 18:37 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto …

HTML应用指南:利用POST请求获取全国索尼体验型零售店位置信息 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

手机adb 调试自己

打开无线调试模式 会看到 IP 地址和端口 : 192.168.AAAA 使用配对码配对设备: 打开有WLAN配对码:xxx ,IP 地址和端口:xxx 在命令行里 #connect 第一个IP 地址和端口 建立信任关系 adb connect 192.168.AAA#connect第二…

离线安装 mysql

离线安装 mysql 一、ubunt arm下载安装包官网地址 下载压缩包上传压缩包 # 将本地压缩包上传至服务器$ scp mysql-8.4.6-linux-glibc2.28-aarch64.tar.xz root@host:/root/mysql/解压# 转到压缩包目录 $ cd /root/mysq…

2025 年公共/商场/学校/地铁/电影院/会所/机场/卫生间隔断厂家选购指南:优质厂商推荐与实用选择策略

随着商业综合体、交通枢纽、文教医疗场所等公共空间的持续建设,卫生间隔断作为提升空间利用率与使用体验的关键设施,市场需求正稳步增长。但当前市场上产品质量参差不齐,从材质耐用性到安装规范性,从场景适配度到售…

为什么不该用 Double 表示金额及解决方案

众所周知,double 和 float 这些浮点数其实是不精确的。比如 0.1 + 0.2 并不等于 0.3,而是等于 0.30000000000000004——这也一度成为程序员圈子里的经典梗。所以用浮点数表示金额这种需要精确计算的数值,是会出现精度丢…

实用指南:WXML 编译错误修复总结

实用指南:WXML 编译错误修复总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

Windows开发环境安装备忘录

前言 程序员重装系统是常有的事,特别是有了 Ventoy 这种神器之后,重装系统不要太轻松,安装应用软件倒成了费时的事。 不像几大Linux系列,Windows下软件包管理工具还不是绝对主流,主要有Winget、Chocolatey和Scoop…

Vue.use(Vuex)

Vue.use(Vuex)是 Vue 应用的运行时插件注册(而非浏览器安装包),它的核心作用是:代码层注册 调用 Vuex 的 install方法,将 Vuex 的功能(如 $store)注入到 Vue 的原型链和全局生命周期中,使所有组件能访问 Vuex。…

[Gym-100343E]Convex Permutominoes 题解

艾希是对的观察一下:\(n\times n\) 的网格肯定每行每列都被填上了。 如果只保留横线,可以还原出竖线 只保留横线的话,因为是一个封闭图形,所以会有上半部分和下半部分,分别覆盖了上边界和下边界。 为了保证是凸的…

MyBatis 中的动态 SQL 的相关使用方法(Javaee/MyBatis) - 教程

MyBatis 中的动态 SQL 的相关使用方法(Javaee/MyBatis) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

网络优化问题

一、基本概念 【发点和收点】设点 v 是有向图 D (带箭头)的一个顶点: 1、发点:如果不存在以v为终点的弧,则称v是D的一个发点(源),通常称为vs; 2、收点:如果不存在以v为始点的弧,则称v是D的一个收点(汇),通…