浅析Linux设备驱动:IO端口和IO内存

文章目录

    • 概述
      • IO端口和IO内存的区别
    • IO资源管理
      • IO资源类型
        • IO端口资源
        • IO内存资源
      • IO资源分配
    • IO端口访问
      • IO端口操作函数
    • IO内存访问
      • IO内存操作函数
    • 相关参考

概述

在计算机系统中,外部设备通常会提供一组寄存器或内存用于处理器配置和访问设备功能。这些寄存器或内存可能位于IO空间,或者内存空间。当寄存器或内存位于IO空间时,称为IO端口;当寄存器或内存位于内存空间时,称为IO内存。

IO端口和IO内存的区别

IO端口和IO内存的主要区别在于CPU对外设IO寄存器物理地址的编址方式不同。已存在的编址方式有两种:独立编址和统一编址,其中:

  • 独立编址:外设使用独立的IO地址空间,并使用专门的IO指令进行访问。例如x86体系结构就使用了独立的IO空间,支持64K个IO端口;
  • 统一编址:设备寄存器被映射到CPU的物理内存空间,并支持以访问内存的方式来访问这些寄存器。

IO资源管理

IO端口和IO内存都属于外设提供的IO资源,Linux下通过resource结构来对IO资源进行描述,包括使用的I/O资源的地址空间范围、状态等信息,并将这些resource用ioport_resource或iomem_resource作为表头按地址大小的顺序链接起来。

struct resource {
	resource_size_t start;	/* 描述设备实体在 CPU 总线上的线性起始物理地址 */
	resource_size_t end;	/* 描述设备实体在 CPU 总线上的线性结尾物理地址 */
	const char *name;		/* 描述这个设备实体的名称,这个名字开发人员可以随意起,但最好贴切 */
	unsigned long flags;	/* 描述这个设备实体的一些共性和特性的标志位 */
	struct resource *parent, *sibling, *child;
};

IO资源类型

Linux支持运行在多种不同的硬件体系结构上,并同时支持IO端口以及IO内存,为此内核同时维护了这两种类型的IO资源,外部设备按需进行分配。

IO端口资源

IO端口资源由ioport_resource全局变量进行管理,定义如下:

struct resource ioport_resource = {
.name = "PCI IO",
.start = 0,
.end = IO_SPACE_LIMIT,
.flags = IORESOURCE_IO,
};
IO内存资源

IO内存资源由iomem_resource全局变量进行管理,定义如下:

struct resource iomem_resource = {
.name = "PCI mem",
.start = 0,
.end = -1,
.flags = IORESOURCE_MEM,
};

IO资源分配

Linux访问设备IO空间前,需要先调用request_region/request_mem_region接口为其分配IO资源区域,其中request_region用于分配IO端口资源,request_mem_region用于分配IO内存资源。

在这里插入图片描述

request_region/request_mem_region调用__request_region函数实现。__request_region函数的主要功能为:查找resource链表中是否有与申请的I/O资源有冲突,如冲突则返回NULL,如不冲突则将新申请resource按resource地址从小到大的顺放插入至以ioport_resource或iomem_resource为表头(root)的单向指针链表中。

IO端口访问

Linux系统下访问IO端口有2种方式:I/O映射方式和内存映射方式。其中:

  • IO映射方式直接使用IO端口操作函数,这些函数内部会调用体系结构相关的IO端口操作指令,例如x86架构下的in/out指令;
  • 内存映射方式是先使用ioport_remap接口把IO端口映射到IO内存空间,再使用IO内存操作函数来访问IO端口。这种方式主要是为了屏蔽IO端口和IO内存在硬件上的差异,统一使用IO内存的方式进行访问。

无论是使用哪种方式,都需要先使用request_region接口申请对应的IO端口资源。完整的IO端口访问流程如下:
在这里插入图片描述

IO端口操作函数

/* inb/outb:读/写字节端口(8位宽) */
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);

/* inw/outw:读/写字端口(16位宽) */
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);

/* inl/outl:读/写32位端口 */
unsigned inl(unsigned port);
void outl(unsigned longword, unsigned port);

IO内存访问

Linux系统访问IO内存需要先调用request_mem_region接口申请资源,接着将设备IO地址通过ioremap接口映射到内核空间的虚拟地址,之后就可以使用IO内存操作函数对这些寄存器进行访问。

完整的IO内存访问流程如下:
在这里插入图片描述

IO内存操作函数

/* I/O内存读函数  */
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);

/* I/O内存写函数   */
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);

相关参考

  • Linux系统对IO端口和IO内存的管理
  • Linux设备驱动:I/O端口与I/O内存

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

介绍7款免费的最佳地图/导航/定位/GIS开源项目

文章目录 1、xdh-map新德汇地图应用类库1.1、独立引用1.2、与MyUI结合使用1.3、快速上手1.3.1、采用项目工程模板创建项目【推荐】1.3.2、 调用组件库功能 2、蚂蚁金服AntV-L7地理空间数据可视分析引擎2.1、AntV-L7简介2.2、核心特性2.3、支持丰富的图表类型2.4、如何使用2.4.1…

