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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

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

提问于
用户回答回答于

虚拟内存管理是Linux的一项功能,它可以在系统中实现多任务处理,而无需对任何数量进行限制。的任务或每个任务使用的内存量。Linux内存管理器子系统(以及MMU硬件)有助于VMM支持,其中通过虚拟地址访问内存或内存映射设备。在Linux内部,除了处理真实的硬件外,内核和用户组件都可以使用虚拟地址。这是内存管理器取代它的位置,执行虚拟到物理地址转换并指向物理内存/开发位置的时间。

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

  • 用户空间视图 - 包含进程使用的用户程序部分(代码,数据,堆栈,堆等)
  • 内核空间视图 - 包含维护有关进程信息(PID,状态,FD,资源使用等)的内核数据结构

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

用户回答回答于

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

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

当然,kerneln只占用实际使用的物理内存 - 所以普遍认为“为内核占用整个千兆字节是一种浪费”是错误的 - 内核本身是少数(十几个所以对于一个非常“大”的内核)兆字节。加载的模块可以轻松地添加多达几兆字节,ATI和nVidia的图形驱动程序仅需要为内核模块提供几兆字节。内核还使用一些内存来存储内核数据,比如内核必须处理的任务,队列,信号量,文件和其他“内容”。几兆字节也用于此。

扫码关注云+社区