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

本文详述了在Linux环境下,如何采用模块化方式添加一个新的字符设备驱动程序,包括驱动程序的编写、编译、加载、卸载以及测试。实验涉及关键代码如打开、释放设备、读写操作,并提供了相应的Makefile文件和测试程序。通过实验步骤,读者可以理解Linux内核模块和设备驱动的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值