字符设备驱动


一个字符设备要能够工作,需要三部分配合:

  1. 有一个设备驱动程序的ko模块,包含中断处理函数、设备操作函数。模块初始化时,将设备号注册到内核的全局数据结构cdev_map中。
  2. /dev目录下有一个文件表示该设备,这个文件在特殊的devtmpfs文件系统上,有相应的dentry和inode。inode中有设备号,通过设备号可以在cdev_map中找到设备驱动程序。
  3. 用户可以打开一个字符设备文件,类似打开一个普通文件。字符设备文件的相关操作file_operations会指向设备驱动中的设备操作函数。

中断处理程序


外部设备发起的中断,叫做外部中断。外部中断,会到达中断控制器,中断控制器会发送中断向量给CPU。

每一个CPU,有一个idt_table,里面存放了不同的中断向量的处理函数。硬件终端的处理函数由do_IRQ统一处理,do_IRQ根据中断向量查找设备驱动程序中注册的中断处理函数。

块设备驱动

  1. 所有的块设备被一个map结构管理从dev_t到gendisk的映射

  2. /dev/xxx在devtmpfs文件系统上,存放有块设备号和dev_t。

  3. mount一个设备,就是把伪文件系统bdev中的block_device信息,放到具体文件系统的super_block中

  4. gendisk中存放有block_device_operations,可以进行块设备操作

    注意两个文件系统:devtmpfs和伪文件系统bdev。
    通过devtmpfs中的设备号dev_t在伪文件系统bdev中找到block_device。
    通过bdev中的block_device,找到主流文件系统的super_block中,接下来就可以
    通过主流文件系统(如ext4)的file_operations对块设备进行操作了。
    由于主流文件系统有很多,而且未来可能推出新的,写操作系统内核时不可能每次都针对新的文件系统进行更改,因此devtmpfs和伪文件系统只是为了获取和打开block_device,最终对block_device进行读写是交给主流文件系统的。

参考:
https://time.geekbang.org/column/article/101719

linux内核--设备驱动程序(学习笔记)相关推荐

  1. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  2. 【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

    目录 1.在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节) 1.1 mail.c 1.2 mpu6050.h 1.3 mpu6050.c 1.4 Makefile 2.以外称i ...

  3. 【嵌入式环境下linux内核及驱动学习笔记-(11-设备树)】

    目录 1.设备树体系 1.1 DTS /DTSI / DTC / DTB 2.基础语法 2.1 节点语法 2.1.1 通用名称建议 2.2 属性语法 2.2.1 属性值 2.3 关于label 2.4 ...

  4. 反编译linux内核 kmem,Volatility学习笔记一:使用手册

    0x00 概述 Volatility是一款开源内存取证框架,能够对导出的内存镜像进行分析,通过获取内核数据结构,使用插件获取内存的详细情况以及系统的运行状态. 特点: 开源:Python编写,易于和基 ...

  5. linux 网卡gso,linux内核网络协议栈学习笔记:关于GRO/GSO/LRO/TSO等patch的分析和测试...

    TSO,全称是TCP Segmentation Offload,我们知道通常以太网的MTU是1500,除去TCP/IP的包头,TCP的MSS (Max Segment Size)大小是1460,通常情 ...

  6. linux内核地址映射,Linux内核设备驱动地址映射笔记整理

    #include #define ioremap(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE)//cookie表示物理地址, size表示映射 ...

  7. linux 内核 ide,Linux设备驱动程序学习(7)-内核的数据类型

    Linux设备驱动程序学习(7)-内核的数据类型 由于前面的学习中有用到 第十一章 内核数据结构类型 的知识,所以我先看了.要点如下: 将linux 移植到新的体系结构时,开发者遇到的若干问题都与不正 ...

  8. linux设备驱动程序调试方法,Linux设备驱动程序学习(2)-调试技术

    Linux设备驱动程序学习(2)-调试技术 Linux设备驱动程序学习(2)-调试技术 今天进入<Linux设备驱动程序(第3版)>第四章调试技术的学习. 一.内核中的调试支持 在前面已经 ...

  9. linux lddbus设备,Linux设备驱动程序学习(14)-Linux设备模型(各环节的整合)

    Linux设备驱动程序学习(14) -Linux设备模型(各环节的整合) 通过一个设备在内核中生命周期的各个阶段,可以更好地理解Linux设备模型.我将通过分析lddbus和sculld的源码来了解L ...

最新文章

  1. 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程(精)
  2. 远程更新FPGA配置的热启动地址(WBSTAR)的格式?
  3. 修改 ShiroUser 缓存用户
  4. python中的cli模块_Python 快速实现CLI 应用程序的脚手架
  5. ogg 11.2 for mysql_配置ogg异构mysql-oracle 单向同步
  6. SpringMVC介绍之约定优于配置
  7. 数据结构殷人昆电子版百度云资源_数据结构精讲与习题详解
  8. plt文件怎么转化为txt文件
  9. 高并发下的秒杀系统设计
  10. 阿里靠什么武功秘籍渡过“双十一“的天量冲击
  11. java协同过滤算法的演唱会门票售票系统
  12. Python:正则表达式 flags 参数
  13. 利用feather快速处理大数据
  14. 笔者带你剖析三种常见的分布式路由算法
  15. Python将图片写到音频频谱
  16. execute、executeQuery、executeUpdate的用途及返回值
  17. 区块链的未来发展趋势
  18. vue项目获取下拉框选中id_vue获取下拉框值
  19. 程序员职业规划之技术的精进-安晓辉-专题视频课程
  20. linux 查看环境变量和修改环境变量

热门文章

  1. overleaf入门
  2. 魔兽世界总是显示无法连接服务器,心得:launcher更新无法连接服务器如何解决...
  3. amd黑苹果万能显卡驱动_22款显卡乱战《赛博朋克2077》:AMD 4K败走麦城-显卡,赛博朋克2077,AMD,NVIDIA ——快科技(驱动之家旗下媒体)-...
  4. html如何移动整体列表,移动端H5各种各样的列表的制作方法(一)
  5. java将图片写入pdf
  6. pandas 按照固定的列顺序排序,并补足缺失列
  7. 解决centos7 wget 报错nown. wget: unable to resolve host address ‘mirrors.aliyun.com’
  8. python读取与写入配置文件
  9. seaborn单变量/双变量/多变量绘图
  10. java读取与写入excel(.xls .xlsx)