O que é hlt_bug?

2

Eu vejo isso mencionado de tempos em tempos quando o kernel verifica as CPUs. Suponho que seja algum tipo de erro de hardware da CPU relacionado à instrução HLT, mas não consigo encontrar nenhuma informação sobre isso. Então o que é hlt_bug na verdade?

    
por David Costa 30.05.2011 / 11:27

2 respostas

6

Não tenho certeza dos detalhes exatos, pois é um problema de muito tempo atrás, possivelmente desde quando máquinas baseadas em 386 eram comuns.

A instrução HLT só pode ser chamada em "ring 0" quando a CPU não está no modo "real", então deve ser chamada apenas pelo kernel em um SO moderno. Ele instrui o processador a fazer uma pausa até que a próxima interrupção seja recebida. CPUs modernas cairão em um estado de baixa energia neste ponto, embora não seja tão simples quanto para CPUs com múltiplos núcleos, obviamente.

Se bem me lembro, o bug era que alguns processadores 386 não despertariam em resposta a algumas interrupções em certas circunstâncias. A verificação para ver se esse bug existe é feita definindo um cronômetro que os processadores afetados são conhecidos para responder e um que eles não sabem - se a primeira vez que a CPU desperta é em resposta a esse primeiro período, temporizador você sabe que o bug existe porque já deveria ter acordado antecipadamente e atender o outro, período mais curto, interrupção do temporizador. Como a instrução HLT geralmente nunca é chamada fora do kernel, você não precisa se preocupar com isso - eu suponho que o único efeito do sinalizador "hlt bug found" é parar o código de gerenciamento de energia chamando HLT para processadores inativos que possuem o bug então pode não acordar.

A única referência que eu encontrei para esse bug online (além de cópias de saída de boot do kernel, os arquivos de origem * bugs, e esta pergunta (wow, perguntas nesses sites atingiram o banco de dados do Google rápido !)) depois de uma pesquisa rápida é uma discussão sobre se a verificação deve ser mantida no kernel hoje em dia, já que é improvável que ela afete quaisquer configurações de hardware que as pessoas estejam usando hoje ou que venham a usar no futuro. / p>

Editar: este HOWTO lista um problema HLT em alguns chips 486DX-100 (pesquise a página por no-hlt para a referência). Este pode ser o problema que estou lembrando (ao invés de ser um problema com alguns chips 386) ou pode ser uma coincidência e houve dois bugs de estado de baixo consumo de energia referentes a essa instrução.

    
por 30.05.2011 / 11:55
5

Eu encontrei um!

Meu primeiro computador foi um EVM soviético Iskra (basicamente um IBM PC / XT com o próprio barramento da Cortina de Ferro, mas totalmente compatível com software). Em alguns casos raros, estava congelando, às vezes produzindo lixo na tela. Após uma investigação mais detalhada, descobri:

  1. O sistema tinha uma CPU Siemens SAB 8086 com 8 Mhz.

  2. O culpado foi a instrução HLT (0xF4) que estava eliminando o sistema, independentemente de as interrupções terem sido desativadas ou ativadas.

Uma sequência simples, como 0xFA, 0xF4, 0xC3 (cli, hlt, ret), NÃO estava congelando o sistema normalmente, como seria de se esperar, em vez de produzir lixo na tela e, em seguida, congelar.

A seqüência similar 0xFB, 0xF4, 0xC3 (sti, hlt, ret) não apenas silenciosamente executou e retornou ao shell, novamente - lixo na tela, e um congelamento, ou (raramente) - retornou o shell.

Apenas o 0xF4, 0xC3 (normalmente as interrupções estão ativadas, de qualquer forma) - o mesmo lixo, apito e travado.

Eu nunca imaginei onde o controle estava sendo transferido, eu poderia ter escrito um carregador bootstrap que preenche a memória com ganchos (0xCC), então o manipulador INT 03h teria me dito de onde veio. Mas naquela época eu nunca pensei sobre isso. Ou talvez não fosse apenas transferir controle, mas corromper algo em algum lugar, quem sabe? Eu nunca ouvi falar da instrução HLT com bugs nos processadores da Siemens, mas este pode ser o caso. Eu não quero generalizar, bem poderia ter sido apenas este caso, ou talvez um lote de buggy.

Bem, para finalizar a história - naquela época eu encontrei outra máquina do mesmo modelo, mas a que tinha a pedra soviética no interior (a KM1810VM86M - a CPU 8086 da Intel fielmente roubada (emprestada) e depois reproduzida). Eu tentei brincar com a instrução HLT lá, e ele funcionou da maneira que deveria, e a maneira como a referência do programador Intel 8086 diz ...

Que ironia ... e que história! :)

    
por 25.10.2012 / 03:16