I/O体系结构和设备驱动程序(一)

news2024/12/26 23:45:29

I/O体系结构

让信息在CPU、RAM和I/O设备之间流动的数据通路称之为总线,即计算机内的主通信通道。所有计算机都有一条系统总线(一种典型的系统总线是PCI总线),连接内部大部分的硬件设备。计算机内不同的总线可以通过“桥”进行连接。

任何I/O设备有且仅能连接一条总线,CPU和I/O设备之间的总线称为I/O总线。I/O体系结构中包含了三个硬件组织层次:I/O端口、I/O接口、I/O设备控制器

I/O端口

每个连接到I/O总线上的设备都有自己的I/O地址集,称为I/O端口。I/O端口包含一组寄存器:CPU要把发送给设备的命令写入设备控制寄存器,并从设备状态寄存器中读出设备的状态,通过读取设备的输入寄存器从而获取设备的数据,也可以向设备的输出寄存器中写入数据从而把数据传输给设备。

 

访问I/O端口

inb(), inw(), inl()

分别从I/O端口读取1、2、4个连续字节。

inb_p(), inw_p(), inl_p()

分别从I/O端口读取1、2、4个连续字节,然后执行一条指令使CPU暂停。

outb(), outw(), outl()

分别向I/O端写入取1、2、4个连续字节。

outb_p(), outw_p(), outl_p()

分别向I/O端写入取1、2、4个连续字节,然后执行一条指令使CPU暂停。

内核中资源(resource)表示某个实体的一部分,被互斥地分配给设备驱动程序。一个资源表示I/O端口地址的一个范围,存放在数据结构resource中。所有的同种资源都插入到一个数形结构中,例如,表示I/O端口地址范围的所有资源都包含在一个根节点为ioport_resource的树中。struct resource结构主要成员如下:

struct resource {
    resource_size_t start; /* 资源范围的开始 */
    resource_size_t end; /* 资源范围的结束 */ 
    const char name; /* 资源拥有者的描述 */
    unsigned long flags; /* 各种标志 */
    struct resource * parent; /* 指向资源树中父亲的指针 */
    struct resource * sibling; /* 指向资源树中兄弟的指针 */
    struct resource * child; /* 指向资源树中第一个孩子的指针 */
}

任何设备驱动程序都可以使用下面三个函数,传递给它们的参数为资源树的根节点和要插入的新资源数据结构的地址:

request_resource()

把一个给定范围分配给一个I/O设备

allocate_resource()

在资源树中寻找一个给定大小和排列方式的可用范围,若存在,就分配一个I/O设备

release_resource()

释放以前分配的I/O设备的给定范围。

I/O接口

I/O接口是出于I/O端口和对应的设备控制器之间的一种硬件电路,作用是翻译器,即把I/O端口中的值转换为设备所需要的命令和数据。它也检测设备的状态变化,对状态寄存器进行更新。I/O接口分为专用I/O接口和通用I/O接口,专用I/O接口包括磁盘接口、键盘接口、鼠标接口等,通用I/O接口包括串口、并口、USB等。

I/O设备控制器

控制器主要有两个作用:

1. 对从I/O接口接受到的高级命令进行解释,并通过向设备发送电信号序列强制设备执行相应的操作。

2. 对从设备接受到的电信号进行转换和解释,并(通过I/O接口)修改状态寄存器的值。

典型的设备控制器是磁盘控制器,它从CPU接受诸如"写这个数据块"的高级命令,并将其转换为"把磁头定位在正确的磁道上"和"把数据写入这个磁道"之类的低级磁盘操作。比较简单的设备设备控制器。

设备驱动程序模型

现代Linux操作系统要求设备即使类型不同,也应具有相似的功能,对这种设备的驱动程序应当关注以下几点:

1. 电源管理(设备控制电源线上不同的电压级别)

2. 即插即用(配置设备时透明的资源分配)

3. 热插拔(系统运行时支持设备的插入和移走)

系统中所有硬件都由内核全权负责电源管理,例如,在计算机计入待机状态时,内核应立刻强制每个硬件设备处于低功率状态,因此,每个响应待机状态的设备驱动程序必须包含一个回调函数,能够使得设备处于低功率状态。而且,硬件必须按照正确的顺序进入待机状态,否则一些设备可能处于错误的电源状态。例如,必须先使硬盘处于待机状态,然后才是它们的磁盘控制器,否则,磁盘控制器就不能向磁盘发送命令。

为了实现这些操作,Linux提供了一些数据结构和辅助函数,从而构成了设备驱动模型。

sysfs文件系统

