我们可以通过 struct page 结构访问内存吗

Can we access memory through a struct page structure

我们可以通过struct page结构访问内存吗?

注:该页属于高端内存,尚未映射到内核逻辑地址space。

如果虚拟字段没有值,则您无法访问该特定物理帧。原因很简单,struct page表示物理地址和虚拟地址之间的映射,因此具有大内存的系统无法映射内核中的所有内存space。所以高端内存是动态映射的。但要访问该内存,它应该被映射,即 void *virtual 不应该为 NULL。

是的,我们可以通过struct page 的virtual 字段访问属于highmem 的页面。但是在您的情况下,您无法访问,因为您提到 highmem 页面未映射到内核虚拟内存中。

要访问它,您需要创建永久映射或临时映射。 通过kmap创建永久映射地图页面。

 void *kmap(struct page *page)

此函数适用于高内存或低内存。如果页面结构属于低内存中的页面,则简单地返回页面的虚拟地址。如果页面驻留在高端内存中,则会创建永久映射并且地址为 returned.The 函数可能会休眠,因此 kmap() 仅在进程上下文中工作。因为永久映射的数量是有限的(如果没有,我们就不会陷入困境,可以永久映射所有内存),当不再通过以下函数完成 needed.This 时,应该取消映射高端内存,取消映射给定页面:

void kunmap(struct page *page)

可以通过以下方式创建临时映射:

void *kmap_atomic(struct page *page, enum km_type type)

这是一个原子函数,所以你不能睡觉,可以在中断上下文中调用。它被称为临时的,因为下一次调用 kmap_atomic 将覆盖以前的映射。