windows 启动和关闭mysql

1)打开我的电脑-->2)在左边文件中右键此电脑--> 3)点击管理-->4)点击服务和应用程序-->5)点击服务-->6)查找自己MySQL名称 右击 启动或者关闭

一、直方图相关学习

1、灰度直方图 1.1 基本概念和作用 表示图像中每个灰度级别的像素数量。用于分析图像的亮度分布情况。 1.2 代码示例 参数介绍 hist cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate)-images:输入图像的列表。对于灰度图像&#xff0…

vue3-渲染机制

渲染机制 Vue 是如何将一份模板转换为真实的 DOM 节点的,又是如何高效地更新这些节点的呢?我们接下来就将尝试通过深入研究 Vue 的内部渲染机制来解释这些问题。 虚拟 DOM 你可能已经听说过“虚拟 DOM”的概念了,Vue 的渲染系统正是基于这…

阿里云香港轻量应用服务器是什么线路?cn2?

阿里云香港轻量应用服务器是什么线路?不是cn2。 阿里云香港轻量服务器是cn2吗?香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器,通过mtr traceroute测试了一下,最后一跳是202.97开头的ip,1…

317. 多关键字排序

/** Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.*/package ahwoj;import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Scanner;/*** 题目说排序关键字优先级依次降低,那就是说&…

C 语言 ConsoleRogueLike 控制台肉鸽游戏 DEVC++ VS2022都可用

使用 C 语言和 windows 的键盘检测函数和延迟函数,开发的控制台 roguelike 游戏 点开 .exe 文件立即进入游戏 AWSD 移动 J 攻击 K 加成buff 没有结束条件,除非碰到敌人。 其他模块功能还没来得及开发 author : 民用级脑的研发记录 DEVC 项目工程代码副本…

【机构vip教程】Appium自动化(2):Python+Appium环境搭建

windows下搭建pythonappium环境 搭建过程步骤如下: 1、安装jdk并配置好环境变量(jdk版本1.8以上) 2、安装android-sdk并配置好环境变量;具体步骤见:https://www.cnblogs.com/YouJeffrey/p/15243705.html 3、安装安…

是面试官放水,还是公司实在是太缺人?,字节原来这么容易进...

字节是大企业,是不是很难进去啊?” “在华为做软件测试,能得到很好的发展吗? 一进去就有19.5K,其实也没有想的那么难” 直到现在,心情都还是无比激动! 本人211非科班,之前在华为…

嵌入式学习-C++-Day6

思维导图 作业 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一…

3年,5年,10年,网工人必看!

你们好,我是老杨。 2023年的职场上,无数人在思考“什么时候才能提前退休”这个问题。 对很多底层网工来说,二三十岁的年纪,距离60岁退休还有30年左右,是不是会觉得有点遥遥无期,毫无盼头? 现…

物奇平台ENC算法开关接口修改方法

物奇ENC算法开关接口修改 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 1 配置工具 2 代码接口

Ansible fetch 模块 该模块用于从远程某主机获取(复制)文件到本地

这里写目录标题 参数实例查看返回结果在这里插入图片描述 参数 dest:用来存放文件的目录 src:在远程拉取的文件,并且必须是一个file,不能是**目录* 实例 ansible slave -m fetch -a src/data/hello.txt dest/data/可以看到一个…

2024年【安全员-C证】报名考试及安全员-C证考试资料

题库来源:安全生产模拟考试一点通公众号小程序 安全员-C证报名考试参考答案及安全员-C证考试试题解析是安全生产模拟考试一点通题库老师及安全员-C证操作证已考过的学员汇总,相对有效帮助安全员-C证考试资料学员顺利通过考试。 1、【多选题】《工伤保险…

软件实例分享,台球厅收费系统电脑桌球店计时软件及灯控线路图教程

软件实例分享,台球厅收费系统电脑桌球店计时软件及灯控线路图教程 一、前言 以下软件程序教程以 佳易王桌球室计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、每个桌子对应的有 开台时间,所用的时…

java数据结构与算法刷题-----LeetCode594. 最长和谐子序列

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 子序列要尽可能长,并且最大值和最小值之间的差&#…

Python教程(27)——如何使用Python中的上下文管理器

当我们在编写代码时,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到了一些异常情况,我们需要关闭资源,不然会导致资源泄露,虽然我们可以通过手动的方式来关闭,但如果有多个异常情况…

基于Springboot的新能源充电系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的新能源充电系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

MyBatisPlus 整合 SpringBoot 遇见的问题

【异常】:Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’… SQL: SELECT id,oper_id,btch_id,udf1, FROM scan_cyber Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’; ,"messag…

OpenHarmony—UIAbility组件与UI的数据同步

基于HarmonyOS的应用模型,可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信:基于发布订阅模式来实现,事件需要先订阅后发布,订阅者收到消息后进行处理。使用globalThis进行数据同步&#…
最新文章