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