DMAコントローラによるRAMメモリへのアクセス方法は?

私はフラッシュメモリからRAMにデータをコピーしたい。 では、どのようにDMAコントローラのRAMのデスティネーションメモリアドレスを設定して、そのチャネルを使ってソースアドレス(フラッシュメモリ内)からRAMメモリにデータをコピーすることができますか?

私はx86アーチでそれをやっていて、それは8237 DMAです。

4
カーネルがない限り、それを管理するのはカーネルOSです。
追加された 著者 m0skit0,
これはどんなデバイスですか?これはUSBまたはSATAのフラッシュメモリですか?
追加された 著者 David Schwartz,
恐らくDMAコントローラーの手の届かないところにあるかもしれません。とにかく使用しても意味がありません。DMAは、転送中にプロセッサが何か他のことを行うことができる場合にのみ有効です。
追加された 著者 Hans Passant,
カーネルモード: DMA 。それ以外の場合はOSに依存します。
追加された 著者 Powerslave,
David: - Ita SDDのフラッシュメモリ。そこからデータ(カーネルイメージ)をコピーしてRAMに入れなければなりません。私はいくつかの専門家を読んだが、cudntはmem-to-memコピーを行う方法について多くの情報を得ている(特に宛先アドレスを設定する。m0skit0 - 私はこの操作をブートローダで行い、今はブートローダー自体がカーネルをコピーしているのでフラッシュからRAMへのイメージ。
追加された 著者 user1083212,
@ Hans - プロセッサは、カーネルイメージの転送が行われている間、安全なブートのためにrootfsイメージの署名をチェックします。このページにアクセスしてください - : elinux.org/DMA_Copy_Of_Kernel_On_Startup DMAでRAMを制御する方法はありますか?
追加された 著者 user1083212,

1 答え

8237 DMAコントローラは、RAMからRAMへ、I/OからRAMへ、RAMからI/Oデバイスへの転送を行うことができます。

最大64KBのデータのみをコピーできることを考慮する必要があります。 64KB以上をコピーする場合は、複数の転送操作が必要です。

IBM PCと同じ環境を使用していて、宛先メモリーのセグメント・アドレスを別個のラッチに設定できると仮定すると、次のことが必要になります。

  1. Normalize your destination address segment:offset so that offset is lower than 16. Normalization is carried this way (DIV is integer division, MOD is modulus):

    normalized_segment = segment + offset DIV 16

    normalized_offset = offset MOD 16

  2. Load the segment value into the high order bits latch belonging to the channel you want to use (the page address register)

  3. Load the offset address into the Start Address Register of the DMA channel you want to use.
  4. Continue with DMA setup (transfer length, mode, interrupt on EOC, etc)
1
追加された