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

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

Solutions Collecting From Web of "为什么内核需要虚拟寻址?"

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

内存的“保留”更多的是“确定地址是内核还是用户空间”的简单方法。 在地址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的图形驱动程序仅仅为内核模块提供了几兆字节。 内核还使用一些内存来存储“内核数据”,比如内核必须处理的任务,队列,信号量,文件和其他“内容”。 几兆字节也用于这个。

虚拟内存管理是Linux的一项功能,它可以在不受任何限制的情况下实现系统中的多任务处理。 的任务或每个任务使用的内存量。 Linux内存管理器子系统(与MMU硬件一起)便于VMM支持,其中通过虚拟地址访问内存或内存映射设备。 在Linux内部,除了处理真实的硬件外,内核和用户组件都与虚拟地址一起工作。 这就是内存管理器取代它的地方,虚拟到物理地址转换并指向物理内存/开发位置。

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

  • 用户空间视图 – 包含进程使用的用户程序部分(代码,数据,堆栈,堆等)
  • 内核空间视图 – 包含维护有关进程的信息(PID。States,FD,Resource Usage等)的内核数据结构

    在这里输入图像说明

Linux系统中的每个进程都有一个唯一的独立用户空间区域。 Linux VMM的这一特性将每个进程程序部分与其他进程隔离开来。 但是系统中的所有进程共享共同的内核空间区域。 当进程需要来自内核的服务时,它必须执行该区域的内核代码,或者换句话说,内核正在代表用户进程请求执行。