-
printf
é implementado pela biblioteca C , não é parte do kernel. (O kernel tem seu próprio equivalente, mais ou menos, mas não está disponível para os processos do usuário.) Portanto, um processo do usuário chamandoprintf
não chama o kernel imediatamente. Se a saída deprintf
for gravada¹, isso acontece chamandowrite
, que é manipulado pelo kernel (bem, há um pequeno wrapper na biblioteca C, mas é mínimo); o processo invoca a chamada de sistema correspondente e controla as chaves para o kernel, mas ainda dentro do contexto do mesmo processo. -
As páginas de código de executáveis ou bibliotecas são carregadas apenas uma vez na memória (para a mesma versão do arquivo subjacente), portanto, sim,
printf
é mapeado para o mesmo endereço físico, se for fornecido pela mesma biblioteca. -
A parte do kernel da memória virtual só é acessível a partir do código do kernel.
¹ Estritamente falando, printf
grava sua saída em um buffer, que pode não estar escrito em lugar nenhum.