我们可以通过结构页面结构访问内存吗?
注意:该页面属于高内存,尚未映射到内核逻辑地址空间。
答案 0 :(得分:4)
是的,我们可以通过struct page的虚拟字段访问属于highmem的页面。但是在您的情况下,您无法访问,因为您提到highmem页面未映射到内核虚拟内存。
要访问它,您需要创建永久或临时映射的映射。 通过kmap创建永久映射地图页面。
void *kmap(struct page *page)
此功能适用于高或低内存。如果页面结构属于低内存中的页面,则只返回页面的虚拟地址。如果页面驻留在高内存中,则会创建永久映射并返回地址。函数可能会休眠,因此kmap()仅在进程上下文中起作用。因为永久映射的数量是有限的(如果不是,我们不会在这个混乱中并且可以永久地映射所有内存),高内存应该在不再需要时取消映射。这是通过以下函数完成的,该函数取消映射给定的页:
void kunmap(struct page *page)
可以通过以下方式创建临时映射:
void *kmap_atomic(struct page *page, enum km_type type)
这是一个原子函数,因此您无法休眠,可以在中断上下文中调用。它被称为临时的,因为下一次调用kmap_atomic将覆盖先前的映射。
答案 1 :(得分:0)
如果虚拟字段没有值,则无法访问该特定物理帧。原因很简单,struct page表示物理地址和虚拟地址之间的映射,因此具有大内存的系统无法映射内核空间中的所有内存。如此高的内存动态映射。但要访问该内存,应该映射,即void * virtual不应为NULL。