繁体   English   中英

将特定虚拟地址映射到特定物理地址

[英]map specifc virtual address to a specific physical one

我正在编写一个Linux内核模块,需要将特定的物理地址映射到特定的虚拟地址,而我却找不到办法。

好的,这是我目前的解决方案。 要将phys_addr映射到virt_addr我使用以下代码:

page = pfn_to_page(virt_addr >> PAGE_SHIFT);
pte = get_locked_pte(&init_mm, phys_addr, &ptl);
set_pte_at(&init_mm, phys_addr, pte, mk_pte(page, VM_READ | VM_WRITE | VM_EXEC));
spin_unlock(ptl);
flush_tlb_all();

一些explenations:我使用pfn_to_page函数来获取与virt_addr对应的页面结构。 我得到的页表项( pte用) get_locked_pte FUNC这就需要对应所需的物理地址pte和未初始化的自旋锁( ptl )。 然后,我实际上使用set_pte_at func和mk_pte宏映射页面,解锁自旋锁并刷新tlb缓存。

这个解决方案似乎工作得很好,尽管它不能在上下文切换中存活。

你能告诉我们你正在使用的内核版本和CPU架构/类型吗? 一般来说,如果要映射到的特定虚拟地址与内核虚拟地址(例如0xC0000000)不重叠,并且如果设备使用的物理地址与系统内存物理地址范围不重叠,则可以使用低级函数(如果没有,您可以使用汇编语言在内核启动期间直接设置MMU TLB条目)来设置MMU TLB条目,以在内核启动期间将特定地址映射到特定的虚拟地址。 我可以提供一个基于2.6.10内核版本和Freescale PowerPC CPU的示例,有一个函数io_block_mapping来做你想要的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM