C Linux中的内存布局-system()行为
我在Slackware 14(32位)上编译了以下示例程序: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(".
// 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加载可执行文件的方式有关。不要指望它们总是一样的