当我在 Linux 中调用 printf 之类的函数时,虚拟内存中究竟发生了什么?

Joh*_*n P 3 kernel memory virtual-memory

我问的是许多进程可能会使用的 printf 之类的函数,并且还需要内核的帮助来处理系统调用之类的事情。

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

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

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

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

在此处输入图片说明

Ste*_*itt 16

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

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

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

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

  • `printf` _may_ 最终调用 `write()`。它将一些文本添加到最终可能被写入的 stdio 缓冲区。 (2认同)