linux系统调用机制的质疑

linux系统调用机制的质疑,linux,x86,system-calls,Linux,X86,System Calls,我们使用“int”或新的“syscall/syscenter”指令从ring3传输到ring0。这是否意味着需要为内核修改的页表和其他内容由“int”指令自动完成,或者“int 0x80”的中断处理程序将完成所需内容并跳转到相应的系统调用 另外,当从系统调用返回时,我们还需要转到用户空间。为此,我们需要知道用户空间中的指令地址以继续用户应用程序。那个地址存储在哪里。“ret”指令是否会自动将环从环3更改为环0,或者此环更改机制在何处/如何发生 然后,我读到从ring3更改为ring0的成本并没有

我们使用“int”或新的“syscall/syscenter”指令从ring3传输到ring0。这是否意味着需要为内核修改的页表和其他内容由“int”指令自动完成,或者“int 0x80”的中断处理程序将完成所需内容并跳转到相应的系统调用

另外,当从系统调用返回时,我们还需要转到用户空间。为此,我们需要知道用户空间中的指令地址以继续用户应用程序。那个地址存储在哪里。“ret”指令是否会自动将环从环3更改为环0,或者此环更改机制在何处/如何发生

然后,我读到从ring3更改为ring0的成本并没有从ring0更改为ring3的成本高。为什么会这样

谢谢,
Bala

切换到内核模式时,页表不会更改-虚拟地址空间的内核部分仅被标记为仅在ring0中可访问,因此它只是变得可访问。内核在更改当前进程时会更改页表

int 0x80
指令由陷阱门提供服务,陷阱门为处理器提供作为CS:EIP对跳转到的地址。新的CS(代码段选择器)包括CPL(当前特权级别)0,这会影响到向ring0的转换

由于从ring3到ring0的转换,处理器还从TSS(任务序列选择器)中为SS:ESP拾取新值,并将旧值保存在TSS中。这将从用户模式堆栈切换到内核堆栈

然后将前面的CS:EIP推送到内核堆栈上(这是用户空间中的返回地址)。由于
int 0x80
指令本身,所有这些都是由处理器完成的

IRET
指令可用于返回用户空间-它从内核堆栈弹出CS:EIP。由于CS包含一个3的CPL,处理器将切换回ring3,从而使其也切换回ring3堆栈。

本文:应回答您的大部分问题。