当我在 Linux 中调用 printf 这样的函数时,虚拟内存中到底发生了什么?

当我在 Linux 中调用 printf 这样的函数时,虚拟内存中到底发生了什么?

我问的是像 printf 这样的函数,很多进程可能会使用这些函数,并且还需要内核的帮助来完成系统调用等功能。

所发生情况的详细步骤描述是什么?因为我对这方面有点困惑,所以我有以下问题:

  1. 内核中 printf 函数的指令是我们用户进程的一部分吗?当它尝试执行 printf 时,我们对同一用户进程中的内核位置执行 JMP,但我们进入内核模式?或者是否存在上下文切换并且内核进程执行此操作?

  2. 当所有执行 printf 等函数的进程在虚拟内存中调用 printf 时,它们是否映射到相同的物理内存位置?

  3. 总体来说,非内核进程使用内核部分虚拟内存的情况有哪些?

在此输入图像描述

答案1

  1. printf由C库实现,它不是内核的一部分。 (内核或多或少确实有其自己的等效项,但这不适用于用户进程。)因此用户进程调用printf不会立即调用内核。如果printf的输出被写入,则通过调用发生write,由内核处理(好吧,C 库中有一个小包装器,但它是最小的);进程调用相应的系统调用,并将控制权切换到内核,但仍在同一进程的上下文中。

  2. 来自可执行文件或库的代码页仅加载到内存中一次(对于底层文件的相同版本),因此,是的,printf映射到相同的物理地址(如果它由同一库提供)。

  3. 虚拟内存的内核部分只能从内核代码访问。

严格来说,printf将其输出写入缓冲区,该缓冲区可能不会写入任何地方。

相关内容