23

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

4

2 回答 2

19

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

内存的“保留”更多的是“确定地址是内核空间还是用户空间的简单方法”,而不是其他任何东西。完全有可能在地址 12345-34121 放置一点内核,在 101900-102400 放置另一位内核,在 40000000-40001000 放置一些其他内核。但这会让内核和用户空间的每个方面都变得困难——会有差距/漏洞需要处理[已经有这样的漏洞/漏洞,但拥有更多不会完全有帮助]。通过为“用户空间从这里到这里,内核从用户空间的末端到 X”设置一个固定的限制,它在这方面让生活变得更加轻松。我们可以kernel = 0; if (address > max_userspace) kernel=1;在一些代码中说。

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

于 2013-01-26T20:00:39.240 回答
6

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

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

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

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

    在此处输入图像描述

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

于 2013-01-28T17:03:35.093 回答