我正在学习Linux内核,但我不明白如何在linux中从用户模式切换到内核模式.它是如何工作的?你能给我一些建议或给我一些链接来引用它或一些关于这个的书吗?非常感谢!
要从用户模式切换到内核模式,您需要执行系统调用。
如果你只是想看看幕后发生了什么,去TLDP 是你的新朋友,看看代码(它有很好的文档,不需要额外的知识来理解汇编代码)。
你对。。。感兴趣:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,系统调用只是汇编代码的包装器,它执行中断 (0x80),因此将调用此系统调用的处理程序。
让我们作弊一下,在这里使用 C 预处理器来构建一个可执行文件(foo.S 是一个文件,您可以在其中放置来自以下链接的代码):
gcc -o foo -nostdlib foo.S
Run Code Online (Sandbox Code Playgroud)
通过 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)
Run Code Online (Sandbox Code Playgroud)
我刚刚读过这篇文章,这是一个非常好的资源。它解释了用户模式和内核模式、为什么会发生变化、它们的成本有多大,并提供了一些有趣的相关阅读。
https://blog.codinghorror.com/understanding-user-and-kernel-mode
这是一个简短的摘录:
内核模式
在内核模式下,执行代码可以完全且不受限制地访问底层硬件。它可以执行任何CPU指令并引用任何内存地址。内核模式通常是为操作系统的最低级别、最受信任的功能保留的。内核模式下的崩溃是灾难性的;他们将停止整个电脑。
用户模式
在用户模式下,执行代码无法直接访问硬件或参考内存。在用户模式下运行的代码必须委托给系统 API 来访问硬件或内存。由于这种隔离提供的保护,用户模式下的崩溃总是可以恢复的。计算机上运行的大部分代码都将在用户模式下执行。