Linux 内核源码分析---I/O 体系布局与访问装备

打印 上一主题 下一主题

主题 981|帖子 981|积分 2943

I/O 体系布局

与外设的通信通常称之为输入输出,一样平常都缩写为I/O。
在实现外设的I/O时,内核必须处理惩罚3个大概出现的问题:
(1)必须根据具体的装备类型和模子,利用各种方法对硬件寻址
(2)内核必须向用户应用程序和系统工具提供访问各种装备的方法。但凡有大概,都应当接纳同一的方案,确保程序设计的工作量不会过多,同时包管应用程序能够在不考虑特定硬件方法的情况下进行互操纵;
(3)用户空间必要知道内核中有哪些装备可用
硬件装备大概以多种方式连接到系统,主板上的扩展槽或外部连接器最常见的方法,当然,扩展硬件也可以直接集成到主板上。

1.系统总线

尽管外设的范围大概看上去是无限的,它们并不直接连接到CPU,而是通过总线连接起来。
总线负责装备与CPU之间及各个装备之间的通信。

如下为代表性的总线:
a.PCI(Peripheral Component Interconnect):定义了 32 位数据总线,且可扩展为 64 位。PCI 总线主板插槽的体积比原 ISA 总线插槽还小,其功能比 VESA、ISA 有极大的改善,支持突发读写操纵,最大传输速率可达 132MB/s,可同时支持多组外围装备。PCI局部总线不能兼容现有的 ISA、EISA、MCA(microchannelarchitecture)总线,但它不受制于处理惩罚器,是基于奔腾等新一代微处理惩罚器而发展的总线。
b.ISA(Industrial Standard Architecture):总线标准是 IBM 公司 1984 年为推出 PC/AT 机而创建的系统总线标准,所以也叫AT总线。它是对XT总线的扩展,以 适应 8/16 位数据总线要求。它在 80286 至 80486 期间应用非常广泛,以至于现在奔腾机中还保存有ISA总线插槽。ISA总线有98只引脚。
c.SBus:全称Serial Bus,即串行通信总线。本质上是一种串口通信协议,接纳100K的波特率,8位数据位,2位停止位,偶效验,即8E2的串口通信。
d.IEEE1394
e.SCSI(Small Computer System Interface)
f.USB(Universal Serial Bus):通用串行总线USB是由Intel、Compaq、Digital、IBM、Microsoft、NEC、NorthernTelecom等7家世界著名的计算机和通信公司共同推出的一种新型接口标准。它基于通用连接技能,实现外设的简单快速连接,到达方便用户、降低成本、扩展PC连接外设范围的目标。它可以为外设提供电源,而不像普通的利用串、并口的装备必要单独的供电系统。
g.并口与串口(Parallel and Serial Interface)
总线的分类和区别
2.与外设交互

与外设通信的方法,有几种方法可以与连接到系统的硬件通信
a.I/O端口
利用 IA-32 和很多其他体系布局上都有 I/O 端口,在这种情况下,内核发送数据给 I/O 控制器。数据的目标装备通过唯一的端标语标识,数据被传输到装备进行处理惩罚。处理惩罚器管理一个独立的虚拟地址空间,可以用于管理全部 I/O 地址。I/O 地址空间不关联到普通的系统内核。因为端口也可以映射到内存中,这样会引起混淆。
在IA-32体系布局上,端口地址空间由 2 的 16 次方(大约 64000 )个不同的8位地址组成,通过0x0到0xFFFF之间的数字唯一标识。
1、每个连接到I\O总线上的装备都有自己的I\O地址集,通常称为I\O端口。
2、一共提供了65536个8位的端口,可以把两个连续的8位端口当作一个16位端口,但是这必须从偶数地址开始。
3、可以讲2个8位的看作一个16位的(必须从偶数开始),2个16位的看作一个32位的端口(必须从4倍数开始)
4、对端口对读写命令 in、ins、out、outs
5、为了提高性能提供控制寄存器、状态寄存器、输入寄存器、输出寄存器
深入理解Linux内核-I/O体系布局和装备驱动程序
b.I/O内存映射
程序员必须寻址很多装备,与内存的处理惩罚方式类似。因此现在处理惩罚器提供对 I/O 端口进行内存映射,将特殊外设的端口地址映射到普通内存中。
c.轮询和中断
轮询(polling)计谋比力简单,只必要重复扣问装备数据是否可用,假如可用,则处理惩罚器取回数据。
中断计谋比力好。每个CPU都提供中断线,可由各个系统装备共享,每个中断通过一个唯一号码标识,内核对利用的每个中断提供一个服务例程。
3.通过总线控制装备

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

