![x64系统中的kmap和page_address有什么区别?](https://linux22.com/image/206120/x64%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84kmap%E5%92%8Cpage_address%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
kmap()
允许您将页面映射到内核或模块中的函数可以访问的某个地址。同时page_address()
还允许您检索访问该页面的地址。
它说这kmap()
是用来处理 highmem 问题,但作为这问题已解释,highmem 在 x64 系统中不再是问题。
*p
我已经尝试过,如果您从进程(即用户空间页面)获取页面结构,则使用kmap(p)
和page_address(p)
执行几乎相同的操作。
他们之间有什么区别?
答案1
在 x86-64 上,没有实际差异;当给定一个非 highmem 页面时,kmap
代表page_address
:
if (!PageHighMem(page))
addr = page_address(page);
然而,这两个函数确实有两个不同的目的:page_address
返回页面的地址,如果有一个;kmap
确保页面在返回其地址之前被映射,并且应该通过调用来平衡kunmap
。