Qual é a causa da dupla falha na CPU?

0

É minha suposição certa, se eu disser que falha dupla pode e deve ocorrer apenas no modo kernel do processador (ou anel 0 para x86) quando qualquer exceção (síncrona) acontece e nunca mais?

Se a resposta for sim, nos processadores mais recentes que são compatíveis com os mais antigos, não podemos usar no código, que é executado no modo kernel, instruções já definidas (na CPU mais recente) se quisermos preservar essa compatibilidade no motivo de exceção de instrução indefinida, está certo? E outra questão. Se a CPU executa um código que é executado no modo kernel, ele deve ser apresentado na memória devido a uma falha na página, não é?

E meu pensamento adicional. Há algum benefício de que ele será implementado "interno habilitar INT bit" no registro de status que será automaticamente define e limpa em interrupção / exceção ocorre e seu retorno e se a exceção acontece HW lê este bit e se for definido, ele salta para endereço do manipulador de exceções, caso contrário, ele pula para o manipulador de falhas duplas?

Se for dependente de arquitetura / SO, escolho o Linux no MIPS.

Desculpe pelo meu inglês.

    
por Nik Novák 07.01.2016 / 23:12

2 respostas

2

A melhor resposta que posso dar é que sim, é correto que com a maioria dos CPUs modernos codificados rodando no modo Kernel, você pode disparar um falha dupla ou tripla . É muito raro (mas não impossível) que uma instrução não iniciada pelo kernel dispare uma falha grave, devido à operação ProtectedMode, que elimina o endereçamento físico de tal forma que não é mais possível ramificar em um endereço de registro inválido.

Como tal, sim, qualquer código de máquina montado para uma CPU sem ProtectedMode deve ser pelo menos remontado, se não for modificado , para trabalhar em uma CPU mais nova.

da Wikipedia: link

Virtual 8086 mode Main article: Virtual 8086 mode

With the release of the 386, protected mode offers what the Intel manuals call virtual 8086 mode. Virtual 8086 mode is designed to allow code previously written for the 8086 to run unmodified and concurrently with other tasks, without compromising security or system stability.[29]

Virtual 8086 mode, however, is not completely backwards compatible with all programs. Programs that require segment manipulation, privileged instructions, direct hardware access, or use self-modifying code will generate an exception that must be served by the operating system.[30] In addition, applications running in virtual 8086 mode generate a trap with the use of instructions that involve input/output (I/O), which can negatively impact performance.[31]

Due to these limitations, some programs originally designed to run on the 8086 cannot be run in virtual 8086 mode. As a result, system software is forced to either compromise system security or backwards compatibility when dealing with legacy software. An example of such a compromise can be seen with the release of Windows NT, which dropped backwards compatibility for "ill-behaved" DOS applications.[32]

Espero que ajude um pouco e que, se for insuficiente, outro possa preencher quaisquer lacunas no meu entendimento.

    
por 07.01.2016 / 23:53
0

Eu tenho muita experiência com o x86, mas nada no MIPS, desculpe - mas eu acredito que a seguinte descrição se aplica a ele de qualquer maneira.

Uma Dupla Falha somente ocorre em uma circunstância muito particular: Se, ao tentar iniciar um manipulador de exceções, outra exceção ocorre, a primeira exceção é abandonada e o O manipulador de exceção Double Fault é chamado no lugar.

Aqui está um exemplo de uma falha simples. Se o código tentar acessar a memória inválida:

*(int *)0 = 0xdead;

a CPU detectará a referência do ponteiro NULL e tentará iniciar o manipulador de falhas da memória. Isso poderia estar no código do usuário (anel 3) ou do supervisor (anel 0), e nenhuma falha dupla ocorreria - a CPU simplesmente tentaria iniciar o manipulador de falhas da memória.

Imagine que o sistema operacional tenha um bug e o manipulador de falhas de memória em si estivesse na memória inválida. Assim, ao tentar iniciar o manipulador de falhas de memória, outra falha ocorreu e a primeira falha não pôde ser manipulada. O manipulador de falha dupla, em seguida, seria chamado. (Se ocorrer uma falha ao tentar iniciar o manipulador de falha dupla, a CPU x86 simplesmente será encerrada com uma falha tripla. O hardware do PC detecta isso e redefine a CPU.)

Eu enfatizei repetidamente start porque uma vez que um manipulador de falhas tenha iniciado com sucesso, nenhuma Dupla Falha ocorrerá mais. A primeira falha começou a ser manipulada e a CPU agora pode lidar com quaisquer novas falhas que possam surgir. A CPU não "lembra" que está dentro de um manipulador de falhas e causa uma dupla falha se ocorrer uma nova falha.

Por exemplo, se um manipulador de falhas tentar usar um código de operação indefinido, o manipulador de falhas Indefinido do Opcode simplesmente seria chamado nessa instrução. Não é uma falha dupla, é meramente uma falha dentro de uma falta.

Naturalmente, se o manipulador de falhas de memória for iniciado e, durante o processamento, ocorrer uma falha de memória, o manipulador de falhas de memória será reiniciado. Isso pode causar a mesma falha de memória novamente, o que reiniciará o manipulador de falhas de memória - cada vez usando mais e mais pilha até que finalmente a própria pilha estourar, o que no x86 é um manipulador de falhas diferente.

    
por 06.06.2018 / 09:08