我使用kmap
来获取页面的逻辑地址,但我对高内存有点混淆。如果页面处于高内存状态,kmap
会返回什么?一个来源说逻辑地址,另一个 - 页面描述符的线性地址。
目标是直接访问物理页面'通过将vma地址转换为某些页面的线性内核空间地址来实现内容。
答案 0 :(得分:1)
kmap始终返回一个寻址所需页面的虚拟地址。如果页面已经可访问 - 即它已经有一个有效的内核虚拟地址(因为,例如,它在FIXADDR区域中,因此已经映射) - 那么该地址就会返回给您。如果它位于highmem区域,则建立临时虚拟地址映射并返回内存的有效虚拟地址。
你的最后一句引用的转换有点含糊不清,但是因为你有一个" struct page"我假设你的意思是一个来自vm_struct描述的映射的页面? (" vma"有些超载)
在任何情况下,假设您的真正目的只是获取一个地址,您可以通过该地址直接"修改并检查任意物理内存中的指定位置,如果您已经有一个'结构页面,kmap应该适合您。
答案 1 :(得分:0)
根据定义,内核逻辑地址(也称为线性地址)是内核空间中的虚拟地址,可以通过减去固定的偏移量转换为物理地址。
内核地址空间的范围是一个固定的编译时间参数,所以如果虚拟地址空间从3G-4G(比方说)运行,那么低内存可以从3G-OFFSET运行到4G-OFFSET。超出此范围的页面是高内存。因此,高内存页面不能有内核逻辑地址。
kmap()创建高内存页面到内核地址空间的映射,并返回一个虚拟地址,可以访问该虚拟地址以获取高mem页面的内容。