3

我正在编写一段代码,该代码需要在 SOC 关闭之前存储位于特定物理地址的 10k 内存。

我的问题是这个物理地址不是内核空间的一部分,所以我必须创建一个临时内存映射,这样我才能访问这个内存空间。

我尝试使用 io-remap 但它(显然)不适用于非内核空间。

是否有任何 API 可以做到这一点?我应该使用 kmap 吗?

提前致谢

4

2 回答 2

2

听起来像内存映射外围设备。为了紧密绑定到您的内核中,它会在 initdata 中添加条目,该条目会转到 iotable_init()。例如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 回答