所有计算机都有一条总线, 用来连接大部分内部硬件设备. CPU和IO设备之间的数据通路成为IO总线, 80x86使用16位的地址总线对IO设备进行寻址, 使用8位,16位或者32位的数据总线传输数据. 每个IO设备以此连接到IO总线上, 这种连接使用了包含三个元素的硬件组织层次: IO端口, 接口和设备控制器.

IO端口

每个连接到IO总线上的设备都有自己的IO地址集, 通常成为IO端口.有四条专用的汇编语言指令允许CPU对IO端口读写, 它们是in,ins,out和outs, 利用这些指令, CPU使用地址总线选择所请求的IO端口, 使用数据总线在CPU寄存器和端口之间传送数据.

IO端口还可以直接映射到物理地址空间. 因此, CPU和IO设备之间的通信就可以使用对内存直接操作的汇编指令(如mov,and,or等). 现代的硬件设备倾向于选择映射IO, 因为速度更快, 并且可以结合DMA.

系统设计者的目的是对IO编程提供统一的方法, 但又不牺牲性能. 为此每个设备的IO端口都被组织使用专用寄存器. CPU将指令写到device control register, 从status register读取设备状态. CPU通过input register取得数据, 通过output register写入数据.

IO接口 (IO interface)

是处于一组IO端口和对应的设备控制器之间的一种硬件电路, 起翻译器的作用, 把IO端口中的值转换成设备所需要的命令和数据, 在相反方向, 它检测设备状态变化, 对起状态寄存器作用的IO端口进行相应更新. 还可以通过IRQ线把这种电路连接到可编程中断控制器上, 以使他代表相应的设备发出中断请求.

分专用IO接口(键盘接口, 图形接口, 磁盘接口, 线鼠接口, 网络接口)和通用IO接口(并口:可用连打印机,移动磁盘,扫描仪等; 串口:类似并口,但传输是逐位的; SCSI接口; 通用串行总线USB).

设备控制器

复杂的设备可能需要一个device controller来驱动, 控制器起两个重要作用:

- 解释从IO接口接收到的高级命令, 通过向设备发送适当的电信号序列强制设备执行特定的操作.

- 转换和适当地解释从设备接收到的电信号, 并修改(通过IO接口)状态寄存器的值.

典型的设备控制器是磁盘控制器, 它从CPU(通过IO接口)接收"写这个数据块"之类的高级指令, 转换为"把磁头定位到正确的轨道"和"把数据写入这个磁道"之类的低级磁盘操作.

设备驱动程序模型

Linux 2.6提供了一些数据结构和辅助函数, 它们为系统中所有的总线,设备以及设备驱动程序提供了一个统一的视图, 这个框架被成为设备驱动程序模型.

【sysfs】

sysfs文件系统的目标是展现设备驱动程序模型组件间的层次关系. 该文件系的高层目录:

- block: 块设备, 独立于所连接的总线.

- devices: 所有被内核识别的硬件设备, 依照连接它们的总线对其进行组织.

- bus: 系统中用于连接设备的总线.

- drivers: 内核中注册的设备驱动程序.

- class: 系统中设备的类型.

- power: 处理一些硬件设备电源状态的文件.

- firmware: 处理一些硬件设备的固件的文件.

【kobject, kset】

是设备驱动程序的核心数据结构, 每个kobject对应于sysfs文件系统中的一个目录.

kobject被嵌入一个叫做"容器"的更大对象中, 容器描述设备驱动程序模型中的组件, 容器的典型例子有总线, 设备以及驱动程序的描述符.

相关的kobject包含在同类型的容器中, 通过kset数据结构表示. kset集合组成subsystem, 一个subsystem可以包含不同类型的kset.

如果想让kobject,kset或subsystem出现在sysfs子树中, 就必需先注册它们. 详情略.

【设备驱动程序模型的组件】

每个设备由一个device对象描述, 每个驱动程序由device_driver对象描述, 内核支持的每一种总线类型都由一个bus_type对象描述, 每个类由class对象描述.

设备文件

分为两种: 块设备文件和字符设备文件. block dev可以被随机访问, char dev数据不可被随机访问.

