【问题标题】:Memory layout in Linux - system() behaviourLinux 中的内存布局 - system() 行为
【发布时间】:2013-12-01 16:17:36
【问题描述】:

我在 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 主函数的堆栈帧应该分配在 p1 主函数的堆栈帧之上。怎么了?

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

【问题讨论】:

    标签: c linux memory layout system-calls


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2013-07-12
      • 2020-11-01
      • 2016-12-15
      • 1970-01-01
      • 2011-09-29
      • 2018-08-26
      • 1970-01-01
      相关资源
      最近更新 更多