Por que `copy_from_user()` e `copy_to_user()` são necessários, quando o kernel é mapeado no mesmo espaço de endereço virtual que o próprio processo?

Por que `copy_from_user()` e `copy_to_user()` são necessários, quando o kernel é mapeado no mesmo espaço de endereço virtual que o próprio processo?

Por que são copy_from_user()necessários copy_to_user()quando o kernel é mapeado no mesmo espaço de endereço virtual que o próprio processo?

Tendo desenvolvido alguns módulos de kernel (de brinquedo) para fins de aprendizagem, rapidamente os reconheci copy_from_user()e copy_to_user()eram necessários para copiar dados de/para buffers de espaço do usuário; caso contrário, erros relacionados a endereços inválidos resultariam em falhas.

Mas se 0x1fffffum endereço virtual está apontando para um buffer de espaço do usuário, então por que esse endereço não é válido no kernel? O kernel está no mesmo espaço de endereço virtual, portanto 0x1fffffseria mapeado para a mesma memória física.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Responder1

O mapeamento do espaço de endereço é o mesmo em algumas arquiteturas (não em todas!), mas mesmo em arquiteturas onde são iguais, os níveis de proteção não são. copy_from_useretc. servem a três propósitos principais:

  • eles verificam se as permissões na memória para leitura ou gravação permitiriam que o processo em execução no espaço do usuário pudesse ler ou gravar nela - isso garante que os processos não possam enganar o kernel para acessar a memória, o processo não deveria ser capaz de;
  • eles permitem o tratamento de erros específicos para que falhas de proteção não travem o kernel, por exemplo, se os endereços solicitados não estiverem mapeados no momento (pense em zero páginas ou páginas trocadas);
  • eles garantem que o kernel não tropece em sua própria proteção,por exemplo SMAPou espaços de endereço específicos do kernel (S/390).

Algumas arquiteturas usam layouts de memória que permitem que essas funções usem atalhos,por exemplousando um mapeamento direto da memória física, mas você não pode presumir que seja esse o caso e, de qualquer maneira, ele não lida com todas as situações (as páginas trocadas não estão presentes na memória física).

informação relacionada