c - Linux 中的内存布局 - system() 行为

标签 c linux memory layout system-calls

我在 Slackware 14(32 位)上编译了以下示例程序:

// p1.c
#include <stdio.h>
unsigned char *sp() { asm("movl %esp, %eax\n\taddl $8,  %eax"); }
int main(int argc, char **argv)
   {
   char *s1="1111111111";
   printf("p1:  s1=%p,  SP=%p\n", s1, sp());
   system("./p2.bin");
   printf("p1:  s1=%p,  SP=%p\n", s1, sp());
   }

// p2.c
#include <stdio.h>
unsigned char *sp() { asm("movl %esp, %eax\n\taddl $8,  %eax"); }
int main(int argc, char **argv)
   {
   char *s2="2222222222";
   printf("p2:  s2=%p,  SP=%p\n", s2, sp());
   }

ESP 打印值相同:
bash-4.2$ ./p1.bin
p1: s1=0x8048580, SP=0xbffff6b0
p2: s2=0x8048530, SP=0xbffff6b0
p1: s1=0x8048580, SP=0xbffff6b0
但是我期望不同的,因为 p2 main 函数的堆栈帧应该分配在 p1 main 函数的堆栈帧之上。怎么了?

另一个问题:
如果我修改 p2.c 以从 0x8048580 转储内存,我可以看到“2222222222”(现在地址为 0x80486f0),但在 0x8048580 看不到“1111111111”。为什么?
感谢您的帮助。

最佳答案

p2 是一个完全不同的过程。它不是“分配在 p1 之上”。即使地址相同,它们实际上指的是不同的物理内存位置。这一切都被虚拟内存和 CPU 的 MMU 隐藏了。

值相同的原因与 linux 加载可执行文件的方式有关。不要指望它们总是一样的。

关于c - Linux 中的内存布局 - system() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314278/

相关文章:

c - 在结构中使用字符串

android - 将仿真从 32 位更改为 64 位

javascript - 网页中的多个不同背景

c++ - gcc 和 clang 在使用无符号值左移时产生不同的输出

c - 检测何时写入内存地址

python - 为什么 Python "grouping"不适用于 C 中的正则表达式?

mysql - 在 Ubuntu 服务器内部使用 mysql_config_editor 连接 root 问题

c - 在 uint128_t 整数上下文中对十六进制字符串的操作

javascript - (dojo)Observable无法观察到Memory Store的变化

java - 我们可以使用硬盘空间作为jvm内存吗