linux io体系结构,Linux IO体系结构

所有计算机都有一条总线, 用来连接大部分内部硬件设备. CPU和IO设备之间的数据通路成为IO总线,

80x86使用16位的地址总线对IO设备进行寻址, 使用8位,16位或者32位的数据总线传输数据. 每个IO设备以此连接到IO总线上,

这种连接使用了包含三个元素的硬件组织层次: IO端口, 接口和设备控制器.

uid-20184656-id-3493669.html

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写入数据.

uid-20184656-id-3493669.html

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.

uid-20184656-id-3493669.html

如果想让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需要区分这二者的区别.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
LinuxIO体系结构可以分为七层。首先是虚拟文件系统层(VFS层),它负责处理内核与各种文件系统的交互。不同的文件系统可能有不同的数据结构和方法,因此需要通过VFS层来统一接口[1]。 接下来是文件系统层,它包括各种具体的文件系统实现,如EXT4、NTFS等。文件系统层负责管理文件和目录的存储和访问。 在上面的层次之下是块设备层,它处理块设备(如硬盘)的读写操作。块设备层提供了缓存、调度、以及与设备驱动程序的交互。 接下来是设备驱动程序层,它负责与硬件设备进行通信。设备驱动程序将硬件抽象为逻辑设备,并提供相应的接口供上层调用。在非PC体系结构上,由于无法直接引用物理内存单元的线性地址来访问I/O共享存储器,Linux定义了一些依赖于体系结构的函数,如直接内存访问(DMA)。 再下一层是总线层,它负责管理硬件设备的连接和通信。总线层提供了一组标准接口,用于与设备进行通信。 设备层位于总线层之上,它将逻辑设备映射到实际硬件设备,并提供了一组通用的设备操作接口。 最底层是物理设备层,它包括了具体的硬件设备,如硬盘、网卡等。 总结起来,LinuxIO体系结构包括虚拟文件系统层、文件系统层、块设备层、设备驱动程序层、总线层、设备层和物理设备层。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [如何提高Linux下块设备IO的整体性能?](https://download.csdn.net/download/weixin_38705762/15468690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [深入理解 Linux 内核---I/O 体系结构和设备驱动程序](https://blog.csdn.net/u012319493/article/details/85097182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值