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 测试程序源代码

Linux模块化增加设备驱动程序相关推荐

  1. Linux下PCI设备驱动程序开发[转]

    PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...

  2. 嵌入式linux系统中设备驱动程序

    嵌入式linux系统中设备驱动程序是内核的一部分,完成对设备初始.读写操作和控制等功能.驱动程序隐藏了 硬件设备的具体细节,对不同的设备提供一致的接口,这些接口通过file_Operation结构来定 ...

  3. [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序...

    如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...

  4. Linux下PCI设备驱动程序开发 --- PCI驱动程序实现(三)

    <script type="text/javascript"> </script><script type="text/javascript ...

  5. 自己编写linux系统,自己动手 编写Linux系统的设备驱动程序

    二 实例剖析 我们来写一个最简单的字符设备驱动程序.虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备驱动程序.不过我的kerne ...

  6. 嵌入式Linux中I2C设备驱动程序的研究与实现

    I2C是"Inter Integrated Circuit Bus"的缩写,中文译成"内部集成电路总线", 它是Philips 公司于20 世纪80 年代研发成 ...

  7. 深入理解 Linux 内核---块设备驱动程序

    块设备的处理 一个进程在某个磁盘文件上发出一个 read() 系统调用,内核对进程请求回应的一般步骤: read() 调用一个适当的 VFS 函数,将文件描述符和文件内的偏移量传递给它. 虚拟文件系统 ...

  8. linux内核与设备驱动,第二章 Linux内核与设备驱动程序

    2.1 Linux操作系统 Linux操作系统由系统的启动.进程调度.虚拟内存管理器.文件系统.设备驱动程序等多个组成 2.2Linux内核 设备驱动程序中使用的函数也用在内核上,并且影响着内核,因此 ...

  9. 如何在Linux上安装设备驱动程序

    从熟悉的Windows或MacOS系统切换到Linux的人们面临的最艰巨的挑战之一是安装和配置驱动程序. 这是可以理解的,因为Windows和MacOS具有使该过程易于使用的机制. 例如,当您插入新的 ...

  10. 嵌入式linux查看usb设备驱动程序,嵌入式Linux下USB驱动程序的设计

    嵌入式Linux下USB驱动程序的设计 usb概念:  USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不 ...

最新文章

  1. H3C PPP基本概念
  2. Android SDK Manager 更新慢解决办法
  3. Java:ChronicleMap第3部分,快速微服务
  4. win8安装python3后不能编程_Win8.1 64位系统,python3.4 肿么安装gevent成功后不能用
  5. 流量隔离方案 Dpath 护航双十一新零售
  6. 如何正确使用 FLEX-BOX
  7. mysqldump 导出中文乱码
  8. ** 安装好的Apache服务器不能在本地计算机启动
  9. 程序员最喜欢什么样的项目经理?
  10. linux安装tftp服务器
  11. 专业wifi测试软件,专业的WiFi检测工具有哪些?
  12. CryptoJS加密库使用及bug解决
  13. 免费的易语言网络验证系统
  14. 论“搜狗”输入法对用户的影响
  15. Python+selenium实现医院自动挂号
  16. 构建一个代号为1的聊天应用程序4
  17. ETL对文件数据进行处理,进入到数据仓库
  18. 集装箱编号校验码规则及java程序的实现
  19. 0640与6130的区别_达人评测熊猫6143收音机与6130有区别没有?使用哪个好?使用四周后体验分享...
  20. 一键绕过App签名验证

热门文章

  1. 视频剪辑好帮手——pr软件学习(一)
  2. 格雷码和二进制的转换及典型例题(4bits格雷码计数器)
  3. Java拼接sql,并组装成建表语句
  4. 第三方短信验证码服务
  5. 信息系统项目管理师(2022年) —— 第 11 章 项目风险管理
  6. IPD在华为成功的6个原因
  7. android动画送礼物,【Android】直播App礼物弹窗及连送礼物动画
  8. oracle12能卸干净吗,Oracle卸载干净方法
  9. android高德地图热力图,2D 热力图-热力 HeatmapLayer-示例中心-Loca API 示例 | 高德地图API...
  10. 博客程序PHP,10个开源的PHP blog 博客程序推荐