[X]关闭

I/O体系结构

文档创建者:东吴
浏览次数:186
最后更新:2024-10-07
本帖最后由 东吴 于 2024-10-7 15:00 编辑

一、I/O体系结构
与外设的通信通常称之为输入输出,一般缩写为I/O。在实现外设的I/O时。内核必须处理3个可能出现的问题:
  必须根据具体的设备类型和模型,使用各种方法对硬件寻址。
  内核必须向用户应用程序和系统工具提供访问各种设备的方法。但凡有可能,都应当采用统一的方案,确保程序设计的工作量不会过多,同时保证应用程序能够在不考虑特定硬件方法的情况下进行互操作。
  用户空间需要知道内核中有哪些设备可用。
image.jpg
     外设寻址的分层模型
硬件设备可能以多种方式连接到系统,主板上的扩展槽或外部连接器最常见的方法,当然,扩展硬件也可以直接集成到主板上。
1、系统总线
  所有计算机都拥有一条系统总线,连接大部分内部硬件设备。总线负责设备与CPU之间及各个设备之间的通信。如PCI、ISA、SBus、IEEE394、SCSI、USB、并口与串口为代表性的总线。
image.jpg
2、与外设交互
与外设通信的方法,有几种方法可以与连接到系统的硬件通信
2.1 I/O端口
  每个连接到 I/O 总线上的设备都有自己的 I/O 地址集,通常称为 I/O 端口。使用IA-32(英特尔32位架构)和很多其它体系结构都有I/O端口,在这种情况下,内核发送数据给I/O控制器。数据的目标设备通过唯一的端口号标识,数据被传输到设备进行处理。处理器管理一个独立的虚拟地址空间,可以用于管理所有I/O地址。I/O地址空间不关联到普通的系统内核。因为端口也可以映射到内存中,会引起混淆。在IA-32体系结构上,端口地址空间由2的16次方(64000)个不同8位地址组成,通过0x0到0xFFFF之间的数字唯一的标识。
2.2 I/O内存映射
  程序员必须寻址很多设备,与内存的处理方式类似。因此现在处理器提供对I/O端口进行内存映射,将特殊外设的端口地址映射到普通内存中。
2.3 轮询和中断
  轮询(polling)策略:只需要重复询问设备数据是否可用,如果可用,则处理器取回数据。CPU 轮询设备的状态寄存器,直到寄存器的值表明 I/O 操作已经完成。
  中断策略:每个CPU都提供中断线,可由各个系统设备共享,每个中断通过唯一号码标识,内核对使用的每个中断提供一个服务例程。当 I/O 控制器能够通过 IRQ 线发出 I/O 操作结束的信号,中断模式才能被使用。

3、通过总线控制设备
并非所有设备都是直接通过I/O语句寻址,也有通过总线系统访问的。具体的方式与所使用的总线和设备相关。并非所有设备类别都可以连接到所有总线系统(比如:将硬盘CD记录机连接到SCSI接口,但图形卡就行)。

二、访问设备
设备特殊文件(设备文件)用于访问扩展设备。这些文件并不关联到硬盘或任何其他的存储介质上的数据段,而是建立了与某个设备驱动程序的连接,以支持与扩展设备的通信。就应用程序而言,普通文件和设备文件的处理有一定差别。二者都是可以通过同样的库函数处理。
1、字符设备、块设备和其它设备
根据外设与系统之间交换数据的方法,可以将设备分为几种类别。有些设备非常适合于面向字符的数据交换,因为数据传输量很低。其他的设备则更适合于处理包含固定数目字节的数据块。内核会区分字符设备和块设备。
标识设备文件(查询:uisrc@ubuntu:~$ ls -l /dev)
image.jpg
1.1 /dev目录下一些成员,特别在访问权限上面,访问之前的字母是b或c,分别代表块设备和字符设备;设备文件没有文件长度,而增加另外俩个值,分别是主设备号和从设备号。
查询/dev目录中与sda硬盘有关的其他设备文
image.jpg
1.2 /dev/had,/dev/hdb,/dev/sda,/dev/sdb:hda(一般指IDE接口有硬盘,sda一般指sata接口硬盘)
动态创建设备文件
/dev中的设备结点一般是在基于磁盘的文件系统中静态创建的。随着支持设备越来越多,必须安置和管理越来越多的项,典型发布版大约包含20000项。几乎所有的发布版都将/dev内容的管理工作切换到udevd,这是一个守护进程,允许从用户层动态创建设备文件。
udevd基本思想,即使从用户层管理设备文件,内核的支持也是绝对必须的,否则就无法判断系统上有哪些设备可用。
1.3 热插拔消息:新设备
每当内核检测到一个设备时,都会创建一个内核对象kobject。该对象借助于sysfs文件系统导出到用户层,内核还向用户空间发送一个热插拔消息。
image.jpg
1.4 网卡及其它设备
字符设备和块设备不是内核管理的全部设备类别。网卡在内核中具有特殊地位,它无法融入到分类方案当中,网卡没有设备文件。相反,用户程序必须使用套接字与网卡通信。套接字就是一个抽象层,对所有网卡提供一个抽象视图。标准库的网络相关函数调用socketcall系统调用与内核通信交互。进而访问网卡。
1.5 字符设备与块设备
字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取,相反,此类设备支持字节/字符读取。比如:调度解调器是典型的字符设备。
块设备:应用可以随机访问设备数据,程序可自行确定读取数据的位置。比如:硬盘是块设备,应用程序可以寻址硬盘上的任何位置,并由此读取数据。
1.6 设备驱动程序
用于与系统连接的输入/输出装置通信,如硬盘、软驱、各种接口、声卡等。设备驱动程序的任务在于支持应用程序经由设备文件与设备通信,使得能够按照适当的方式在设备上读取/写入数据。
1.7 设备号
设备号,就是系统分配一个编号,设备号是一个无符号的32位整型,包括主设备号+次设备号,主设备号为高12位,次设备号为低20位。
设备文件需要设备号才能够创建,设备驱动也需要设备号才载装载,设备文件正是通过主设备号找到它的驱动;设备驱动是利用次设备号才知道它要操作的具体是哪个设备。
2、字符设备
2.1 设备号
主设备号是用来标识与设备文件相连的驱动程序,主设备号用来反映设备类型;次设备号被驱动程序用来辨别操作的是哪个设备,并区分同类型的设备。
2.2 字符设备管理框架
image.jpg

image.jpg
2.3 字符设备数据结构
Linux内核中,使用struct dev结构体来描述一个字符设备
image.jpg

image.jpg

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则