OOPs do kernel faz com que ao acessar o ponteiro do espaço do usuário de dentro do kernel do Linux

2

Alguns antecedentes:

Eu tenho um sistema embarcado Linux ARM 4.1.33 que foi corrigido com o patch em tempo real de preempção. Este sistema contém algum código de kernel modificado personalizado e estava esporadicamente experimentando um kernel oops. Depois de algum debug, descobriu-se que um dos desenvolvedores não entendia a distinção entre o kernel e o espaço do usuário, e que eles estavam desreferenciando os ponteiros do espaço do usuário sem usar as funções definidas no uaccess.h.

Desde então, modifiquei as funções problemáticas para usar as funções definidas em uaccess.h, para evitar que ocorram novas ocorrências no kernel. Agora estou tentando verificar se a correção foi bem-sucedida. No entanto, como o oops original do kernel aconteceu aleatoriamente, às vezes não ocorrendo durante dias, gostaria de identificar algum método para recriá-lo de forma confiável no código original e, em seguida, verificar se ele não ocorre mais no código atualizado. / p>

Embora a função problemática estivesse usando o ponteiro incorretamente, pareceu modificar corretamente o valor do espaço do usuário usando o ponteiro (excluindo quando ocorreu o oops do kernel). Isso indicaria para mim que o endereço do ponteiro "significava a mesma coisa" no espaço do usuário e do kernel. Dado este fato, a única razão que eu estou ciente de que este desreferenciamento poderia causar um kernel oops seria se a página contendo o endereço fosse enviada para swap, resultando em uma falha de página. No entanto, o nosso sistema desativou o swap devido à longevidade limitada do nosso armazenamento flash, tornando este cenário improvável.

A (s) pergunta (s):

Quais são as possíveis causas de um kernel do Linux oops relacionado à desreferenciação de um ponteiro de espaço do usuário dentro do espaço do kernel? Como eu poderia causar, de forma confiável, um tal oops de kernel, a fim de verificar se ele não ocorre mais depois de aplicar as correções?

    
por Echo404 17.10.2017 / 17:08

1 resposta

1

Além da possibilidade de troca de página, há duas outras razões pelas quais isso pode falhar.

  1. Se estiver lendo o endereço do usuário, a página deve ser legível. Da mesma forma para escrever e executar.
  2. O endereço de espaço do usuário não pertence a esse processo. Embora os endereços do kernel tenham mapeamento um-para-um consistente com endereços físicos, o mesmo endereço virtual no espaço do usuário pode apontar para um endereço físico diferente, dependendo do processo atual.
por 18.10.2017 / 16:03