首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么内核需要虚拟寻址?

为什么内核需要虚拟寻址?
EN

Stack Overflow用户
提问于 2013-01-27 03:23:01
回答 1查看 7.1K关注 0票数 22

在Linux中,每个进程都有自己的虚拟地址空间(例如,在32位系统中为4 GB,其中3 GB预留给进程,1 GB预留给内核)。这种虚拟寻址机制有助于隔离每个进程的地址空间。这在进程的情况下是可以理解的,因为有很多进程。但是,既然我们只有一个内核,那么为什么我们需要内核的虚拟寻址呢?

EN

回答 1

Stack Overflow用户

发布于 2013-01-27 04:00:39

内核“虚拟”的原因不是为了处理分页,而是因为处理器一次只能在一种模式下运行。因此,一旦打开分页内存映射(x86上CR0中的第31位),处理器就会期望所有内存访问都通过分页映射机制。因此,即使在启用分页(虚拟内存)之后,我们也希望访问内核,所以它需要存在于虚拟空间中的某个地方。

内存“保留”更多的是“确定一个地址是内核地址还是用户空间地址的简单方法”。将一点内核放在地址12345-34121,将另一位内核放在101900-102400,将其他一些内核放在40000000-40001000是完全可能的。但这将使内核和用户空间的各个方面的工作变得困难--会有一些漏洞/漏洞需要处理,已经有这样的漏洞/漏洞,但有更多的漏洞并不能完全解决问题。通过设置“用户空间是从这里到这里,内核是从用户空间的尽头到X”的固定限制,它在这方面使生活变得容易得多。我们可以只在一些代码中使用kernel = 0; if (address > max_userspace) kernel=1;

当然,内核只占用它实际使用的物理内存-所以“为内核占用整个千兆字节是一种浪费”的普遍想法是错误的-内核本身只有几兆字节(对于一个非常“大”的内核来说是十几兆字节)。加载的模块可以很容易地增加到几兆字节,而来自ATI和nVidia的图形驱动程序很容易为内核模块本身增加几兆字节。内核还使用内存的一些位来存储“内核数据”,如任务、队列、信号量、文件和内核必须处理的其他“东西”。这也使用了几兆字节。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14540656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档