sysfs是一种特殊的文件系统,与/proc类似,通常被安装于/sys目录。sysfs文件系统的目标是展现设备驱动程序模型组件间的层次关系,其下面通常有如下目录:

block

        块设备,独立于所连接的总线

devices

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

bus

        用于连接设备的总线

drivers

        在内核中注册的设备驱动程序

class 

        系统中设备的类型,同一类可能包含由不同总线连接的设备,由不同的驱动程序驱动

power

        处理一些硬件设备的电源状态的文件

firmware

        处理一些硬件设备的固件的文件      

  

kobject

kobejct是设备驱动程序模型的核心数据结构,每个kobject对应sysfs文件系统里的一个目录。kobejct被嵌入到一个叫做"容器"的更大的对象里,容器描述设备驱动程序模型中的组件,容器的典型例子有总线、设备以及驱动程序等等。

将一个kobject嵌入到一个容器里,意味着内核:

1. 为容器保持一个引用计数器

2. 维持容器的层次列表

3. 为容器的属性提供一个用户态查看的视图。

kobject、kset和subsystem

kobject数据结构的主要成员如下:

struct kobject {
    char * kname; /* 指向包含容器名称的字符串 */
    struct kref kref; /* 容器的引用计数器 */ 
    struct list_head entry; /* 用于kobject所插入的链表的链表项 */
    struct kobject * parent; /* 父kobject */
    struct kset * kset; /* 所属的kset */
    struct kobj_type * ktype; /* kobject的类型描述符 */
}

kref字段指向一个kref类型的对象,kref类型仅包含一个refcount字段,就是kobject的引用计数器。kobject_get()和kobject_put()分别用于增加和减少引用计数器的值,如果该值为0,就会释放kobject所使用的资源,并且执行ktype对象的release方法。

kset可以将kobject组织成一个层次树,kset是同类型的kobject的集合,其主要字段包含:

struct kset {
    struct subsystem * subsys /* 指向subsystem的描述符 */
    struct kobj_type * ktype /* 指向kobj_type的描述符 */
    struct list_head list /* 包含在kset中的kobject的链表首部 */
    struct kobject kobj /* 嵌入的kobject */
}

包含在kset中的所有kobject的parent字段指向的就是该kset中的kobj

subsystem数据结构可以包含不同类型的kset,主要有两个字段:

kset 

        内嵌的kset结构,用于存放subsystem中的kset

rwsem

        读写信号量,保护递归地包含于该subsystem中的kset和kobject。

设备驱动程序模型层次的一个例子:bus子系统包含一个pci子系统,pci子系统又包含驱动程序的一个kset,这个kset包含一个串口kobject,这个kobject又包含一个new-id的属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lua语言的闭包设计和LClosure解读

什么是闭包 闭包是一种特殊的函数,它可以访问其创建时所处的环境中的变量,即使在函数创建后,环境已经不再存在,这些变量仍然可以被访问。 为了更好地理解闭包,我们可以看一个例子: function counter()lo…

Appium知多少

Appium我想大家都不陌生,这是主流的移动自动化工具,但你对它真的了解么?为什么很多同学搭建环境时碰到各种问题也而不知该如何解决。 appium为什么英语词典查不到中文含义? appium是一个合成词,分别取自“applicatio…

OpenAI官方提示词课(七)制作一个聊天机器人

大型语言模型的一个令人兴奋的方面是,你可以利用它来构建一个定制的聊天机器人,并且只需付出少量的努力。ChatGPT 的网页界面可以让你与一个大型语言模型进行对话。但其中一个很酷的功能是,你也可以利用大型语言模型构建你自己的定制聊天机器…

案例 | 标杆引领!人大金仓智绘数字金融

随着中央数字经济政策推进金融业数字化建设,数字金融已初见成效,但尚存在信息安全缺乏保障、转型覆盖不全面等问题。 为实现金融行业全面数字化转型升级,作为数据库领域国家队,人大金仓紧跟国家战略,自主研发的系列数据…

msvcp110.dll丢失原因——msvcp110.dll丢失怎么修复(最新可修复)

昨天卸载了一个垃圾软件以后,我的其他软件就无法打开运行,提示msvcp110.dll丢失,无法继续执行此代码。今天早上找了很多方法,终于把msvcp110.dll丢失的原因以及修复的方法都弄明白了。msvcp110.dll是一个非常重要的文件&#xff0…

【CVE-2022-0185】Linux kernel [文件系统挂载API] 堆溢出漏洞分析与利用

0x00.一切开始之前 CVE-2022-0185 是 2022 年初爆出来的一个位于 filesystem context 系统中的 fsconfig 系统调用中的一个堆溢出漏洞,对于有着 CAP_SYS_ADMIN 权限(或是开启了 unprivileged namespace)的攻击者而言其可以利用该漏洞完成本地…

