在通过计算机体系结构时,我学习了不同的控制I / O设备的方法,
我学会了所有三种方法 但我遇到另一个术语内存映射I / O 。
程序I / O和内存映射I / O 之间是否有任何关系?
我对这两个很困惑。它们相似吗?
答案 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设备加载。