【发布时间】:2025-11-22 15:45:02
【问题描述】:
当诸如 c 程序可执行文件 a.out 之类的进程正在运行时,RAM 中应该存在哪些程序元素?程序代码也在那里吗?如果是的话,它的需求是什么?
【问题讨论】:
-
This link 解释的很好
标签: c linux unix operating-system
当诸如 c 程序可执行文件 a.out 之类的进程正在运行时,RAM 中应该存在哪些程序元素?程序代码也在那里吗?如果是的话,它的需求是什么?
【问题讨论】:
标签: c linux unix operating-system
是的,当 a.out 运行时,代码 a.out 存在于内存中。指令指针(或寄存器)指向内存中正在执行的当前操作,并且大多数操作也会使指令指针前进到下一个操作。但是,如果您所说的代码是指原始 C 代码,情况并非总是如此——只有组装后的可执行字节码必须在内存中。编译器/链接器有一些标志可以将 C 代码包含在汇编的输出可执行文件中,以使调试更容易。
如果我们谈论的是进程的虚拟内存空间,这还将包括一些内存映射的 io 寄存器、一些内核空间函数以及程序所需的任何库(至少 libc 用于您的一般类型操作)。
【讨论】:
原则上,机器代码在进程的地址空间内,并且经常在 RAM 中。但是,在某些情况下机器代码还没有在 RAM 中,内核必须从磁盘加载它。由于virtual memory,这是透明地发生的。具体来说,execve(2) 系统调用为ELF 可执行二进制文件中的各个段设置内存映射,就像mmap(2) 所做的那样(它是系统调用,使用munmap 和mprotect 来更改内存映射) .
查看进程1234的/proc/1234/maps了解更多,或者干脆运行
cat /proc/self/maps
获取运行cat的进程的内存映射。
【讨论】:
Is program code also there?
是的,您的程序代码也将在 RAM 中
实际上任何 c 程序在内存中都有 main 3 段
* Data Segment
* Code Segment
* Stack and Heap areas
您的代码进入代码段。
【讨论】: