什么是I/O内存?

原文地址:https://blog.csdn.net/u012041204/article/details/126915000


什么是IO内存

I/O内存也称为Memory-Mapped I/O(MMIO), 它是指一种编址方式,不同cpu平台使用的编址方式不同,一种是“IO内存”方式,也叫统一编址方式,是指内存和外设的地址是在同一个地址空间上的,比如我们常见的ARM、MIPS等平台;还有另外一种叫独立编址方式,是指内存的地址空间和外设的地址空间是分开的,比如x86平台。

Linux I/O内存 API

(1) IO内存申请

要使用某个外设前,要申请其所对应的IO内存,表明驱动要访问这块区域。

//申请IO内存
/*
start: 该IO的地址相当与物理地址
n: 申请IO数量,必须是start起始地址连续 len个字节
name: 设备名称或者IO端口名称,用以标记该端口被谁使用
*/
#define request_mem_region(start,n,name) \
    __request_region(&iomem_resource, (start), (n), (name), 0)
    
#define devm_request_mem_region(dev,start,n,name) \
  __devm_request_region(dev, &iomem_resource, (start), (n), (name))
     
//释放IO内存
#define release_mem_region(start,n)  \
    __release_region(&iomem_resource, (start), (n)) 

#define devm_release_mem_region(dev, start, n) \
  __devm_release_region(dev, &iomem_resource, (start), (n))

(2)IO内存访问

在内核中访问IO内存(通常是芯片内部的各个I2C,SPI, USB等控制器的寄存器或者外部内存总线上的设备)之前,需首先使用ioremap()函数将设备所处的物理地址映射到虚拟地址上。

//将物理地址映射为虚拟地址
void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
void __iomem *devm_ioremap(struct device *dev, resource_size_t offset,
         unsigned long size)
      
//申请IO内存并进行重映射(将物理地址映射为虚拟地址)
//它对devm_request_mem_region()和devm_ioremap()进行了封装,内部会调用这两个函数  
void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res)

//对设备内存映射的虚拟地址进行读写
//读8bit , 16bit, 32bit
#define readb(c)         ({ u8  __v = readb_relaxed(c); __iormb(); __v; })
#define readw(c)         ({ u16__v = readw_relaxed(c); __iormb(); __v; })
#define readl(c)        ({ u32 __v = readl_relaxed(c); __iormb(); __v; })
//写8bit , 16bit, 32bit
#define writeb(v,c)         ({ __iowmb(); writeb_relaxed(v,c); })
#define writew(v,c)         ({ __iowmb(); writew_relaxed(v,c); })
#define writel(v,c)         ({ __iowmb(); writel_relaxed(v,c); })

