SOC がシャットダウンする前に、特定の物理アドレスにある 10k のメモリを保存する必要があるコードを書いています。
私の問題は、この物理アドレスがカーネル空間の一部ではないため、このメモリ空間にアクセスできるようにアドホック メモリ マッピングを作成する必要があることです。
io-remap を使用してみましたが、(明らかに) 非カーネル空間では機能しません。
これを行うための API はありますか? kmap を使用する必要がありますか?
前もって感謝します
SOC がシャットダウンする前に、特定の物理アドレスにある 10k のメモリを保存する必要があるコードを書いています。
私の問題は、この物理アドレスがカーネル空間の一部ではないため、このメモリ空間にアクセスできるようにアドホック メモリ マッピングを作成する必要があることです。
io-remap を使用してみましたが、(明らかに) 非カーネル空間では機能しません。
これを行うための API はありますか? kmap を使用する必要がありますか?
前もって感謝します
メモリマップされた周辺機器のように聞こえます。カーネルに緊密にバインドするには、iotable_init() に移動する initdata にエントリを追加します。たとえば、arch/arm/mach-vexpress/ct-ca9x4.c ct_ca9x4_io_desc[]。これにより、仮想から物理へのマッピングが作成されます。次に、カーネルコードは仮想アドレスで writel を使用してそこに書き込むことができます。
答えを見つけた
重要なのは、特定のページ テーブルのマッピングを作成する 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);