RAM 内存中的段

use*_*122 4 c linux x86 linux-kernel

我对RAM内存中的段感到困惑,请澄清以下疑问

  1. RAM已经被划分为用户空间和内核空间;这个内存划分是由O/S完成还是由H/W(CPU)完成。

  2. 内核空间的内容是什么;据我所知,只有内核映像,如果我错了,请纠正我。

  3. 这段代码、数据、堆栈和堆段在哪里存在?

    a) 用户和内核空间是否有单独的代码、数据、堆栈和堆段?

    b) 该段是由 H/W 还是 (O/S) 创建的。

  4. 我可以找到内核空间和用户空间占用的内存量吗?

    a) 是否有任何 Linux 命令(或)系统调用可以找到它?

  5. 为什么RAM被划分为用户空间和内核空间?

    a) 我认为这样做是为了保护内核免受应用程序的攻击,是吗?这是唯一的原因。

我是初学者,所以请给我推荐一些好书、链接和处理这些概念的方法。

Sam*_*Sam 5

我接受了挑战并尝试了相当简短的答案:

  1. 执行发生在用户和内核空间。BIOS 和 CPU 支持操作系统检测和分离资源/地址范围,例如主内存和设备(->相关问题)以建立保护模式。在保护模式下,内存通过虚拟地址空间分隔,虚拟地址空间通过MMU(内存管理单元)按页面(通常为 4096 字节的块)映射到物理内存的真实地址。

    从用户空间,不能直接访问内存(在实模式下),必须通过 MMU 访问它,MMU 就像一个具有访问保护的透明代理。访问错误被称为分段错误、访问冲突、分段冲突 (SIGSEGV),在 Java 等高级编程语言中使用 NullPointerException (NPE) 进行抽象。

    阅读有关保护模式实模式“环”的信息

    注意:特殊 CPU,例如嵌入式系统,不一定有 MMU,因此可能仅限于特殊操作系统,例如µClinuxFreeRTOS

  2. 内核也会分配缓冲区,驱动程序也是如此(例如,用于磁盘、网络接口和 GPU 的 IO 缓冲区)。

  3. 通常,资源存在于每个空间和进程/线程
    a)内核将其自己的受保护堆栈放在用户空间堆栈(每个线程)的顶部,并且还有单独的代码(也是“文本”)、数据和堆段。此外,每个进程都有自己的资源。
    b) CPU 架构有一定的要求(取决于它们提供的支持程度),但最终是软件(用于接口的内核和用户空间库)创建了这些结构。

  4. 每个合理的操作系统都至少提供了一种方法来做到这一点。
    a)尝试sudo cat /proc/slabinfo或干脆sudo slabtop

  5. 阅读 1.
    a)主要是,就像用户空间进程彼此隔离一样,除了特殊技术,如CMA(跨内存连接)用于在较新的内核中快速直接访问。