Linux模块化增加设备驱动程序
Linux模块化增加设备驱动程序
目录
文章目录
- Linux模块化增加设备驱动程序
- 目录
- 目的
- 开发环境
- 实验步骤
- 关键代码
- 打开设备
- 释放设备,解除占用
- 读取设备缓冲区内容到终端
- 输入字符串,从终端读取,写入设备缓冲区
- 注册字符设备
- 注销字符设备
- 添加模块宏定义和许可协议
- 调试记录
- 测试代码目录说明
目的
- 采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭、读/写等基本操作
- 编写一个应用程序,测试添加的驱动程序
开发环境
- 操作系统: ubuntu 16.04LTS 64位
- 内核版本:linux-4.14.141
- 内存:8G
- 处理器: IntelR CoreTM i5-6200U CPU@ 2.30GHz×4
- 编辑器: Vim
- 编译器: gcc version 5.4.0 20160609
实验步骤
- 编写设备驱动程序源文件
mydev.c
- 编写
Makefile
文件,用于执行编译任务 - 将设备驱动程序源文件和Makefile文件拷贝到
/usr/src/linux-4.14.141/drivers/misc/mydev
目录下,在该目录打开终端 - 执行
make
命令,利用Makefile文件进行设备驱动模块编译,编译成功后生成mydev.ko
文件 - 执行
insmod mydev.ko
,加载设备驱动模块 - 通过
lsmod
命令查看模块是否加载成功,通过cat /proc/devices
命令查看新增设备名mydev和主设备号241 - 进入
/dev
目录,执行命令mknod /dev/mydev c 241 0
,生成设备文件,其中,mydev为设备文件名,241为主设备号,0为从设备号,c表示字符设备,执行成功后在/dev目录中会生成一个新设备文件 - 编译测试程序,执行并进行测试
关键代码
打开设备
通过
MAJOR
和MINOR
返回主次设备号:printk("mydev: Main device number is %d \n Slave device number is %d\n", MAJOR(inode->i_rdev), MINOR(inode->i_rdev));
使用静态变量保存打开设备的进程数:
static int open_process = 0;
当设备未被占用,占有设备,当设备被占用,进程挂起:
// 未被占用
if (open_process == 0) {open_process++; //标志占用try_module_get(THIS_MODULE);return 0;
} else {// 被占用printk(KERN_ALERT "Another process open the char device.\n"); //进程挂起return -1;
}
释放设备,解除占用
--open_process; //占用解除
module_put(THIS_MODULE);
读取设备缓冲区内容到终端
从内核拷贝数据到用户空间,调用内核函数copy_to_user
copy_to_user(buf, buffer, sizeof(buffer);
输入字符串,从终端读取,写入设备缓冲区
数据从用户空间拷贝到内核,调用内核函数copy_from_user
copy_from_user(buffer, buf, sizeof(buffer);
注册字符设备
result = register_chrdev(DEVICE_NUM, "mydev", &mydev_fops);
注销字符设备
unregister_chrdev(device_num, "mydev");
添加模块宏定义和许可协议
//模块宏定义
module_init(mydev_init);
module_exit(mydev_exit);
// 模块许可协议
MODULE_LICENSE("GPL");
调试记录
- 使用
Makefile文件
编译设备驱动模块
- 执行
insmod mydev.ko
,加载设备驱动模块
- 通过
cat /proc/devices
命令查看新增设备名mydev和主设备号
- 执行命令
mknod /dev/mydev c 241 0
,生成设备文件,查看设备文件
- 编译测试程序,执行并进行测试
测试代码目录说明
开源地址:OS_Kernel/compile_kernel&add_syscall
modularly_add_device_drivers 模块化添加驱动设备源文件目录
Linux模块化增加设备驱动程序.md
help.txt Makefile与make命令参考
Makefile make编译脚本
mydev.c 驱动程序源文件
test 测试程序
test.c 测试程序源代码
Linux模块化增加设备驱动程序相关推荐
- Linux下PCI设备驱动程序开发[转]
PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...
- 嵌入式linux系统中设备驱动程序
嵌入式linux系统中设备驱动程序是内核的一部分,完成对设备初始.读写操作和控制等功能.驱动程序隐藏了 硬件设备的具体细节,对不同的设备提供一致的接口,这些接口通过file_Operation结构来定 ...
- [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序...
如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...
- Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)
<script type="text/javascript"> </script><script type="text/javascript ...
- 自己编写linux系统,自己动手 编写Linux系统的设备驱动程序
二 实例剖析 我们来写一个最简单的字符设备驱动程序.虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备驱动程序.不过我的kerne ...
- 嵌入式Linux中I2C设备驱动程序的研究与实现
I2C是"Inter Integrated Circuit Bus"的缩写,中文译成"内部集成电路总线", 它是Philips 公司于20 世纪80 年代研发成 ...
- 深入理解 Linux 内核---块设备驱动程序
块设备的处理 一个进程在某个磁盘文件上发出一个 read() 系统调用,内核对进程请求回应的一般步骤: read() 调用一个适当的 VFS 函数,将文件描述符和文件内的偏移量传递给它. 虚拟文件系统 ...
- linux内核与设备驱动,第二章 Linux内核与设备驱动程序
2.1 Linux操作系统 Linux操作系统由系统的启动.进程调度.虚拟内存管理器.文件系统.设备驱动程序等多个组成 2.2Linux内核 设备驱动程序中使用的函数也用在内核上,并且影响着内核,因此 ...
- 如何在Linux上安装设备驱动程序
从熟悉的Windows或MacOS系统切换到Linux的人们面临的最艰巨的挑战之一是安装和配置驱动程序. 这是可以理解的,因为Windows和MacOS具有使该过程易于使用的机制. 例如,当您插入新的 ...
- 嵌入式linux查看usb设备驱动程序,嵌入式Linux下USB驱动程序的设计
嵌入式Linux下USB驱动程序的设计 usb概念: USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不 ...
最新文章
- H3C PPP基本概念
- Android SDK Manager 更新慢解决办法
- Java:ChronicleMap第3部分,快速微服务
- win8安装python3后不能编程_Win8.1 64位系统,python3.4 肿么安装gevent成功后不能用
- 流量隔离方案 Dpath 护航双十一新零售
- 如何正确使用 FLEX-BOX
- mysqldump 导出中文乱码
- ** 安装好的Apache服务器不能在本地计算机启动
- 程序员最喜欢什么样的项目经理?
- linux安装tftp服务器
- 专业wifi测试软件,专业的WiFi检测工具有哪些?
- CryptoJS加密库使用及bug解决
- 免费的易语言网络验证系统
- 论“搜狗”输入法对用户的影响
- Python+selenium实现医院自动挂号
- 构建一个代号为1的聊天应用程序4
- ETL对文件数据进行处理,进入到数据仓库
- 集装箱编号校验码规则及java程序的实现
- 0640与6130的区别_达人评测熊猫6143收音机与6130有区别没有?使用哪个好?使用四周后体验分享...
- 一键绕过App签名验证
热门文章
- 视频剪辑好帮手——pr软件学习(一)
- 格雷码和二进制的转换及典型例题(4bits格雷码计数器)
- Java拼接sql,并组装成建表语句
- 第三方短信验证码服务
- 信息系统项目管理师(2022年) —— 第 11 章 项目风险管理
- IPD在华为成功的6个原因
- android动画送礼物,【Android】直播App礼物弹窗及连送礼物动画
- oracle12能卸干净吗,Oracle卸载干净方法
- android高德地图热力图,2D 热力图-热力 HeatmapLayer-示例中心-Loca API 示例 | 高德地图API...
- 博客程序PHP,10个开源的PHP blog 博客程序推荐