Não há razão para um pânico no kernel, já que em seu teste o módulo imprimiu dados de um endereço acessível até que um nulo fosse encontrado (você deveria ter usado o tamanho dos dados para limitar o printk).
No entanto, você pode tentar o mesmo teste outra vez e ele entrará em pânico porque seu programa (eco) foi paginado com falta de memória! Nesse caso, acessar os dados causa uma falha de página, que é o modo normal de ter os dados retornados à memória, mas como você não usou copy_from_user()
, o kernel deve assumir que a falha de página é um erro de programação e entrará em pânico.
Este é o valor primário de usar copy_from_user()
em muitas arquiteturas: ele marca esse código como potencialmente produzindo falhas de página "legais", que devem ser manipuladas normalmente (como quando ocorrem no espaço do usuário) como uma solicitação para página de volta nos dados. Caso contrário, é apenas uma espécie de memcpy()
otimizado.
A função também faz algumas verificações preliminares sobre a validade do endereço. Consulte esta explicação .
O echo 123asa
é conceitualmente implementado no espaço do usuário por código como
char data[1024];
memcpy(data,"123asa\n",7);
write(1,data,7);
em que a cadeia copiada em data
tem 7 caracteres e não tem motivos para terminar com um 8º caractere nulo
. Portanto, data[7]
printk("%s\n",buff)
em diante conterá dados aleatórios não inicializados.
Quando em seu módulo você executa %s
, o formato %code% imprimirá caracteres de buff até que ele atinja um caractere nulo, que pode estar muito distante. Em vez disso, você deve restringir o tamanho ao fornecido como
printk("%*s\n",len,buff);