我正在编写一段代码,需要在SOC关闭之前存储位于特定物理地址的10K内存。我的问题是这个物理地址不属于内核空间,所以我必须创建一个特定的内存映射才能访问这段内存空间。我尝试使用io-remap,但它似乎不能在非内核空间使用。是否有任何API可以解决这个问题?我应该使用kmap吗?感谢您提前的帮助。
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);
my_page = phys_to_page(phys_addr_ptr);
应该改为 *my_page = phys_to_page(phys_addr_ptr);
,因为 phys_to_page()
的返回值是一个 struct page *
。 - d4r3llo5
ioremap()
必须提供一个物理地址范围。请注意,如果没有虚拟或物理限定符,使用“memory”一词可能会产生歧义或混淆。也许您需要重新审视和分析为什么ioremap()
似乎没有“工作”。这里有另一个问答,涉及为内核驱动程序使用划分物理内存:https://dev59.com/N2jWa4cB1Zd3GeqPs61l#12557974 - sawdust