有人告诉我如果我使用rsp
作为通用寄存器,操作系统可能会在发生中断时将寄存器转储到它指向的位置,从而导致出现问题的行为。
这是真的吗?如果不是的话,如果我不需要堆栈,我可以使用rsp
作为通用寄存器?
编辑:在用户空间中运行。
如果发生中断,你不会被搞砸吗?
那些曾经在 DOS 中编程过的人此时可能会对中断的可能性感到不安。通常,像这样重用堆栈指针是一个非常糟糕的主意,因为您不知道中断何时会发生,而当发生中断时,CPU 会尽职尽责地将当前程序计数器和标志推送到堆栈上。如果您重复使用了 ESP,这将导致随机数据结构被丢弃。在这种环境中,ESP 必须始终指向有效且足够的堆栈空间来服务中断,只要这不成立,就必须禁用中断。长时间禁用中断的情况下运行会降低系统响应能力(丢失中断和糟糕的延迟),并且对于大型例程来说并不实用。
然而,我们在这里运行在保护模式下。
当在 Win32 的用户空间中运行时,中断不会推送到用户堆栈上,而是推送到内核堆栈上。你想一想,用户栈是不可能用的。如果线程超出堆栈空间,或者甚至只是有一个无效堆栈,当 CPU 尝试推送 EIP 和 EFLAGS 时,就会出现页面错误,并且您无法在中断处理程序中出现页面错误。因此,调度程序可以在无堆栈例程运行时执行任意数量的上下文切换,并且指向 ESP 的任何数据结构都不会受到影响。
From http://www.virtualdub.org/blog/pivot/entry.php?id=85
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)