【问题标题】:Kernel Code vs User Code内核代码与用户代码
【发布时间】:2012-10-04 03:51:51
【问题描述】:

这是书中的一段

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

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

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

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

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

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

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

【问题讨论】:

    标签: operating-system kernel system-calls


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 还有一件事,我如何进行系统调用,比如说我的 program.c 文件有 printf("helloWorld");现在 printf 的实现是否让系统调用我?即 printf 将有实现: open() ; dothis() 和所有系统调用?
    • 查看实现printf()的标准库的源代码。如果没有源代码,看反汇编。在 x86 上,系统调用条目有 2 个常用选项:int 指令和 sysentersyscall 指令。
    • printf 的源代码通常非常密集,由于stdio 缓冲,通常不会直接包含系统调用。最好看一下write的代码。
    • @nneonneo 这很有可能。
    猜你喜欢
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多