当前位置: 首页 > news >正文

驱动程序原理

驱动程序原理

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驱动程序工作原理

相关文章:

  • Xeon 5000系列说起
  • iOS-----About Asset Catalog
  • SQL2008使用CTE递归查询批量插入500万数据
  • 在 Windows 上使用 Visual Studio 编译 CURL
  • Android生成表对应的类与访问表对应的类
  • React中的“虫洞”——Context
  • 第二天(tomcat与web程序结构与Http协议与HttpUrlConnection)
  • Mac 自定义Terminial
  • C学习笔记(七)C控制语句:分支和跳转
  • 文档对象模型-DOM(一)
  • 盛一平自我介绍
  • 《Java高级程序设计》第二次作业
  • 在PHP中常遇到的变量处理函数库(isset()、unset()、empty、is_array...
  • Asp.Net中级 - 5.HttpHandler案例
  • Bootstrap学习笔记(一)-----表单
  • C++类的相互关联
  • JAVA 学习IO流
  • Java比较器对数组,集合排序
  • Java精华积累:初学者都应该搞懂的问题
  • JSONP原理
  • JS笔记四:作用域、变量(函数)提升
  • k8s 面向应用开发者的基础命令
  • Making An Indicator With Pure CSS
  • mysql外键的使用
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Travix是如何部署应用程序到Kubernetes上的
  • Twitter赢在开放,三年创造奇迹
  • 欢迎参加第二届中国游戏开发者大会
  • 看域名解析域名安全对SEO的影响
  • 用 Swift 编写面向协议的视图
  • 找一份好的前端工作,起点很重要
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (2020)Java后端开发----(面试题和笔试题)
  • (AngularJS)Angular 控制器之间通信初探
  • (k8s中)docker netty OOM问题记录
  • (pojstep1.1.2)2654(直叙式模拟)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)构建dubbo分布式平台-平台功能导图
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (力扣题库)跳跃游戏II(c++)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四)c52学习之旅-流水LED灯
  • (转)甲方乙方——赵民谈找工作
  • (轉貼) UML中文FAQ (OO) (UML)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net Web窗口页属性
  • .NET 使用 XPath 来读写 XML 文件
  • .Net中ListT 泛型转成DataTable、DataSet
  • ::before和::after 常见的用法
  • [AIGC] Kong:一个强大的 API 网关和服务平台