当前位置: 首页 > 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学习笔记(一)-----表单
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 自己简单写的 事件订阅机制
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • gitlab-ci配置详解(一)
  • HashMap剖析之内部结构
  • Iterator 和 for...of 循环
  • Laravel Mix运行时关于es2015报错解决方案
  • Leetcode 27 Remove Element
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • PHP 小技巧
  • PHP变量
  • Python3爬取英雄联盟英雄皮肤大图
  • vue 个人积累(使用工具,组件)
  • 二维平面内的碰撞检测【一】
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信开源mars源码分析1—上层samples分析
  • - 转 Ext2.0 form使用实例
  • ​iOS实时查看App运行日志
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (+4)2.2UML建模图
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (原)本想说脏话,奈何已放下
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net快速开发框架源码分享
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Repository 注解
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C++]模板与STL简介
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [CF482B]Interesting Array
  • [hive小技巧]同一份数据多种处理