9

私は小さな組み込みシステムに取り組んでいます。Linuxがユーザースペースで起動すると、物理メモリのどこにデバイスがあるかがわかります。それらをユーザースペースの仮想アドレスにマッピングしたいと思います。現在、私はカーネルモジュールを介してそれを行っています。vmalloc / kmalloc(サイズによって異なります)を使用してから、返された仮想アドレスでioremap_page_rangeを使用して、物理アドレスをマップします。私はそれが正しい方法だとは思いません。まず、メモリを割り当ててから、カーネルにその仮想アドレス空間を別の物理アドレス空間に再マップするように依頼しています。(vmcall /kmallocで最初にマップされたphysical->virtualは、これらの物理ページを気にしないので、ちょっと役に立たないです。これは間違いなく良くありません。)

これの代わりに、既知の物理メモリをユーザースペースプロセスにマッピングするためのより良い方法があります。(ユーザースペースプロセス以外は、誰もそのメモリに触れないことを知っています。)

ありがとう

4

3 に答える 3

6

あなたがやろうとしているのは、いわゆるIOメモリにアクセスすることです。Linuxデバイスドライバー(LDD)の本、より具体的には第9章を読むことをお勧めします。

そのようなエリアを「割り当てる」には、電話する必要があります

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name)

。ドライバーがアクセスする前に、仮想アドレスを割り当てる必要があります。これは、

void *ioremap(unsigned long phys_addr, unsigned long size)

ドライバーがさまざまなアーキテクチャ/プラットフォームで動作するようにするには、そのような領域(ioread8/16/32またはiowrite8/16/32とそれらのすべてのバリアント)へのアクセサー関数を必ず使用してください。

于 2012-07-25T06:45:43.050 に答える
4

カーネルモジュールでremap_pfn_range()は、物理アドレスを仮想アドレスに変換するために使用できます。次のリンクが役立ちます。

remap_pfn_rangeはどのようにカーネルメモリをユーザースペースに再マップしますか?

于 2012-07-24T05:22:38.270 に答える
0

カーネルモジュールでは、remap_pfn_range()を使用して物理アドレスを仮想アドレスに変換できます。実際のデバイスがない場合は、1)仮想デバイスを作成し、2)それらの仮想デバイスにmmapを使用して、そのプロセスのremap_pfn_range仮想マッピングを介してまったく同じカーネルメモリにアクセスできます。3)通常、専用環境では、プロセスから削除されないように、これらの物理ページを固定することもできます。4)これらの物理アドレスも異なるプロセスと共有しますが、各プロセスが異なるアドレスとして表示されるように、他のIPCメカニズムを介して独立して同期を処理する必要があります。

于 2015-05-14T07:22:17.987 に答える