装备特殊文件(装备文件)用于访问扩展装备。这些文件并不关联到硬盘或任何其他的存储介质上的数据段,而是创建了与某个装备驱动程序的连接,以支持与扩展装备的通信。
就应用程序而言,普通文件和装备文件的处理惩罚有肯定差异。二者都是可以通过同样的库函数处理惩罚。
字符装备、块装备和其他装备

根据外设与系统之间交换数据的方法,可以将装备分为几种类别。有些装备非常得当于面向字符的数据交换,因为数据传输量很低。其他的装备则更得当于处理惩罚包罗固定数目字节的数据块。内核会区分字符装备和块装备。
1、/dev目次下一些成员,特别在访问权限上面,访问之前的字母是 b 或 c,分别代表块装备和字符装备;装备文件没有文件长度,而增加别的两个值,分别是主装备号和从装备号。
2、/dev/hda,/dev/hdb,/dev/sda,dev/sdb:hda(一样平常指IDE接口的硬盘,sda-般指sata接口硬盘)
标识装备文件:

查询/dev目次中与sda硬盘有关的其他装备文件:

3、热插拔消息:新装备
每当内核检测到一个装备时,都会创建一个内核对象 kobject。该对象借助于 sysfs 文件系统导出到用户层,内核还向用户空间发送一个热插拔消息。

   sysfs文件系统是一种特殊的文件系统,被安装于/sys目次下的/proc文件系统相似。
/proc文件系统是初次被设计成允许用户态应用程序访问内核内部数据布局的一种文件系统。
/sysfs文件系统本质上与/proc有相同的目标,但是它还提供关于内核数据布局的附加信息;此外,/sysfs的构造布局比/proc更有条理。或许,在不远的将来,/proc和/sysfs将会继续共存。
    sysfs文件系统的目标是要显现装备驱动程序模子组件间的条理关系。该文件系统的相应高层目次是:
block:块装备,它们独立于所连接的总线。
devices:全部被内核辨认的硬件装备,依照连接它们的总线对其进行构造。
bus:系统中用于连接装备的总线。
drivers:在内核中注册的装备驱动程序。
class:系统中装备的类型;同一类大概包罗由不同总线连接的装备,于是由不同的驱动程序驱动。
power:处理惩罚一些硬件装备电源状态的文件。
firmware:处理惩罚一些硬件装备的固件的文件。
  4、网卡及其它装备
字符装备和块装备不是内核管理的全部装备类别
网卡在内核中具有特殊职位,它无法融入到分类方案当中,事实很显着:网卡没有装备文件。相反,用户程序必须利用套接字与网卡通信。套接字就是一个抽象层,对全部网卡提供一个抽象视图。标准库的网络相关函数调用socketcall系统调用与内核通信交互。进而访问网卡。
5、字符装备与块装备
字符装备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取,相反,此类装备支持按字节字符读取。比如:调度解调器是典型的字符装备。
块装备:应用可以随机访问装备数据,程序可自行确定读取数据的位置。比如:硬盘是块装备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。
动态创建装备文件
/dev 中的装备结点一样平常是在基于磁盘的文件系统中静态创建的。随着支持装备越来越多,必须安置和管理越来越多的项,典型发布版大约包罗 20000 项。险些全部的发布版都将 /dev 内容的管理工作切换到 udevd,这是一个守护历程,允许从用户层动态创建装备文件。
udevd 根本头脑,纵然从用户层管理装备文件,内核的支持也是绝对必须的,否则就无法判断系统上有哪些装备可用。
字符装备


a.装备号
主装备号是用来标识与装备文件相连的驱动程序,主装备号用来反映装备类型;次装备号被驱动程序用来辨别操纵的是哪个装备,并区分同类型的装备。
装备号,就是系统分配一个编号,装备号是一个无符号的 32 位整型,包括主装备号+次装备号,主装备号为高12位,次装备号为低20位。
装备文件必要装备号才能够创建,装备驱动也必要装备号才载装载,装备文件正是通过主装备号找到它的驱动;装备驱动正是利用次装备号才知道他要操纵的具体是哪一个装备。
b.字符装备管理框架


c.字符装备数据布局

d.管理装备驱动程序函数的数据布局

I/O体系布局和装备驱动程序

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表