内存映射I / O与编程I / O之间的区别

时间:2017-01-03 07:12:02

标签: computer-science cpu-architecture

在通过计算机体系结构时,我学习了不同的控制I / O设备的方法,

  1. 程序化I / O
  2. 中断I / O
  3. DMA
  4. 我学会了所有三种方法  但我遇到另一个术语内存映射I / O

    程序I / O和内存映射I / O 之间是否有任何关系?
    我对这两个很困惑。它们相似吗?

3 个答案:

答案 0 :(得分:4)

这些术语大多是独立的,而不是相互排斥的 下面我将使用伪汇编代码使示例更清晰,它是一个演示代码,而不是真正的代码。

如何访问设备?

如果设备可在专用地址空间中访问,与地址空间或内存分开,那么IO的类型称为端口映射IO 隔离IO

如果设备可作为唯一地址空间的一部分访问,而内存也位于其中,则IO的类型称为内存映射IO

例如,某些嵌入式控制器和一些主流架构有访问IO地址空间的特殊指令。

in r0, 0x34          #Read address 0x34 from IO address space
ld r0, 0x34          #Read address 0x34 from memory address space

在上面的示例中,两个地址0x34生成两个不同的总线地址,然后以不同方式处理。
请注意,ld类型的指令与用于访问内存的指令相同,因此例如ld r1, 0x1000可以访问内存而不是设备。

如何从设备中读取数据?

这也适用于将数据写入设备。

如果软件被强制显式读取每个字节/数据字,则IO的类型为编程IO

如果可以告诉设备启动操作并自动将数据传输到存储器,则IO的类型为直接存储器访问IO

例如,从磁盘可以

读取一个扇区,比如512字节
#Setup read parameters omitted

movi r0, $0x20      #r0 = 0x20 (say it's READ_SECTORS command)
out 0x102, r0       #Tell the device to start reading

movi r1, 512 / 4    #r1 = number of words in a sector
_read:
 in r0, 0x103        #Read a word (32-bit)
 ...
 decbnz r1, _read        #Decrement r1 and branch back if not zero

使用DMA,可以执行相同的读取

#Setup read parameters omitted

movi r0, $0x21      #r0 = 0x21 (say it's READ_DMA_SECTORS command)
out 0x102, r0       #Tell the device to start reading

#Done, the software can do something else

如何收到有关事件的通知?

操作的完成和新数据的到达是软件可能想要通知的事件的两个示例。

如果设备使用中断向CPU通知事件,则IO的类型为中断驱动IO

如果设备只有一个软件必须定期检查的状态寄存器,则IO的类型为轮询IO

例如,要检查UART是否有新数据,软件可以使用中断

#Setup isr
la r0, myISR
call setup_isr

#Example of device configuration

in r0, 0x100
or r0, 0x80
out 0x100, r0        #Set bit7 to enable generation of interrupt

#Done, myISR is called whenever new data arrives

如果IO正在轮询,则软件必须定期检查

_check_data:
 in r0, 0x102              #Say 102 is a status resister
 btbz r0, 7, _check_data   #Test if bit7 of r0 is set, if not jump back

 #New data is available

因此,例如,IO可以是内存映射的DMA中断驱动的IO 这实际上是PCI(e)设备通常在x86架构上使用的。

有关端口映射DMA中断驱动IO (读取样本时)和端口映射编程轮询IO (向DSP发出命令时)的实际示例,你可以check my answer about programming the sound-card to playback a wave file

答案 1 :(得分:1)

有两种不同的寻址I / O设备的方法。 1.隔离I / O. - 它将有I / O操作的特殊指令。 - 与内存相比,I / O设备在单独的域中处理。 - 内存应用程序允许总共1mb的地址空间。 - 为了最大化I / O操作(隔离),总是提供单独的指令来执行这些操作。 - 缺点之一是数据传输仅发生在I / O端口和AL,AX寄存器之间。

2.Memory映射I / O. - 在这个汇编语言程序中可以寻址I / O设备。 - I / O设备仅作为内存的一部分。 - 不能使用完整的1mb内存,因为它们是内存的一部分。 - 在内存映射I / O操作的情况下,不需要外部单独的指令。 - 在存储器映射指令的情况下存在数据传输限制。 - 内存映射I / O的优点在于它使指令集保持较小。

答案 2 :(得分:0)

编程I / O是一种读/写I / O设备的方法,其中CPU使用特殊程序(驱动程序)来执行这些操作。假设CPU需要从I / O设备读取。 CPU发出读取请求并定期轮询接口以获取数据。这种方法非常慢,因此引入了中断和DMA。

内存映射I / O是一种CPU和I / O设备共享相同地址空间的技术。您可以将其视为扩展RAM(您有常规RAM和额外RAM以容纳I / O设备),这两者都映射到一个虚拟地址空间。现在CPU不需要任何特殊指令来访问I / O设备。地址在物理RAM范围内的加载指令将从物理RAM加载,地址在I / O分配范围内的加载指令将从I / O设备加载。