3

SOC がシャットダウンする前に、特定の物理アドレスにある 10k のメモリを保存する必要があるコードを書いています。

私の問題は、この物理アドレスがカーネル空間の一部ではないため、このメモリ空間にアクセスできるようにアドホック メモリ マッピングを作成する必要があることです。

io-remap を使用してみましたが、(明らかに) 非カーネル空間では機能しません。

これを行うための API はありますか? kmap を使用する必要がありますか?

前もって感謝します

4

2 に答える 2

2

メモリマップされた周辺機器のように聞こえます。カーネルに緊密にバインドするには、iotable_init() に移動する initdata にエントリを追加します。たとえば、arch/arm/mach-vexpress/ct-ca9x4.c ct_ca9x4_io_desc[]。これにより、仮想から物理へのマッピングが作成されます。次に、カーネルコードは仮想アドレスで writel を使用してそこに書き込むことができます。

于 2012-11-27T17:24:01.983 に答える
1

答えを見つけた

重要なのは、特定のページ テーブルのマッピングを作成する vmap 関数を使用することです。問題は、ページテーブル構造を特定の物理アドレスに初期化する方法でしたが、そのための API も存在するようです

これは、単一のページを割り当てる例です

void *virt_addr_ptr
struct page **my_page = kmalloc(sizeof (*my_page), GFP_KERNEL);
my_page = phys_to_page(phys_addr_ptr);
virt_addr_ptr = vmap(my_page, 1, VM_MAP, PAGE_KERNEL);

/*now its possible to access this space */
memcpy(store_buffer, virt_addr_ptr, store_size);
于 2012-12-06T14:04:17.093 に答える