【问题标题】:Program elements in main memory主存储器中的程序元素
【发布时间】:2025-11-22 15:45:02
【问题描述】:

当诸如 c 程序可执行文件 a.out 之类的进程正在运行时,RAM 中应该存在哪些程序元素?程序代码也在那里吗?如果是的话,它的需求是什么?

【问题讨论】:

标签: c linux unix operating-system


【解决方案1】:

是的,当 a.out 运行时,代码 a.out 存在于内存中。指令指针(或寄存器)指向内存中正在执行的当前操作,并且大多数操作也会使指令指针前进到下一个操作。但是,如果您所说的代码是指原始 C 代码,情况并非总是如此——只有组装后的可执行字节码必须在内存中。编译器/链接器有一些标志可以将 C 代码包含在汇编的输出可执行文件中,以使调试更容易。

如果我们谈论的是进程的虚拟内存空间,这还将包括一些内存映射的 io 寄存器、一些内核空间函数以及程序所需的任何库(至少 libc 用于您的一般类型操作)。

【讨论】:

    【解决方案2】:

    原则上,机器代码在进程的地址空间内,并且经常在 RAM 中。但是,在某些情况下机器代码还没有在 RAM 中,内核必须从磁盘加载它。由于virtual memory,这是透明地发生的。具体来说,execve(2) 系统调用为ELF 可执行二进制文件中的各个段设置内存映射,就像mmap(2) 所做的那样(它是系统调用,使用munmapmprotect 来更改内存映射) .

    查看进程1234的/proc/1234/maps了解更多,或者干脆运行

      cat /proc/self/maps
    

    获取运行cat的进程的内存映射。

    【讨论】:

    • 上面的命令做了什么,我应该对该输出做出什么解释
    • 试试那个命令:它显示了内存映射的文本表示(执行该命令的进程)。然后阅读我给你的其他链接。
    【解决方案3】:
    Is program code also there?
    

    是的,您的程序代码也将在 RAM 中

    实际上任何 c 程序在内存中都有 main 3 段

    * Data Segment
    * Code Segment
    * Stack and Heap areas
    

    您的代码进入代码段。

    This article

    【讨论】:

      最近更新 更多