次のアドレスを仮想アドレス空間に(m)マップしようとしています:
---物理アドレスは 0xf6c50 です --- このアドレスは、EBDA ベース ポインターと上位 Bios メモリ ウィンドウ (ACPI_HI_RSDP_WINDOW_BASE) の合計です。
目的は、ACPI テーブルをプロセスのアドレス空間にマップし、後で使用することです。
acpi_mem_fd = open("/dev/mem", O_RDONLY);
ファイル記述子を開いて「/dev/mem」を読み取ります。プリアドを使用してアドレスに到達し、ACPI ヘッダー構造を読み取ります。署名が一致したら、それを仮想アドレス空間にマップしたいのですが、そうするとエラーが発生しますのような:「メモリを割り当てることができません」
FreeBSD 8.x を使用しています。一般的に mmap が機能することを確認できます。エラーにつながる呼び出しは次のとおりです。
map->va = mmap(0, size, PROT_READ, MAP_PRIVATE, acpi_mem_fd, pa);
MAP_SHARED も使ってみましたが、どうもあまり変わりません。
ここで pa は、「ACPI_HI_RSDP_WINDOW_BASE」マクロによって定義された上記のアドレスです。誰でもこれに光を当てることができますか、またはこれを回避する方法はありますか?