用一个进程替换一个进程esp值,得到一个局部变量

时间:2016-02-23 06:55:03

标签: c linux assembly linux-kernel

我正在尝试将当前正在运行的进程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中写一个值。为什么我会遇到这个错误? 需要一点提示...; - (

1 个答案:

答案 0 :(得分:0)

这不会按预期工作。每个进程的内存与其他进程隔离,每个进程看到的内存映射都是虚拟的。因此,即使两个进程都可能在同一地址可用内存,也并不意味着实际的物理内存是相同的。

这就是"现代"来自" old"的操作系统和硬件那些。您可以搜索" mmu","内存保护单元"和#34;虚拟内存"在你最喜欢的搜索引擎上。

如果玩好的旧MS-DOS,例如没有使用MMU(除非使用例如DOS4GW,GO32-V2的保护模式程序),你的想法会有效。