驱动程序原理

本文探讨Linux驱动程序的基本原理,介绍驱动程序如何作为接口让应用程序操作设备,讲解Linux如何通过全局数组管理字符和块设备驱动,并阐述设备节点的产生过程以及应用程序如何通过系统调用访问设备驱动。

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

驱动程序原理

Linux驱动程序的数据结构

驱动程序本质:接口函数(应用程序可以操作设备)

  • Linux提供了统一的接口,各个设备厂商实现这个接口

  • Linux如何管理所有的驱动程序呢

  • 块设备和字符设备

  • 内核中使用了2个全局数组存放2类驱动程序

#define MAX_CHRDEV      255
#define MAX_BLKDEV      255

struct device_struct {
     const char * name;
     struct file_operations * fops;
};

static struct device_struct chrdevs[MAX_CHRDEV];

static struct {
     const char *name;
     struct block_device_operations *bdops;
} blkdevs[MAX_BLKDEV];

驱动程序调用
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops) 把厂商的接口函数fops存放到chrdevs这个数组中

  • 还记得我们查看设备管理的时候看到的主设备号吗,就是数组index

设备节点如何产生

  • Linux下设备也是文件,只是它们的文件属性特殊而已,应用程序通过文件名来访问设备的驱动程序。

  • 这些文件我们专业点,那就是设备节点。/dev目录下

  • 创建一个设备节点,一个name为mtd4的字符设备节点

mknod /dev/ mtd4 c MTD_CHAR_MAJOR 4

我们创建了一个普通的磁盘文件,没有数据,大小为0,只有文件属性,包括设备类型、主设备号、次设备号
设备节点本质上就是没有内容的文件,只有文件属性,不信你可以vim sda看看,所有文件都是空的

应用程序是如何访问设备驱动的?

例子:向nor flash的第四分区的起始位置偏移512字节写入100字节的数据

  fd = open(“/dev/mtd4”, O_RDWR);
  lseek (fd,512, SEEK_SET);
  write (fd , write_buffer, 100);
  close(fd);
  • 应用程序调用Open函数,这是个系统调用函数,程序会进入内核空间调用sys_open函数

  • 在sys_open,首先会根据文件路径“/dev/mtd4”找到这个文件节点,这部分工作是属于VFS(虚拟文件系统)的

  • /dev/mtd4的文件属性是字符设备,于是sys_open会调用函数chrdev_open()

在这个函数里有一句话:
filp->f_op = get_chrfops(MAJOR(inode->i_rdev), MINOR(inode->i_rdev));

  • get_chrfops()里面返回 chrdevs[major].fops

  • Write()最终一定会调用到chrdevs[major].fops->write();

  • Read()最终一定会调用到chrdevs[major].fops->read();

  • 各种驱动程序比较特殊的功能函数都可以通过ioctl()来得到调用。

  • 而次设备号也会作为参数传递给你。

参考自Linux驱动程序工作原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值