【问题标题】:What exactly happens when an OS goes into kernel mode?当操作系统进入内核模式时究竟会发生什么?
【发布时间】:2013-12-01 01:30:51
【问题描述】:

我发现我的教科书或谷歌搜索技能都没有给我这个问题的正确答案。我知道这取决于操作系统,但一般来说:会发生什么以及为什么?

我的教科书说系统调用会导致操作系统进入内核模式,因为它还没有出现。这是必需的,因为内核模式可以控制特定进程地址空间之外的 I/O 设备和其他事物。但如果我理解正确的话,切换到内核模式并不一定意味着进程上下文切换(您将进程的当前状态保存在 CPU 以外的其他位置,以便其他进程可以运行)。

这是为什么?我有点想,一些“管理员”进程被打开并处理来自进程的系统调用并将结果发送到进程的地址空间,但我想我错了。我似乎无法理解在内核模式的切换中实际发生了什么以及这如何影响进程在 I/O 设备上操作的能力。

非常感谢:)

编辑:额外问题:库调用是否一定会以系统调用结束?如果没有,您是否有任何不以系统调用结尾的库调用示例?如果是,我们为什么要调用库?

【问题讨论】:

    标签: operating-system kernel


    【解决方案1】:

    历史上,系统调用是通过中断发出的。 Linux 使用0x80 向量,Windows 使用0x2F 向量来访问系统调用,并将函数的索引存储在eax 寄存器中。最近,我们开始使用SYSENTERSYSEXIT 指令。用户应用程序在Ring3 或用户空间/用户模式下运行。 CPU 在这里非常很棘手,从内核模式切换到用户模式需要特别小心。它实际上涉及在发出名为iret 的特殊指令时欺骗CPU 以为它来自用户模式。从用户模式返回到内核模式的唯一方法是通过中断或已经提到的SYSENTER/EXIT 指令对。它们都使用称为TaskStateSegment 或简称TSS 的特殊结构。这些允许 CPU 找到内核堆栈的位置,所以是的,它本质上需要一个任务切换。

    但究竟会发生什么?
    当您发出系统调用时,CPU 会查找TSS,获取其esp0 值,这是内核的堆栈指针,并将其放入esp。 CPU然后在另一个特殊结构InterruptDescriptorTable或简称IDT中查找中断向量的索引,并找到一个地址。这个地址就是处理系统调用的函数所在的地方。 CPU 压入标志寄存器、代码段、用户堆栈和int 指令之后的下一条指令的指令指针。系统调用服务完成后,内核发出iret。然后 CPU 返回到用户模式,您的应用程序继续正常运行。

    所有库调用都以系统调用结尾吗?
    好吧,他们中的大多数人都会这样做,但也有一些人不会。例如看看memcpy 和其他的。

    【讨论】:

    • 非常感谢!很好的答案:) 但是为什么切换到内核模式比仅仅进行正常的进程上下文切换更耗时?两者不是做同样的事情吗:交换寄存器、调用堆栈等?
    • 因为需要使用 TSS 的硬件辅助任务切换。硬件切换不再更新,因此比软件任务切换慢很多。
    • 指向 TSS 的指针也在 GDT 中,因此它也需要更多的内存访问。
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2016-10-21
    • 2015-12-25
    相关资源
    最近更新 更多