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

C Linux中的内存布局-system()行为,c,linux,memory,layout,system-calls,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(".

我在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());
   }
//p1.c
#包括
无符号字符*sp(){asm(“movl%esp,%eax\n\taddl$8,%eax”);}
int main(int argc,字符**argv)
{
char*s1=“1111111”;
printf(“p1:s1=%p,SP=%p\n”,s1,SP());
系统(“/p2.bin”);
printf(“p1:s1=%p,SP=%p\n”,s1,SP());
}
//p2.c
#包括
无符号字符*sp(){asm(“movl%esp,%eax\n\taddl$8,%eax”);}
int main(int argc,字符**argv)
{
char*s2=“2222”;
printf(“p2:s2=%p,SP=%p\n”,s2,SP());
}
ESP打印值相同:
bash-4.2美元/p1.bin

p1:s1=0x8048580,SP=0xbfff6b0

p2:s2=0x8048530,SP=0xbfff6b0

p1:s1=0x8048580,SP=0xbfff6b0

但我预期的是不同的,因为p2主函数的堆栈帧应该分配在p1主函数的堆栈帧之上。怎么了

另一个问题:
如果我修改p2.c以从0x8048580转储内存,我可以看到“22222222”(现在位于addrress 0x80486f0),但在0x8048580处看不到“1111111”。为什么?

谢谢您的帮助。

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


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

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

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