CPU从用户模式切换到内核模式:它到底有什么作用?它是如何实现这一转变的?
-
21-09-2019 - |
题
中央处理器 从用户模式切换到内核模式:它到底有什么作用?它是如何实现这一转变的?
编辑:
即使它依赖于架构,也请给我一个答案。架构由您决定。告诉我你所知道的架构。
我想了解其中涉及的所有事情。
解决方案
笔记:这主要与 x86 架构相关。这是一个稍微简化的解释。
这种转变通常是由以下原因之一引起的:
- 故障(例如执行指令引起的页面错误或其他异常)
- 中断(例如键盘中断或 I/O 完成)
- 陷阱(例如系统调用)
通常发生的情况是系统检查中断描述符表(IDT)。每个异常(中断、故障等)都有一个与之关联的编号,用于索引该表。
从该表中,CPU 可以确定要运行的中断处理程序。
作为过渡的一部分,以下更改(通常)会生效:
- 切换到内核堆栈
- EFLAGS 已保存
- 代码段选择器和EIP被保存。
- 保存堆栈段选择器和堆栈指针
- 开始执行中断处理程序
- 保存通用寄存器(处理程序的工作)
- 段选择器更改为内核选择器(处理程序的工作)
您现在处于内核模式。
希望有帮助:)
其他提示
这是依赖于系统的,但通常的机构是一些用户态操作导致软件中断。这使得中断处理器切换模式,并跳入内核代码,然后检查什么程序正在试图做的(系统调用?),然后做请求的操作并跳转回给用户模式代码。除了软件中断可能会导致过渡以及其他机制;例如在一个抢先多任务系统中,定时器中断可能会触发调度来运行。
我理解的是任何其程序段寄存器有两个LSB为零将在内核模式下运行,而任何程序,其段寄存器有两个LSB = 1将在用户模式下运行。事实上,该段rgeisters的两个LSB定义特权级别(0最高至3最低)
因此,为了在内核模式下运行prgram您必须设置段寄存器是0010十六进制(我相信)。我不知道如何在不覆盖别的内存空间放置一个程序 - 换句话说,如何链接器确保? 另外,如果你想调用从用户模式代码的内核模式的代码,你必须弄清楚如何传递参数 - 他们没有使用相同的内存soace,所以无法通过内存引用传递数据。我想你必须把它在寄存器中传递。
如果anynody可以在上述填补空白,我将不胜感激。
在Windows中,当你做一个系统调用,库调用程序驻留在操作系统地址空间中的内核入口点。它反过来通过执行一个指令特定用于此目的的占用CPU进入管理程序模式,如 SYSENTER 。它的作用主要是在设置标志位寄存器。这使得OS使用特权指令。