Qual é a utilidade de ter uma parte do kernel no espaço de memória virtual dos processos do Linux?

1

Encontrei uma pergunta semelhante, mas ainda não responde às minhas perguntas Os espaços de endereço virtuais de todos os processos têm o mesmo conteúdo em suas partes "Kernel"?

  1. Primeiro, considerando que os processos do usuário não têm acesso a essa parte e eu acho que se eles tentarem acessá-la, isso levaria a um erro, então por que incluir essa parte no espaço virtual do processo do usuário? Vocês podem me dar um cenário da vida real desta parte ser essencial e útil?

  2. Além disso, mais uma pergunta é que sempre achei que a parte do kernel da memória é dinâmica, o que significa que pode crescer, por exemplo, quando usamos bibliotecas dinâmicas em nossos programas, então é verdade? Em caso afirmativo, como o sistema operacional determina o tamanho do kernel no espaço virtual de nossos processos?

  3. E quando nosso kernel na memória física cresce ou muda, o mesmo efeito acontece na parte do kernel da memória virtual para todos os processos? O mapeamento deste kernel virtual para o kernel real é um mapeamento um para um?

    
por John P 29.09.2018 / 09:09

1 resposta

1
  1. O mapeamento do kernel existe principalmente para fins do kernel, não para processos do usuário. Do ponto de vista da CPU, qualquer endereço de memória física que não seja mapeado como um endereço linear também pode não existir. Mas a CPU precisa ser capaz de chamar o kernel: para atender interrupções, para lidar com exceções ... Também precisa ser capaz de chamar o kernel quando um processo do usuário emitir uma chamada do sistema (existem várias maneiras que isso pode acontecer, então eu não vou entrar em detalhes). Na maioria, se não em todas as arquiteturas, isso acontece sem a oportunidade de alternar as tabelas de páginas - veja, por exemplo, SYSENTER . Portanto, no mínimo, os pontos de entrada no kernel devem ser mapeados no espaço de endereço atual em todos os momentos.

  2. As alocações do kernel são dinâmicas, mas o espaço de endereço não é. Em x86 de 32 bits, vários divisões estão disponíveis, como a divisão de 3/1 GiB mostrada em seu diagrama; em x86 de 64 bits, a metade superior do espaço de endereço é reservada para o kernel (consulte a memória map na documentação do kernel). Essa divisão não pode ser movida. (Observe que as bibliotecas são carregadas no espaço do usuário. Os módulos do kernel são carregados no espaço do kernel, mas, novamente, isso apenas altera as alocações, não a divisão do espaço de endereço.)

  3. No modo de usuário, existe um mapeamento único para o kernel, compartilhado em todos os processos. Quando um mapeamento de página do lado do kernel é alterado, essa alteração é refletida em todos os lugares.

    Quando o KPTI está ativado, o kernel tem seus próprios mapeamentos privados, que não são expostos ao executar o código de espaço do usuário; Assim, com o KPTI, há dois mapeamentos, e alterações no kernel privado não serão visíveis para o espaço do usuário (que é o ponto principal do KPTI).

    O mapa de memória do kernel sempre mapeia todo o kernel (no modo kernel ao executar o KPTI), mas não é necessariamente um-para-um - em x86 de 64 bits, por exemplo, inclui um mapa completo de memória física, endereços físicos são mapeados pelo menos duas vezes.

por 29.09.2018 / 10:29