2012-08-10 143 views
6

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

+0

什么是你的问题的情况下?你在问一个特定的CPU或一般的特定CPU机制吗?你想解决一个问题吗? – 2012-08-10 17:55:19

回答

11

一个用户空间应用程序可以明确地启动开关在正常运行期间到内核模式的唯一方法是通过进行系统调用,如openreadwrite

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

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

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

+2

不完全。在x86上,任何来自用户模式的异常都将在内核模式下将控制权交给操作系统中的相应异常处理程序。 – 2012-08-10 17:53:57

+0

是的。只要我发布我的答案,我想编辑它,反映当用户应用程序要显式切换到内核模式时。但是,由于网络问题,我努力做到这一点。现在编辑它来反映这一点。 – 2012-08-10 18:15:14

+0

@ArnrnathRevanna在为SWI服务时,操作系统如何知道它实际上已切换到内核模式?是否有一个特定的硬件寄存器/位跟踪模式作为管理员(响铃0)/用户(响铃3)并在SWI上更新?基本上,在硬件级别将交换机断言为用户内核模式。 – Shyam 2015-11-03 22:59:10

0

我只是通过这个阅读,这是一个非常好的资源。它解释了用户模式和内核模式,为什么发生变化,它们有多昂贵,并给出了一些有趣的相关阅读。

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

下面是一个简短摘录:

内核模式

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

用户模式

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

1

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

如果你只是想看看底下发生了什么,去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)  
相关问题