Joh*_*n P 3 kernel memory virtual-memory
我问的是许多进程可能会使用的 printf 之类的函数,并且还需要内核的帮助来处理系统调用之类的事情。
对发生的事情的详细分步描述是什么?因为我在这方面有点困惑,所以我有这些问题:
printf 函数的指令是否在我们用户进程的内核部分?当它尝试执行 printf 时,我们对同一用户进程中的内核位置执行 JMP,但我们进入内核模式?或者是否有上下文切换和内核进程执行此操作?
执行 printf 等函数的所有进程在其虚拟内存中调用 printf 时是否都映射到相同的物理内存位置?
总的来说,非内核进程使用虚拟内存的内核部分的情况有哪些?
Ste*_*itt 16
printf是由C库实现的,它不是内核的一部分。(内核确实或多或少有自己的等价物,但用户进程无法使用它。)因此用户进程调用printf不会立即调用内核。如果printf的输出被写入¹,那是通过调用 发生的write,它由内核处理(好吧,C 库中有一个小的包装器,但它是最小的);该进程调用相应的系统调用,并将控制权切换到内核,但仍处于同一进程的上下文中。
来自可执行文件或库的代码页只加载一次到内存中(对于底层文件的相同版本),所以是的,printf映射到相同的物理地址,如果它是由同一个库提供的。
虚拟内存的内核部分只能从内核代码访问。
¹ 严格来说,printf将其输出写入缓冲区,该缓冲区可能不会写入任何地方。