系统相关
首页 > 系统相关> > Linux 3/1虚拟地址拆分

Linux 3/1虚拟地址拆分

作者:互联网

在了解highmem需要超过1GB的RAM时,我遗漏了一些东西.有人能指出我哪里出错吗?谢谢!

我知道的:

> 1 GB的进程虚拟内存(高内存区域)保留用于内核操作.用户空间可以使用剩余的3 GB.这是3/1分裂.
> VM的虚拟内存功能将(连续)虚拟内存页面映射到物理页面(RAM).

我不知道的是:

>哪些操作使用内核虚拟内存?我想像内核空间中的kmalloc(…)这样的东西会使用内核虚拟内存.
>我认为在这个方案下可以使用4GB的RAM.我不明白为什么内核1 GB虚拟空间是解决物理空间时的限制因素.这是我理解失败的地方.请指教.

我一直在读这篇文章(http://kerneltrap.org/node/2450),这很棒.但它并不能完全解决我的问题.

解决方法:

内核虚拟空间是可用物理内存限制因素的原因是因为内核需要访问所有物理内存,而它访问物理内存的方式是通过内核虚拟地址.内核不使用允许直接访问物理内存位置的特殊指令 – 它必须为要与之通信的任何物理范围设置页表条目.

在“旧式”方案中,内核进行设置,以便每个进程的页表直接将0xC0000000到0xFFFFFFFF的虚拟地址映射到从0x00000000到0x3FFFFFFF的物理地址(这些页面被标记为只能在环0 – 内核中访问它们模式).这些是“内核虚拟地址”.在这种方案下,内核可以直接读写任何物理内存位置,而无需使用MMU来改变映射.

在HIGHMEM方案下,从内核虚拟地址到物理地址的映射不是固定的 – 物理内存的一部分被映射到内核虚拟地址空间内外,因为内核需要访问该内存.这允许使用更多的物理内存,但代价是必须不断地改变虚拟到物理映射,这是非常昂贵的操作.

标签:linux,linux-kernel,virtual-memory
来源: https://codeday.me/bug/20190927/1822969.html