浅析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.mzph.cn/news/688738.shtml

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

相关文章

由斐波那契数列探究递推与递归

斐波那契数列定义: 斐波那契数列大家都非常熟悉。它的定义是: 对于给定的整数 x ,我们希望求出: f ( 1 ) f ( 2 ) … f ( x ) f(1)f(2)…f(x) f(1)f(2)…f(x) 的值。 有两种方法,分别是递推(迭代)与递归 具体解释如下图 备注…

JDBC核心技术

第1章 JDBC概述 第2章 获取数据库连接 第3章 使用PreparedStatement实现CRUD操作 第4章 操作BLOB类型字段 第5章 批量插入 第6章 数据库事务 第7章 DAO及相关实现类 第8章 数据库连接池 第9章 Apache-DBUtils实现CRUD操作图像 小部件

蜂蜜器实验-驱动代码测试

一. 简介 上一篇文章实现了蜂鸣器驱动代码,实现关闭蜂鸣器与打开功能。文章地址如下: 蜂鸣器驱动代码完善-CSDN博客 本文对所实现的蜂鸣器驱动代码进行测试。 二. 蜂鸣器驱动代码测试 1. 准备应用程序 这里应用程序还使用 前面实现所使用的Led应用…

秒级到毫秒级的跨越—一次慢SQL优化历险

一次慢 SQL 优化过程 一、背景 对于公司内部的一个发票管理系统,财务人员经常需要对发票的开票交易进行查询,这里涉及到两张表:发票订单表和发票信息表,我们需要查询订单 ID、开票 APP、开票主体、订单类型、支付渠道、支付总额…

洛夫克拉夫特“克苏鲁神话”艺术风格探索(二)

三、多元的叙事风格 洛夫克拉夫特的克苏鲁神话作为当时独特的文学创造,有独特的叙事特征[8]。 一是侦探小说不稳定的叙事。最有名气的早期侦探小说是爱伦坡的《莫格街凶杀案》,并产生了“疑案”的经典设定,两次世界大战期间的侦探小说批评认…

《UE5_C++多人TPS完整教程》学习笔记18 ——《P19(实现子系统函数)创建会话(Create Session)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P19 (使用子系统函数)创建会话(Create Session)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&am…

基于Java SSM框架实现疫情防控系统项目【项目源码】

基于java的SSM框架实现疫情防控系统演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言,只要能快速融入web站点就可以&#x…

Spring 事务原理总结六

不知不觉,关于Spring事务的文章已经写了五篇了。老实讲我自己不断质疑过自己:现在写这些文章还有意义吗?当前的市场已经成什么样了,为什么还要固守这落后的技术?但是贝索斯一次接受访谈的回答,让我写下去的…

ESP32-Cam学习(1)——拍摄第一张照片

1.开发板介绍 使用的ESP32-Cam实物图为: 在某宝可以轻易买到。它分为主板,和底板。底板的主要功能是供电、程序下载等等。主板才是ESP32芯片的核心。 2.固件烧录 使用摄像头之前,需要给ESP32刷入支持摄像头的固件库,其下载地址为…

数据库-----范式判断

目录 (1)求最小函数依赖集 (2)求候选码 (3)求R最高属于哪级范式 总结: 以一道例题来看: 3.已知关系模式R<ABCDEG> F{BC-->E&#xff0c;DC-->B,D-->A,B-->G,D-->E,E-->G,B-->C} 求: ①F的最小函数依赖集 ②R的候选码 ③R最高属于…

美国中性原子量子公司QuEra宣布将在英国建造量子测试平台

编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1250字丨7分钟阅读 中性原子量子公司QuEra Computing宣布&#xff0c;英国国家量子计算中心&#xff08;NQCC&#xff09;将成为一个量子计算测试平台的所在地。 通过NQCC的资助&#xff0c;并在小型企业研究计划&#xff…

【Kubernetes in Action笔记】1.快速开始

在Kubernetes上运行一个程序 基础运行环境 当前的运行环境为使用虚拟机构建的单master集群。 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 109d v1.27.1 k8s-node1 Ready …

如何基于YAML设计接口自动化测试框架?看完秒会!

在设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML、CSV&#xff09;或者数据库中&#xff0c;实现脚本与数据解耦&#xff0c;方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测试用例&…

沁恒CH32V30X学习笔记05--串口接收中断和空闲中断组合接收数据

同步异步收发器(USART)** 包含 3 个通用同步异步收发器(USART1/2/3)和 5 个通用异步收发器(UART4/5/6/7/8) 空闲帧,空闲帧是 10 位或 11 位高电平,包含停止位。 断开帧是 10 位或 11 位低电平,后跟着停止位 引脚模式配置 引脚分配 bsp 驱动代码 bsp_uart_it.c /…

固定资产与总账对账,业务系统出不来数据?

1、【财务会计】-【固定资产】-【与总账对账】 2、【财务会计】-【总账】-【对账执行】 以上两个节点都可以进行 “固定资产与总账” 对账执行 操作。 问题&#xff1a; 固定资产与总账对账&#xff0c;业务系统出不来数据&#xff1f;如下图 &#xff1a; 原因&#xff…

麒麟linux和东方通TongWeb时区timezone不同步问题的解决

默认东方通文件夹位置如下&#xff1a; /data/TongWeb7.0.4.9_M3_Enterprise_Linux 在bin文件夹下有一个external.vmoptions 文件。 将下面这行&#xff1a; -Duser.timezoneAsia/Shanghai 添加到external.vmoptions 文件中。 重启东方通&#xff0c;时区问题解决。

VR直播:只需五步,即可实现直播“黑科技”

现如今&#xff0c;VR直播的应用范围较为广泛&#xff0c;有很多人可能在现场见过VR直播的拍摄设备&#xff0c;不仅有高性能的电脑、VR相机&#xff0c;还有专业的灯光和拍摄机器等。只需要五步&#xff0c;就可以实现安全、高效的VR全景直播。 首先是专业全景采集设备进行全景…

svg之全局组件,配合雪碧图解决vue2的svg优化问题

这里是vue2中的svg的完整解决方案的另一篇。 <template><svg :class"svgClass"><use :xlink:href"#${name}"></use></svg> </template><script>export default {name: icon,props: {name: {type: String,requi…

几种SLAM算法跑出的效果比较

以下所有的SLAM算法均使用此辆ROS小车跑。 文章目录 1.Gmapping SLAM算法构建地图2.Hector SLAM算法构建地图3.Karto SLAM算法构建地图4.Cartographer SLAM算法构建地图5.深度摄像头的建图6.rtab-map(深度双目与激光雷达构建三维建图)7.ORB-SLAM8.无奖竞猜 1.Gmapping SLAM算法…

OpenAI Sora视频生成机制:时空补丁

AI如何将静态图像转化为动态、逼真的视频&#xff1f;OpenAI 的 Sora 通过时空补丁&#xff08;spacetime patches&#xff09;的创新使用给出了答案。 独特的视频生成方法 在生成模型的世界中&#xff0c;我们看到了从 GAN 到自回归和扩散模型的许多方法&#xff0c;它们都有…