4

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

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

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

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

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

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

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

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

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

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

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

4

1 回答 1

5

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

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

    从用户空间,不能直接访问内存(在实模式下),必须通过 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(跨内存连接)

于 2013-11-09T17:07:18.950 回答