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 0x1fffff
um 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 0x1fffff
seria mapeado para a mesma memória física.
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_user
etc. 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).