我正在尝试将当前正在运行的进程esp值复制到另一个进程esp,在另一个终端上运行。
我遇到了分段错误。
但我无法正确理解原因,因为我正在使用内联汇编。
p1.c
int main()
{
int a=5;
int b =8;
unsigned int esp =0;
asm("mov %%esp,%0":"=r"(esp)::);
printf("esp:[%x] \n",esp);
while(1);
}
P2.c
int main()
{
int a=5;
int espoth=0;
asm("mov 0xbfda8008,%%esp"::);
}
首先我运行p1.c
,它给了我0xbfda8008
当前堆栈指针。
然后我在p2.c
中使用了它,它给了我Segmentation fault
。
我只是在esp中写一个值。为什么我会遇到这个错误? 需要一点提示...; - (
答案 0 :(得分:0)
这不会按预期工作。每个进程的内存与其他进程隔离,每个进程看到的内存映射都是虚拟的。因此,即使两个进程都可能在同一地址可用内存,也并不意味着实际的物理内存是相同的。
这就是"现代"来自" old"的操作系统和硬件那些。您可以搜索" mmu","内存保护单元"和#34;虚拟内存"在你最喜欢的搜索引擎上。
如果玩好的旧MS-DOS,例如没有使用MMU(除非使用例如DOS4GW,GO32-V2的保护模式程序),你的想法会有效。