gpt4 book ai didi

computer-science - 内存映射的IO和编程的I/O之间的区别

转载 作者:行者123 更新时间:2023-12-04 18:29:20 24 4
gpt4 key购买 nike

在研究计算机体系结构时,我了解了控制I/O设备的不同方法,这些方法包括:

  • 编程的I/O
  • 中断I/O
  • DMA

  • 我学习了这三种方法。
    但是我遇到了另一个术语 内存映射的I/O

    程序化I/O与 内存映射的I/O 有什么关系?
    我对这两个感到困惑。它们相似吗?

    最佳答案

    这些术语大部分是独立的,而不是相互排斥的。
    下面,我将使用伪汇编代码来使示例更清楚,它是说明性代码,而不是实际代码。

    如何访问设备?

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

    如果设备可以作为唯一地址空间(也可以在其中放置内存)的一部分进行访问,则IO的类型称为内存映射的IO

    例如,某些嵌入式 Controller 和某些主流体系结构具有访问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事件,则IOt的类型为 中断驱动的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

    关于computer-science - 内存映射的IO和编程的I/O之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41438223/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com