如何通过DMA控制器访问RAM内存?

时间:2012-02-06 09:20:13

标签: x86 dma

我想将数据从闪存复制到RAM。 那么如何在DMA控制器中设置RAM的目标存储器地址,以便它可以使用其通道将数据从源地址(在闪存中)复制到RAM存储器。

我是在x86 arch上做的,它是一个8237 DMA。

1 个答案:

答案 0 :(得分:1)

8237 DMA控制器能够从RAM传输到RAM,从I / O传输到RAM,从RAM传输到I / O设备。

您必须考虑到您只能复制最多64KB的数据。如果要复制超过64KB,则需要多次传输操作。

假设您使用的是IBM PC所具有的相同环境,并且您可以在单独的锁存器中设置目标内存的段地址,则需要:

  1. 规范化目标地址段:offset以使偏移量低于16。 以这种方式进行归一化(DIV是整数除法,MOD是模数):

    normalized_segment = segment + offset DIV 16

    normalized_offset = offset MOD 16

  2. 将段值加载到属于您要使用的通道的高位位锁存器(页面地址寄存器)

  3. 将偏移地址加载到要使用的DMA通道的起始地址寄存器中。
  4. 继续进行DMA设置(传输长度,模式,EOC中断等)