我正在编写一段代码,需要在SOC关闭之前存储位于特定物理地址的10k内存。
我的问题是这个物理地址不是内核空间的一部分所以我必须创建一个ad -hoc内存映射,这样我才能访问这个内存空间。
我尝试使用io-remap,但它(显然)不在非内核空间上工作。
有没有这样做的API? 我应该用kmap吗?
提前致谢
答案 0 :(得分:2)
听起来像内存映射外设。为了紧密绑定到你的内核,它会在initdata中添加一个条目,转到iotable_init()。例如arch / arm / mach-vexpress / ct-ca9x4.c ct_ca9x4_io_desc []。这会创建虚拟到物理映射。然后内核代码可以使用带有虚拟地址的writel来编写。
答案 1 :(得分: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);