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

San*_*ora 20 linux linux-kernel

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

Mat*_*son 16

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

内存的"保留"更多地是"确定地址是内核还是用户空间的简单方法".将完整的内核放在地址12345-34121,内核的另一部分位于101900-102400以及其他一些内核位于40000000-40001000是完全可能的.但它会让内核和用户空间的每个方面都变得困难 - 会有间隙/漏洞需要处理[已经存在这样的漏洞/漏洞,但有更多不会对事情有所帮助].通过设置"用户空间从这里到此处,内核从用户空间结束到X"的固定限制,它在这方面使生活变得更加容易.我们可以kernel = 0; if (address > max_userspace) kernel=1;在一些代码中说.

当然,kerneln只占用实际使用的物理内存 - 因此普遍认为"内核占用整个GB是一种浪费"是错误的 - 内核本身就是一些(十几个或者所以对于一个非常"大"的内核)兆字节.加载的模块可以很容易地添加几个兆字节,而ATI和nVidia的图形驱动程序很容易只为内核模块提供另外几兆字节.内核还使用一些内存来存储"内核数据",例如任务,队列,信号量,文件和内核必须处理的其他"东西".此处也使用了几兆字节.


Pra*_*lix 6

虚拟内存管理是 Linux 的一个特性,它可以在系统中实现多任务处理,没有任何限制。任务或每个任务使用的内存量。Linux 内存管理器子系统(连同 MMU 硬件)促进了 VMM 支持,其中内存或内存映射设备通过虚拟地址访问。在 Linux 中,内核和用户组件都使用虚拟地址,除非处理真实硬件。那就是内存管理器取代它的位置,进行虚拟到物理地址转换并指向物理内存/开发位置。

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

  • 用户空间视图 - 包含进程使用的用户程序部分(代码、数据、堆栈、堆等...)

  • 内核空间视图 - 包含维护有关进程的信息(PID、状态、FD、资源使用等...)的内核数据结构

    在此处输入图片说明

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