设备标识符由类型(b,c)和一对参数组成, 第一个参数是主设备号(0major number, 它标识设备的类型, 通常具有相同主设备号和类型的所有设备文件共享相同的文件操作集合, 因为它们是由同一个设备驱动程序处理的. 第二个参数是次设备号(minor number), 它标识了主设备号相同的设备组中的一个特定设备, 例如, 由相同的磁盘控制器管理的一组磁盘具有相同的主设备号和不同的次设备号.

mknod()用来创建设备文件, 设备文件通常位于/dev中. Documentation/devices.txt中存放了官方注册的已分配设备号和/dev目录节点.

Linux 2.6开始, 主设备号的编码为12位, 次设备号为20位. 对分配设备号和创建设备文件来说, 如今喜欢动态分配多过静态分配.

【动态分配设备号】

驱动程序再注册阶段可以只指定设备号的分配范围, 无需指定精确的值, 因此, 新的硬件设备驱动程序不再需要从官方注册表中申请一个设备号, 而是可以仅仅使用当前系统中空闲的设备号. 但这样就不能永久的创建设备文件, 不过Linux 2.6内核支持动态创建设备文件, 通过系统中的udev工具集, 在系统启动时, udev程序通过扫描/sys/class子目录来寻找dev文件. 更多细节略.

网卡是不直接与设备文件对应的硬件设备.

【设备文件的VFS处理】

访问普通文件, 是通过FS访问磁盘分区中的数据块; 而访问设备文件时, 只需要驱动硬件设备就可以了. VFS需要区分这二者的区别.

linux io体系结构,Linux IO体系结构相关推荐

  1. Linux驱动程序开发 - 设备IO

    序言: 前面我们提到,设备驱动程序的主要功能操作设备,更准确的说就是如何操作设备寄存器或设备内存.不同的计算机体系结构提供了不同的设备操作接口,主要就是IO端口映射(Ports)或IO内存映射(Mem ...

  2. linux wc -l 对io,linux设备驱动归纳总结(五):2.操作硬件——IO内存

    linux设备驱动归纳总结(五):2.操作硬件--IO内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  3. 【linux开发】IO端口和IO内存的区别及分别使用的函数接口

    IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把 ...

  4. 操作系统与存储:解析Linux内核全新异步IO引擎io_uring设计与实现

    作者:draculaqian,腾讯后台开发工程师 引言 存储场景中,我们对性能的要求非常高.在存储引擎底层的IO技术选型时,可能会有如下讨论关于IO的讨论. http://davmac.org/dav ...

  5. Linux系统IO端口,Linux系统对IO端口和IO内存的管理

    五.Linux下访问IO端口 对于某一既定的系统,它要么是独立编址.要么是统一编址,具体采用哪一种则取决于CPU的体系结构. 如,PowerPC.m68k等采用统一编址,而X86等则采用独立编址,存在 ...

  6. Linux内存管理:ARM64体系结构与编程之cache(3):cache一致性协议(MESI、MOESI)、cache伪共享

    目录 为什么系统软件人员要深入了解cache? cache一致性协议 神马是MESI协议? MESI的操作 MESI状态图 演示:初始化状态为I的cache line 当本地CPU的缓存行状态为I时, ...

  7. Linux内存管理:ARM64体系结构与编程之cache(2):cache一致性

    <Linux内存管理:ARM64体系结构与编程之cache(1)> <Linux内存管理:ARM64体系结构与编程之cache(2)> <ARM SMMU原理与IOMMU ...

  8. Linux系统进阶-基础IO

    Linux系统进阶-基础IO 文章目录 Linux系统进阶-基础IO C语言中的文件接口 对文件进行写入 对文件进行读取 什么是当前路径 默认打开的三个流 stdout & stderr 系统 ...

  9. 【Linux练习生】高级IO

    本文收录于专栏:Linux 关注作者,持续阅读作者的文章,学习更多知识! https://blog.csdn.net/weixin_53306029?spm=1001.2014.3001.5343 高 ...

  10. cacti监控linux和windows磁盘IO

    cacti监控linux和windows磁盘IO 标签:cacti linux磁盘IO windows磁盘IO 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则 ...

最新文章

  1. Spark Catalyst
  2. 微信小应用,又一大神,音乐播放器
  3. 跨链(5)“蚂蚁区块链”之跨链系统框架
  4. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)
  5. [Unity3d]旋转拖动物体
  6. 汽车电子专业知识篇(九)-charge pump的原理介绍
  7. 鲜活数据数据可视化指南_数据可视化实用指南
  8. cad小插件文字刷_小懒人CAD插件管理工具
  9. 函数式编程 -- 函数是一等公民、高阶函数、闭包
  10. Apache Bench
  11. sscanf 与 sscanf_s的区别
  12. PostgreSQl中 index scan 代价的进一步学习
  13. 黑客技术之初学者编程入门
  14. 安装软件提示计算机管理员权限,win10安装软件需要管理员权限的处理办法|win10装软件提示error launching installer如何处理?...
  15. WebRtc与P2P
  16. 关于分布函数连续性的运用
  17. 开源智能手表TTGO-WATCH上手把玩(0)环境配置
  18. 大数据分析师工资待遇
  19. 表达式的LenB(123程序设计ABC)的值是27吗
  20. 来表达我说过如果有那么一天

热门文章

  1. Python assert 断言函数
  2. Python类的约束以及super()剖析
  3. python爬虫之selenium,谷歌无头浏览器
  4. Python常用模块之configparser
  5. 嵌入式c语言检测键盘,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇
  6. Linux socket 流模式(STREAM)跟数据报模式(DGRAM)的区别
  7. python PyQt5 QtCore.QPointF类、QPointF类与QPoint类区别
  8. python multiprocessing 进程间如何共享数据、对象
  9. python 计时器 timeit 报错:ValueError: stmt is neither a string nor callable
  10. python Intel Realsense D435 图像自动采集程序 自动剔除模糊图像