【问题标题】:Interrupt for a systemcall?中断系统调用?
【发布时间】:2021-09-19 03:39:29
【问题描述】:
大家好,只是想确认我正确理解了如何调用系统调用。
因此,如果程序需要访问内核功能,它会将系统调用号加载到寄存器中并调用软件中断(在 linux 0x80 中)。
然后 NVIC(或 AVIC)使处理器跳转到中断处理程序的开头并使 cpu 进入管理模式。
然后中断处理程序获取系统调用号并跳转到处理系统调用的内核代码。
最后程序回到原来的状态,继续运行。
【问题讨论】:
标签:
operating-system
kernel
cpu
system-calls
hardware
【解决方案1】:
它不能那样工作,因为中断向量也有权限位。如果用户模式进程可以触发一个中断向量跳转到内核模式,它就可以通过触发任何它喜欢的错误来破坏系统。
相反,在 32 位 x86 上,int 0x80 中断被授予用户模式权限,因此,当进程使用它时,一旦中断启动,它们仍处于用户模式。然后中断处理程序将使用sysenter 汇编指令跳转到内核模式。 sysenter 指令在从内核模式启动时跳转到寄存器集中指定的地址。
64 位 x86 的等价物是 syscall。实际上,在 x64 平台上,syscall 指令直接被 glibc 和 libstdc++ 使用。