O que exatamente acontece na memória virtual quando eu chamo uma função como printf no Linux? [fechadas]

3

Estou perguntando sobre funções como printf que muitos processos podem usar e também precisam da ajuda do kernel para coisas como chamadas de sistema.

Qual é a descrição passo-a-passo em detalhes sobre o que acontece? Porque estou um pouco confuso nessa área, tenho estas perguntas:

  1. As instruções para a função printf estão dentro da parte do kernel do processo do usuário? E quando ele tenta executar o printf, nós fazemos um JMP no local do kernel dentro do mesmo processo do usuário, mas entramos no modo kernel? Ou existe uma mudança de contexto e um processo do kernel executa isso?

  2. Todos os processos que executam funções como printf mapeiam para a mesma localização de memória física quando chamam printf em sua memória virtual?

  3. Em geral, quais são as situações em que processos não-kernel usam a parte do kernel da memória virtual?

    
por John P 07.10.2018 / 16:44

1 resposta

16
  1. 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 chamando printf não chama o kernel imediatamente. Se a saída de printf for gravada¹, isso acontece chamando write , 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.

  2. 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.

  3. 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.

    
por 07.10.2018 / 18:21