这是书中的一段
执行内核代码时,系统处于内核空间执行中 - 在内核模式下运行常规进程时,系统处于用户空间执行状态 在用户模式下。
现在真正的内核代码和用户代码。有人可以用例子来解释吗?
假设我现在有一个printf("HelloWorld")
的应用程序,在执行此应用程序时,它将是用户代码或内核代码。
我想在某个时间点,用户代码将切换到内核模式,内核代码将接管,但我想情况并非总是如此,因为我遇到了这个
例如,open()库函数除了调用open()系统调用外几乎没有。 还有其他C库函数,例如strcpy(),应该(人们希望)不能直接使用 内核完全没有。
如果它没有使用内核,那么它如何使一切工作?
有人可以用清醒的方式解释整件事。
答案 0 :(得分:5)
内核和用户代码之间没有太大区别,代码就是代码。只是在内核模式(内核代码)中执行的代码可以(并且确实)包含仅在内核模式下可执行的指令。在用户模式下,这些指令无法执行(出于可靠性和安全性原因不允许执行),它们通常会导致异常并导致进程终止。
I / O,尤其是RAM以外的外部设备,通常由OS以某种方式执行,系统调用是获取执行I / O的代码的入口点。因此,open()
和printf()
使用系统调用在内核中的某个I / O设备驱动程序中运行该代码。通用操作系统的重点是隐藏您,用户或程序员,硬件的差异,因此您不需要知道或考虑访问这种网卡或那种显示器或磁盘。
内存访问,OTOH,大部分时间都可以在没有操作系统干预的情况下发生。并且strcpy()
按原样工作:读取一个字节的内存,写一个字节的内存,哦,它是一个零字节,顺便说一下?如果没有重复,请停止,如果是的话。
我说“大部分时间”因为经常涉及页面翻译和虚拟内存而内存访问可能会导致切换到内核,因此内核可以将某些内容从磁盘加载到内存中并让访问指令导致开关继续。