Hugging News #0616: 有几项非常重要的合作快来围观、最新中文演讲视频回放发布!...

每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「Hugging News」,本期 Hugging News 有哪些有趣的消息…

【MySQL】SQL的函数用法

文章目录 聚合函数Count()Max()Min()Sum()Avg() 其他常用函数时间函数字符串函数SUBSTRING函数:切割字符串([start:end])SUBSTRING_INDEX函数:切割字符串(split)LOWER&UPPER函数:大小写转化CONCAT&CONCAT_WS函数:连接字符串REPLACE函数:字符串替换 数学函数ROUND函数:四…

rhce8考试

rhce考试模拟环境准备: cat /etc/rht 确认当前是否为294环境,真实考试有5台被管理节点,借助bastion当做第5台。 将考试所需的文件放到这个目录,/content/courses/rh294/rhel8.0/materials目录,虚拟机看br0网卡信息ifc…

使用LOAD DATA INFILE命令加载数据文件到MySQL数据库的方法和常见错误及解决方法

文章目录 使用LOAD DATA INFILE命令加载数据文件到MySQL数据库的方法和常见错误及解决方法LOAD DATA INFILE的语法详细1.创建(选择)目标数据库和表2.将数据从 CSV 文件导入已创建的表常见错误和解决方法错误1:ERROR 1290 (HY000): The MySQL …

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像:http://mirrors.163.com/ 搜狐开源镜像:http://mirrors.sohu.com/ 阿里开源镜像:https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司:http://mirrors.yun-idc.com/ 常州贝特康姆软件技…

TFTP是什么,一文带你了解

目录 一、TFTP协议简介 TFTP协议的主要特点包括: 二、TFTP包格式 1. 读/写请求包 2. 文件数据包 3. 回应包 4. 错误信息包 三、TFTP的工作流程 TFTP协议的工作流程包括以下几个步骤: 四、TFTP的传输模式 1. 二进制传输模式 2. ASCII码传输模式…

【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】

目录 一、Spring 简介二、读取配置文件、创建对象三、使用 Spring(1) 依赖(2) Spring 的核心配置文件(3) 获取 Spring IoC 工厂中的对象实例 四、IoC 容器五、依赖注入(DI)(1) 基于 setter 注入【bean】(2) 基于 setter 注入【基本类型、包装类型、Strin…

理解空穴电流

理解空穴电流 近日闲来无事,翻起来模电看了起来,在看到关于三极管的一张图时,对三极管的 I E P {I}_{EP} IEP​电流无法理解。 I E P {I}_{EP} IEP​电流,教材上的解释是基区空穴形成的空穴电流。 于是我就收集了相关资料&#…

NVIDIA Jetson Orin™ 与其他 NVIDIA Jetson 模组的区别

NVIDIA Jetson Orin™ 与其他 NVIDIA Jetson 模组的区别 在本系列关于 NVIDIA Jetson AGX Orin 的前几版中,我们了解了 AGX Orin 是什么、它的技术特性、主要构建模块和关键的嵌入式视觉用例。以下是这两篇文章的链接: 什么是 NVIDIA Orin 系列&#xf…

3D线段SFM建图

文章:3D Line Mapping Revisited 作者:Shaohui Liu,Yifan Yu,Remi Pautrat ,Marc Pollefeys,Viktor Larsson 编辑:点云PCL 代码: https://github.com/cvg/limap(CVPR 20…

Visual Studio无法拖入文件解决办法

原因:当windows账户为个人账户(即使带有管理员字眼),如果vs以“管理员”运行就会限制文件拖入,此时软件左上角显示“管理员”字眼 这种情况可能是你在运行vs时选了“以管理员身份运行”,也可能是快捷方式设…

深入理解Java虚拟机jvm-对象的访问定位

对象的访问定位 句柄直接指针优劣句柄直接指针 创建对象自然是为了后续使用该对象,我们的Java程序会通过栈上的reference数据来操作堆上的具 体对象。由于reference类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这个引用应该通…

蓝牙技术原理(9)蓝牙AOA/AOD技术原理

文章目录 1 AOA/AOD的概述1.1 AOA(达到角)1.2 AOD(出发角) 2 AOA整体系统搭建3 IQ信号讲解3.1 阵列天线的切换模型3.2 CTE 数据包特征3.3 CTE 数据包具体格式3.4 相位角的计算 4 到达角度的计算5 确定tag的坐标 1 AOA/AOD的概述 BLE 5.1 有个特性加入了…