【问题标题】:Doubts in System call mechanism in linuxlinux系统调用机制的疑惑
【发布时间】:2011-02-17 22:46:30
【问题描述】:

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

同样,当从系统调用返回时,我们需要再次进入用户空间。为此,我们需要知道用户空间中的指令地址才能继续用户应用程序。该地址存储在哪里。 'ret' 指令是否会自动将环从 ring3 更改为 ring0 或此环更改机制发生在哪里/如何发生?

然后,我了解到从 ring3 更改为 ring0 并不像从 ring0 更改为 ring3 那样昂贵。为什么会这样??

谢谢, 巴拉

【问题讨论】:

标签: linux x86 system-calls


【解决方案1】:

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

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

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

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

IRET 指令可用于返回用户空间 - 它从内核堆栈中弹出 CS:EIP。由于 CS 包含的 CPL 为 3,因此处理器正在切换回 ring3,这导致它也切换回 ring3 堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 2012-06-30
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2012-12-30
    • 2016-05-12
    • 2016-03-02
    相关资源
    最近更新 更多