CPU从用户模式切换到内核模式:它究竟做了什么?它是如何实现这种转变的?

时间:2010-03-19 16:59:55

标签: assembly operating-system computer-architecture

CPU 从用户模式切换到内核模式:它到底是做什么用的?它是如何实现这种转变的?

修改

即使它依赖于架构,请给我一个答案。该架构取决于您。告诉我你所了解的架构。

我想知道所有事情将涉及到什么。

4 个答案:

答案 0 :(得分:29)

注意:这主要与x86架构有关。这是一个有点简化的解释。

转换通常由以下原因之一引起:

  • 错误(例如页面错误或执行指令导致的其他异常)
  • 中断(例如键盘中断或I / O完成)
  • 陷阱(例如系统调用)

通常发生的是系统检查中断描述符表(IDT)。每个异常(中断,故障等)都有一个与之关联的数字,用于索引此表。

从该表中,CPU可以确定要运行的中断处理程序。

作为转换的一部分,以下更改(通常)生效:

  • 切换到内核堆栈
  • 保存EFLAGS
  • 保存代码段选择器和EIP。
  • 堆栈段选择器和堆栈指针已保存
  • 开始执行中断处理程序
  • 保存通用寄存器(处理程序的工作)
  • 段选择器更改为内核选择器(处理程序的作业)

您现在处于内核模式。

希望有所帮助:)

答案 1 :(得分:4)

这是系统依赖的,但通常的机制是一些用户态操作导致软件中断。该中断使处理器切换模式并跳转到内核代码,然后内核代码检查程序尝试执行的操作(系统调用?),然后执行请求的操作并跳转回用户模式代码。除了软件中断之外的其他机制也可能导致转换;例如,在抢占式多任务系统中,定时器中断可能会触发调度程序运行。

答案 2 :(得分:3)

我的理解是,任何段寄存器具有两个LSB为零的程序将以内核模式运行,而其段寄存器具有两个LSB = 1的任何程序将在用户模式下运行。实际上,段rgeisters的两个LSB定义了Priviledge Level(0最高到3最低)

因此,要使prgram在内核模式下运行,您必须将段寄存器设置为0010 hex(我相信)。我不确定如何在不重写其他内容的情况下将程序放在该内存空间中 - 换句话说,链接器如何确保? 此外,如果要从用户模式代码调用内核模式代码,则必须弄清楚如何传递参数 - 它们不使用相同的内存空间,因此无法通过内存引用传递数据。我想你必须把它传递给寄存器。

如果任何人都能填补上述空白,我将非常感激。

答案 3 :(得分:1)

在Windows中,当您进行系统调用时,库例程会调用驻留在操作系统地址空间中的内核入口点。它通过执行特定于此目的的指令(例如 sysenter )将CPU带入管理程序模式。它的作用主要是在标志寄存器中设置一个位。这使操作系统能够使用特权指令。