为什么内核需要虚拟寻址?(why kernel needs virtual addressing?)

2019-08-08 09:21发布

在Linux中每个过程具有:(其中3GB被保留用于处理和1 GB内核例如4 GB在32位系统的情况下,)其虚拟地址空间。 这种虚拟寻址机制有助于隔离每个进程的地址空间。 因为有许多方法这是过程的情况下,可以理解的。 但由于我们有1个内核那么为什么我们需要虚拟寻址的内核​​?

Answer 1:

究其原因,核心是“虚拟”不处理分页,因此,它是监守处理器只能在一种模式下同时运行。 所以一旦你打开分页内存映射(位31 CR0在x86)处理器期待所有的内存访问都要经过页面映射机制。 所以,既然我们要访问,即使我们已经启用了分页(虚拟内存)的内核,它需要在虚拟空间的某个地方。

该内存的“预留”更多的是“简单的方法来确定一个地址为内核或用户空间”比什么都重要。 这将是完全有可能把内核的一点点在地址12345-34121,在101900-102400内核的另一位和内核在40000000-40001000一些其他位。 但是,如果过不去的内核和用户空间的每一个方面 - 会有差距/孔应对[目前已经有这样的孔/目瞪口呆,但有更多的将不完全是帮助的事情。 通过设定一个固定的限制“用户空间就是从这里到这里,内核是从用户空间的结束X”,它使生活在这方面要容易得多。 我们只能说kernel = 0; if (address > max_userspace) kernel=1; kernel = 0; if (address > max_userspace) kernel=1; 在一些代码。

当然,kerneln只需要尽可能多的物理内存,因为它会实际使用 - 从而使公共思说:“这是采取了对内核的整体技嘉浪费”是不正确的 - 内核本身是少数(一打所以一个很“大”的内核),兆字节。 来自ATI和nVidia装可以很容易地加起来几个兆字节的模块和图形驱动程序,轻松另一几兆只是为内核moduel对于本身。 内核还采用了一些内存位来存储“内核数据”,如任务,队列,信号,文件和其他“东西”的内核来处理。 几兆用于这一点。



Answer 2:

虚拟内存管理就是Linux的该功能使系统多任务处理不会对没有任何限制。 的任务或由每个任务所使用的存储器的量。 在Linux内存管理器子系统(与MMU硬件一起)有利于VMM支持,其中存储器或MEM-映射设备通过虚拟地址访问。 在Linux中的一切,内核和用户组件,可与虚拟地址与实际的硬件打交道时除外。 这时候,内存管理器需要它的地方,做虚拟到物理地址的转换,并指向物理MEM / dev的位置。

的方法是一个抽象的实体,通过内核中定义哪个系统资源,以便执行程序分配。 在Linux中过程管理内核是一个进程的内存映射的一个集成部分。 的方法有两个主要的区域,像一个硬币的两个面:

  • 用户空间视图 - 包含过程中使用的用户程序段(代码,数据,栈,堆等)
  • 内核空间视图 - 包含有关过程,保持信息的内核数据结构(PID美国,FD,资源使用,等等。)

在Linux系统中的每个进程都有一个独特的和独立的用户空间区域。 Linux的VMM的这个功能隔离一个和其他每一个进程程序部分。 但是系统中的所有进程共享的通用内核空间的地区。 当一个进程从内核需要服务它必须在该区域中执行内核代码,或者换句话说内核执行代表用户进程请求。



文章来源: why kernel needs virtual addressing?