Operating system 内核代码与用户代码

Operating system 内核代码与用户代码,operating-system,kernel,system-calls,Operating System,Kernel,System Calls,这是书中的一段 执行内核代码时,系统处于内核空间execut中- 运行常规进程时,系统在用户空间中执行 在用户模式下 现在真正的内核代码和用户代码是什么。有人能举例说明吗 假设我有一个应用程序现在执行printf(“HelloWorld”),在执行这个应用程序时,它是用户代码还是内核代码 我猜在某个时候,用户代码将切换到内核模式,内核代码将接管,但我猜情况并非总是如此,因为我遇到了这个问题 例如,open()库函数除了调用open()系统调用外,几乎不做任何工作。 还有其他C库函数,如strcp

这是书中的一段

执行内核代码时,系统处于内核空间execut中- 运行常规进程时,系统在用户空间中执行 在用户模式下

现在真正的内核代码和用户代码是什么。有人能举例说明吗

假设我有一个应用程序现在执行printf(“HelloWorld”),在执行这个应用程序时,它是用户代码还是内核代码

我猜在某个时候,用户代码将切换到内核模式,内核代码将接管,但我猜情况并非总是如此,因为我遇到了这个问题

例如,open()库函数除了调用open()系统调用外,几乎不做任何工作。 还有其他C库函数,如strcpy(),应该(希望)不直接使用 根本不需要内核

如果它没有使用内核,那么它是如何使一切工作的呢


有人能清楚地解释一下整个事情吗

内核代码和用户代码之间并没有太大区别,代码就是代码。只是在内核模式下执行的代码(内核代码)可以(并且确实)包含仅在内核模式下可执行的指令。在用户模式下,此类指令无法执行(出于可靠性和安全性原因,不允许执行),它们通常会导致异常并导致进程终止

I/O,特别是对于RAM以外的外部设备,通常由操作系统以某种方式执行,系统调用是获取执行I/O的代码的入口点。因此,
open()
printf()
使用系统调用在内核中某个地方的I/O设备驱动程序中执行该代码。通用操作系统的全部目的是向用户或程序员隐藏硬件的差异,因此您不需要知道或考虑访问这种网卡或那种显示器或磁盘

内存访问,OTOH,大多数情况下都可以在没有操作系统干预的情况下进行。strcpy()的工作原理是:读取一个字节的内存,写入一个字节的内存,哦,是零字节吗?如果不是,重复,如果是,停止


我说“大部分时间”是因为经常会涉及页面转换和虚拟内存,内存访问可能会导致切换到内核,因此内核可以将磁盘中的内容加载到内存中,并让导致切换的访问指令继续。

还有一件事,我如何进行系统调用,假设我的program.c文件有printf(“helloWorld”);现在printf的实现会让系统调用我吗?i、 e printf将有一个实现:open();dothis()和所有系统调用?查看实现
printf()
的标准库的源代码。如果没有源代码,请查看反汇编。在x86上,系统调用输入有两个常见选项:
int
指令和
sysenter
syscall
指令。printf的源代码通常非常密集,并且由于
stdio
缓冲,通常不会直接包含系统调用。最好看看
write
@nneonneo的代码,这是很有可能的。