SYSCALL 后中断

问题描述 投票:0回答:1

SYSCALL指令不保存堆栈指针(RSP)。

现在考虑指令

mov rsp, -999
syscall
<interrupt>

由于

syscall
进入环0,中断将使用来自
rsp
的堆栈,这会弄乱内核。操作系统无法执行任何操作,因为它甚至还没有准备好执行任何操作。

文档还提到

SSP
看起来最有可能解决这个问题,但我不明白
RSP
之间的关系。

assembly x86-64 system-calls interrupt
1个回答
0
投票

这就是为什么

syscall
用 IA32_FMASK MSR 屏蔽 RFLAGS,所以在正常的操作系统中这会是一个问题,可以通过禁用中断来避免。 (但是 IF=0 不会停止 NMI;我不知道如何避免这个可能的问题。)

在内核设置 SS 之前能够屏蔽中断的必要性:当 AMD64 首次在纸上提出时,Linux 内核开发人员指出了 RSP,从而导致了当前的设计:http://web.archive.org/ web/20160303170152/http://www.x86-64.org/pipermail/discuss/2000-October/001019.html / http://web.archive.org/web/20160729112540/http://www. x86-64.org/pipermail/discuss/2000-October/001009.html

© www.soinside.com 2019 - 2024. All rights reserved.