Memory management 我们可以通过结构页结构访问内存吗

Memory management 我们可以通过结构页结构访问内存吗,memory-management,linux-kernel,Memory Management,Linux Kernel,我们可以通过结构页结构访问内存吗 注意:该页属于高内存,尚未映射到内核逻辑地址空间。如果虚拟字段没有值,则无法访问该特定物理帧。原因很简单,struct page表示物理地址和虚拟地址之间的映射,因此具有大内存的系统无法映射内核空间中的所有内存。因此,高内存是动态映射的。但要访问该内存,应将其映射,即void*virtual不应为NULL。如果virtual字段没有值,则无法访问该特定物理帧。原因很简单,struct page表示物理地址和虚拟地址之间的映射,因此具有大内存的系统无法映射内核空间

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


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

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

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

是的,我们可以通过struct page的virtual字段访问属于highmem的页面。但在您的情况下,您无法访问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的调用将覆盖以前的映射。

是的,我们可以通过struct page的虚拟字段访问属于highmem的页面。但在您的情况下,您无法访问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将覆盖以前的映射。

plz详细说明通过结构页访问内存是什么意思?我的意思是当结构页结构的虚拟字段为空时。plz详细说明通过结构页访问内存是什么意思?我的意思是当结构页的虚拟字段为空时结构为空。