内核代码与用户代码

Kra*_*ken 4 operating-system kernel system-calls

这是书中的一段

执行内核代码时,系统在内核模式下执行内核空间.运行常规进程时,系统在用户模式下执行用户空间.

现在真正的内核代码和用户代码.有人能解释一下吗?

假设我printf("HelloWorld")现在有一个应用程序,在执行此应用程序时,它将是用户代码或内核代码.

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

例如,open()库函数除了调用open()系统调用外几乎没有.还有其他C库函数,例如strcpy(),应该(人们希望)根本不直接使用内核.

如果它没有使用内核,那么它​​如何使一切工作?

有人可以用清醒的方式解释整件事.

Ale*_*nze 5

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

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

内存访问,OTOH,大部分时间都可以在没有操作系统干预的情况下发生.和strcpy()工作原理为:读一个字节的存储,写一个字节的存储,哦,是它一个零字节,顺便说一句?重复,如果不是,停止,如果它是.

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

  • `printf`的源代码通常非常密集,由于`stdio`缓冲,通常不会直接包含系统调用.最好看一下`write`的代码. (2认同)