当控制权返回给它时,操作系统是否会假设被调用者保存的寄存器?
我想知道操作系统,比如Windows,是否假设有关被调用者保存的寄存器,如ebp, esi, edi
?
换句话说,操作系统是否需要保留这些寄存器中的值,当控制权转移回ret
时main
}?
我找不到任何指定的东西,但我猜答案是否定的(看过编译器生成的代码)。是否有关于该主题的文档?
答案 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对应用程序很重要,因此它可以清理自己的资源(关闭文件等)。操作系统并不在乎。如果应用程序没有自行清理,操作系统将为它完成工作 比崩溃更糟糕的是一个“挂起”的东西。一。如果应用程序陷入无限循环,或者更糟糕的是无限循环不断声称拥有越来越多的资源,那么系统可以很容易地陷入困境。