c - RAM 内存中的段

标签 c linux linux-kernel x86

<分区>

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

  1. RAM被划分为User space和Kernel space;这个内存划分是O/S做的还是H/W(CPU)做的。

  2. 内核空间的内容是什么,据我了解只有内核镜像,如有错误请指正。

  3. 这段代码、数据、堆栈和堆段存在于何处?

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

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

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

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

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

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

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

最佳答案

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

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

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

    阅读有关 protected modereal mode'rings' 的信息。

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

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

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

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

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

关于c - RAM 内存中的段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19877445/

相关文章:

c - Linux | C 中的 Shell 实现 |输入重定向不显示

sql - 在 shell 脚本中运行选择时 DB2 服务器连接丢失

linux - 编译linux内核时如何解决这个错误

c - 在Linux的net/ipv4/udp.c中,为什么UDP数据包需要通过xfrm4_policy_check()来处理?

ios - HQ2x 图像放大会产生损坏的 PNG

c - 格式字符串利用,如何检索保存的指令指针?

c - 结构填充和包装

c - 我如何将结构指针数组中的结构直接复制到c中的另一个结构

java - Linux:使用 Java 读取 xwd 输出?

c - 如何识别用户空间和内核空间之间的特定套接字?