Por que são copy_from_user()
e copy_to_user()
necessários, 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 aprendizado, rapidamente percebi isso copy_from_user()
e copy_to_user()
precisei copiar dados de/para buffers de espaço do usuário; caso contrário, erros relacionados a endereços inválidos resultaram em falhas.
Mas se 0x1fffff
é um endereço virtual apontando para um buffer de espaço do usuário, 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.
O mapeamento do espaço de endereçamento é o mesmo em algumas (não todas!) arquiteturas, mas mesmo em arquiteturas onde eles são os mesmos, os níveis de proteção não são.
copy_from_user
etc. servem a três propósitos principais:Algumas arquiteturas usam layouts de memória que permitem que essas funções usem atalhos, por exemplo , usando um mapeamento direto da memória física, mas você não pode presumir que seja esse o caso, e ela não trata de todas as situações de qualquer maneira (páginas trocadas não são t presente na memória física).