5

这是书中的一段话

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

现在真正的内核代码和用户代码是什么。有人可以举例解释吗?

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

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

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

如果它不使用内核,那么它​​如何使一切正常工作?

有人可以用清晰的方式解释整个事情。

4

1 回答 1

5

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

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

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

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

于 2012-10-13T15:04:49.430 回答