IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux模块化增加设备驱动程序 -> 正文阅读

[系统运维]Linux模块化增加设备驱动程序

Linux模块化增加设备驱动程序

目录

目的

  1. 采用模块方法,添加一个新的字符设备驱动程序,实现打开/关闭、读/写等基本操作
  2. 编写一个应用程序,测试添加的驱动程序

开发环境

  • 操作系统: ubuntu 16.04LTS 64位
  • 内核版本:linux-4.14.141
  • 内存:8G
  • 处理器: IntelR CoreTM i5-6200U CPU@ 2.30GHz×4
  • 编辑器: Vim
  • 编译器: gcc version 5.4.0 20160609

实验步骤

  1. 编写设备驱动程序源文件mydev.c
  2. 编写Makefile文件,用于执行编译任务
  3. 将设备驱动程序源文件和Makefile文件拷贝到/usr/src/linux-4.14.141/drivers/misc/mydev目录下,在该目录打开终端
  4. 执行make命令,利用Makefile文件进行设备驱动模块编译,编译成功后生成mydev.ko文件
  5. 执行insmod mydev.ko,加载设备驱动模块
  6. 通过lsmod命令查看模块是否加载成功,通过cat /proc/devices命令查看新增设备名mydev和主设备号241
  7. 进入/dev目录,执行命令mknod /dev/mydev c 241 0,生成设备文件,其中,mydev为设备文件名,241为主设备号,0为从设备号,c表示字符设备,执行成功后在/dev目录中会生成一个新设备文件
  8. 编译测试程序,执行并进行测试

关键代码

打开设备

  1. 通过 MAJORMINOR返回主次设备号:

    printk("mydev: Main device number is %d  \n Slave device number is %d\n", MAJOR(inode->i_rdev), MINOR(inode->i_rdev));
    
  2. 使用静态变量保存打开设备的进程数:

    static int open_process = 0;
    
  3. 当设备未被占用,占有设备,当设备被占用,进程挂起:

 // 未被占用
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");

调试记录

  1. 使用Makefile文件编译设备驱动模块

编译设备驱动模块

  1. 执行insmod mydev.ko加载设备驱动模块

加载设备驱动模块

  1. 通过cat /proc/devices命令查看新增设备名mydev主设备号

查看设备驱动模块设备号

  1. 执行命令mknod /dev/mydev c 241 0,生成设备文件,查看设备文件

生成设备文件

  1. 编译测试程序,执行并进行测试

编译运行测试程序

测试代码目录说明

开源地址OS_Kernel/compile_kernel&add_syscall

modularly_add_device_drivers 模块化添加驱动设备源文件目录

Linux模块化增加设备驱动程序.md

help.txt Makefile与make命令参考

Makefile make编译脚本

mydev.c 驱动程序源文件

test 测试程序

test.c 测试程序源代码

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:45:38  更:2022-05-11 16:47:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:45:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码