在Linux中,每个进程都有其虚拟地址空间(例如,32位系统为4GB,其中3GB为进程保留,1GB为内核保留)。这种虚拟寻址机制有助于隔离每个进程的地址空间。对于流程来说这是可以理解的,因为有很多流程。但既然我们只有 1 个内核,那么为什么我们需要内核虚拟寻址呢?
内核是“虚拟”的原因并不是要处理分页,而是因为处理器一次只能以一种模式运行。因此,一旦打开分页内存映射(x86 上 CR0 中的位 31),处理器就会期望所有内存访问都通过页映射机制。因此,由于我们确实想要访问内核,即使我们启用了分页(虚拟内存),因此它需要存在于虚拟空间中的某个位置。
内存的“保留”更多的是“确定地址是内核还是用户空间的简单方法”而不是其他任何东西。完全有可能将一小部分内核放在地址 12345-34121 处,将另一部分内核放在 101900-102400 处,将其他部分内核放在 40000000-40001000 处。但这会让内核和用户空间的各个方面都变得困难——会有间隙/漏洞需要处理[已经有这样的漏洞/漏洞,但拥有更多并不会完全有帮助]。通过为“用户空间是从这里到这里,内核是从用户空间末端到X”设置固定限制,它使这方面的工作变得更加容易。我们只能说kernel = 0; if (address > max_userspace) kernel=1;
在某些代码中。
当然,内核只占用它实际使用的物理内存 - 因此“为内核占用一整千兆字节是一种浪费”的普遍想法是错误的 - 内核本身是几个(十几个或所以对于一个非常“大”的内核)兆字节。加载的模块可以轻松地增加几兆字节,而来自 ATI 和 nVidia 的图形驱动程序可以轻松地增加几兆字节,仅用于内核模块本身。内核还使用一些内存来存储“内核数据”,例如任务、队列、信号量、文件和内核必须处理的其他“东西”。为此也使用了几兆字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)