我正在编写一段代码,该代码需要在 SOC 关闭之前存储位于特定物理地址的 10k 内存。
我的问题是这个物理地址不是内核空间的一部分,所以我必须创建一个临时内存映射,这样我才能访问这个内存空间。
我尝试使用 io-remap 但它(显然)不适用于非内核空间。
是否有任何 API 可以做到这一点?我应该使用 kmap 吗?
提前致谢
我正在编写一段代码,该代码需要在 SOC 关闭之前存储位于特定物理地址的 10k 内存。
我的问题是这个物理地址不是内核空间的一部分,所以我必须创建一个临时内存映射,这样我才能访问这个内存空间。
我尝试使用 io-remap 但它(显然)不适用于非内核空间。
是否有任何 API 可以做到这一点?我应该使用 kmap 吗?
提前致谢
听起来像内存映射外围设备。为了紧密绑定到您的内核中,它会在 initdata 中添加条目,该条目会转到 iotable_init()。例如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);