printf
是由C库实现,它不是内核的一部分。 (内核或多或少确实有其自己的等效项,但这不适用于用户进程。)因此用户进程调用printf
不会立即调用内核。如果printf
的输出被写入,则通过调用发生write
,由内核处理(好吧,C 库中有一个小包装器,但它是最小的);进程调用相应的系统调用,并将控制权切换到内核,但仍在同一进程的上下文中。
来自可执行文件或库的代码页仅加载到内存中一次(对于底层文件的相同版本),因此,是的,printf
映射到相同的物理地址(如果它由同一库提供)。
虚拟内存的内核部分只能从内核代码访问。
严格来说,printf
将其输出写入缓冲区,该缓冲区可能不会写入任何地方。