2012-02-06 3 views
4

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

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

+0

これは、デバイスのどのような?これはUSBまたはSATAのフラッシュメモリですか? –

+0

カーネルがない限り、それを管理する必要があるのはカーネルOSです。 – m0skit0

+0

David: - Ita SDDのフラッシュメモリで、どこからデータ(カーネルイメージ)をコピーしてRAMに入れなければならないのですか? 私はいくつかの試行錯誤を読んだが、mem-to-memコピーを行う方法(特に宛先アドレスを設定する方法)について多くの情報を得ている。 m0skit0 - 私はこの操作をブートローダでやっているが、今のところブートローダ自体はないフラッシュからRAMへのカーネルイメージのコピー – user1083212

答えて

1

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

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

  1. があなたの目的地を正規化:に

    あなたはIBM PCが持っているのと同じ環境を使用していると仮定すると、あなたは別のラッチの宛先メモリのセグメントアドレスを設定することができます、あなたが必要となりますアドレスセグメント:オフセットするようにオフセット(DIVは整数除算であり、MODは、弾性率である)このように実施される16 正規化よりも低い。

    normalized_segment = segment + offset DIV 16

    normalized_offset = offset MOD 16

  2. あなたは(ページアドレスレジスタ)を使用したいチャンネルに属するラッチ上位ビットにセグメント値をロード

  3. あなたがしたいDMAチャンネルのアドレスレジスタスタートへのオフセットアドレスをロードしますつかいます。
  4. (EOCなどに中断し、転送長、モード)DMAセットアップを続行