如何从用户模式切换到内核模式?

时间:2012-08-10 16:44:58

标签: linux-kernel

我正在学习Linux内核,但我不明白如何在linux中从用户模式切换到内核模式。它是如何工作的? 你能给我一些建议或给我一些链接来引用它或一些关于这个的书吗? 非常感谢!

3 个答案:

答案 0 :(得分:11)

用户空间应用程序在正常操作期间显式启动切换到内核模式的唯一方法是进行系统调用,例如openreadwrite等。

每当用户应用程序使用适当的参数调用这些系统调用API时,都会触发软件中断/异常(SWI)。

作为该SWI的结果,代码执行的控制从用户应用程序跳转到OS提供的中断向量表[IVT]中的预定义位置。

此IVT包含SWI异常处理程序例程的地址,该例程执行将用户应用程序切换到内核模式并代表用户进程开始执行内核指令所需的所有必要步骤。

答案 1 :(得分:2)

要从用户模式切换到内核模式,您需要执行系统调用。

如果您只想查看内幕消息,请转到TLDP is your new friend并查看代码(有详细记录,无需其他知识即可了解汇编代码)。

您感兴趣的是:

  movl    $len,%edx           # third argument: message length
  movl    $msg,%ecx           # second argument: pointer to message to write
  movl    $1,%ebx             # first argument: file handle (stdout)
  movl    $4,%eax             # system call number (sys_write)
  int     $0x80               # call kernel

正如您所看到的,系统调用只是汇编代码的包装器,执行中断(0x80),因此将调用此系统调用的处理程序。

让我们作弊并在这里使用C预处理器来构建可执行文件(foo.S是一个文件,您可以从下面的链接中放置代码):

gcc -o foo -nostdlib foo.S

通过strace运行它以确保我们能得到我们写的东西:

$ strace -t ./foo 
09:38:28 execve("./foo", ["./foo"], 0x7ffeb5b771d8 /* 57 vars */) = 0
09:38:28 stat(NULL, Hello, world!
 NULL)               = 14
09:38:28 write(0, NULL, 14)      

答案 2 :(得分:0)

我刚读过这篇文章,这是一个非常好的资源。它解释了用户模式和内核模式,为什么会发生变化,它们有多贵,并提供一些有趣的相关阅读。

http://www.codinghorror.com/blog/2008/01/understanding-user-and-kernel-mode.html

这是一段简短的摘录:

内核模式

在内核模式下,执行代码对底层硬件具有完全且不受限制的访问权限。它可以执行任何CPU指令并引用任何内存地址。内核模式通常保留给操作系统的最低级别,最受信任的功能。内核模式下的崩溃是灾难性的;他们将停止整个PC。

用户模式

在用户模式下,执行代码无法直接访问硬件或参考内存。以用户模式运行的代码必须委托给系统API才能访问硬件或内存。由于这种隔离所提供的保护,用户模式下的崩溃始终是可恢复的。您计算机上运行的大多数代码都将以用户模式执行。