驱动访问IO内存流程

  1. 调用request_mem_region()申请I/O内存资源。
  2. 将设备寄存器的物理地址通过ioremap()映射到内核空间的虚拟地址。
  3. 通过readb/writeb等接口访问设备的寄存器。
  4. 访问完成后,调用iounmap()函数对ioremap()映射的虚拟地址解除映射,并调用release_mem_region()函数释放申请的I/O内存资源。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: (1)I/O接口是指计算机系统中,负责主机和外部设备之间数据传输的一种硬件电路。I/O的基本功能包括输入、输出和中断处理。按数据传送方式分,I/O接口有串行接口和并行接口两种类型。 (2)串行接口和并行接口的特点如下: - 串行接口:数据是通过一根线按位依次传输的,传输速率相对较慢,但可以使用较长的传输线路。典型的串行接口包括串口和USB接口。 - 并行接口:数据是通过多根线同时传输的,传输速率相对较快,但受限于传输距离和线路数量。典型的并行接口包括并口和PCI总线。 (3)CPU进行设备的寻址时,可以通过两种方式进行: - 内存映射方式:将I/O端口映射到内存地址空间,CPU通过访问内存地址来访问I/O端口。这种方式简单易用,但需要占用大量的地址空间。 - I/O端口编址方式:将I/O端口单独编址,CPU通过向I/O端口地址发送读写命令来访问I/O端口。这种方式节省地址空间,但需要进行额外的编址操作。 I/O端口编址方式有两种: - 独立编址方式:将I/O端口单独编址,需要使用专门的I/O指令进行访问。 - 内存映射I/O方式:将I/O端口映射到内存地址空间中,可以使用与读写内存相同的指令进行访问。 (4)程序查询I/O方式是一种简单的I/O操作方式。其工作原理是程序周期性地轮询每个设备是否有数据需要传输,如果有则进行传输。这种方式简单易用,但需要程序占用大量的时间和CPU资源进行轮询,效率较低。 ### 回答2: (1) I/O接口是计算机与外部设备进行数据交换的接口。它是计算机系统的重要组成部分,用于连接CPU和各种输入输出设备。I/O的基本功能包括输入和输出。输入是指将外部设备的数据输入到计算机系统中,输出是指将计算机系统的数据输出到外部设备中。按数据传送方式分,有并行接口和串行接口两种类型。 (2) 串行接口的特点是一次传送一个bit的数据,传输速度较慢,但可以通过使用调制解调器来扩展传输距离。并行接口的特点是可以同时传送多个bit的数据,传输速度快,但传输距离较短,且不易扩展。 (3) CPU通过设备号进行设备的寻址。设备号是一个唯一标识符,用于指示特定外部设备。I/O端口的编址方式有两种:内存映射I/O和端口映射I/O。内存映射I/O方式将设备和内存地址空间中的某一地址关联起来,通过读写该地址来进行设备的读写操作;端口映射I/O方式则将设备和一个特定的端口地址关联起来,通过读写该端口地址来进行设备的读写操作。 (4) 程序查询I/O方式是一种简单的I/O控制方式,其工作原理是通过程序不断地查询外部设备的状态,然后根据设备的状态来进行相应的操作。当程序发起I/O操作时,会先查询设备的状态,如果设备就绪,则进行数据传送,否则继续进行查询,直到设备就绪为止。这种方式的特点是简单易实现,但效率相对较低,会占用较多的CPU时间。 ### 回答3: (1)I/O接口是计算机与外部设备之间进行数据传输的接口。I/O的基本功能包括输入(从外部设备读取数据)、输出(向外部设备发送数据)和控制(控制设备的工作状态)三个方面。按数据传送方式分为串行接口和并行接口两种类型。 (2)串行接口是一种数据传送方式,它通过单一的传输线逐位地传输数据。串行接口的特点是传输速度相对较慢,但占用的引脚少,适合用于远程传输和长距离传输。并行接口是另一种数据传送方式,它同时通过多条传输线同时传送数据的每一位。并行接口的特点是传输速度相对较快,但占用的引脚多,适合用于短距离传输和数据传输量较大的情况。 (3)CPU通过设备地址来进行设备的寻址。当CPU需要与某个设备进行通信时,它会给该设备分配一个独立的地址,通过这个地址来访问设备的寄存器或者缓冲区。I/O端口的编址方式有两种:内存映射和端口映射。内存映射是将I/O设备的地址空间与内存地址空间合并,I/O设备的寄存器和缓冲区与内存单元使用相同的地址。端口映射则是为I/O设备专门分配一段地址空间,与内存地址空间分开,CPU可以使用特殊的指令读写端口地址。 (4)程序查询I/O方式是一种简单的I/O处理方式,其工作原理是通过不断轮询I/O设备的状态来判断是否有数据需要读取或写入。CPU不断地查询I/O设备的状态,当发现设备有数据需要读取或写入时,就进行相应的数据传输操作。这种方式的优点是实现简单,适用于少量设备和数据传输量较小的场景。缺点是CPU不断查询设备的状态会占用大量的处理器时间,效率较低,且存在设备响应时间不一致的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值