当控制权返回给操作系统时,操作系统是否会假设被调用者保存的寄存器?

时间:2017-05-21 13:25:32

标签: windows assembly x86 operating-system

  

当控制权返回给它时,操作系统是否会假设被调用者保存的寄存器?

我想知道操作系统,比如Windows,是否假设有关被调用者保存的寄存器,如ebp, esi, edi

换句话说,操作系统是否需要保留这些寄存器中的值,当控制权转移回retmain}?

我找不到任何指定的东西,但我猜答案是否定的(看过编译器生成的代码)。是否有关于该主题的文档?

1 个答案:

答案 0 :(得分:1)

Windows 32旨在实现进程隔离 进程所做的任何 * 都不会导致另一个进程(包括)操作系统本身失败 因此,退出时对寄存器的操作无关紧要。

唯一的例外是esp。如果堆栈指针搞乱,您的应用程序将以堆栈错误或访问冲突终止 这仍然不会影响操作系统,但它只会稍微终止您的应用程序。

* 显然,这不包括合法系统调用对系统的影响,也不包括对漏洞的利用。

请注意ret中的main 会将控制权返回给操作系统。几乎所有Win32 c应用程序都包含一个运行时库。如果是这样,ret中的main将返回一些如下所示的初始化代码:

//pseudo-init

do set up (setup command line params for main to read).
call main;
call Windows.ExitProcess(); 

有一个'清洁'退出到Windows对应用程序很重要,因此它可以清理自己的资源(关闭文件等)。操作系统并不在乎。如果应用程序没有自行清理,操作系统将为它完成工作 比崩溃更糟糕的是一个“挂起”的东西。一。如果应用程序陷入无限循环,或者更糟糕的是无限循环不断声称拥有越来越多的资源,那么系统可以很容易地陷入困境。