Pergunta

Inspirado por esta pergunta

Como posso forçar GDB desmontar?

Gostaria de saber sobre a 21h INT como um conceito. Agora, eu tenho algum conhecimento muito enferrujado dos internos, mas não tão muitos detalhes. Lembro-me que no C64 você teve interrupções regulares e não Maskable interrupções, mas meu conhecimento pára aqui. Você poderia me dar alguma pista? É uma estratégia relacionada DOS?

Foi útil?

Solução

A partir aqui : A multiuso DOS interrupção usado para várias funções, incluindo a leitura do teclado e escrever para o console e impressora. Ele também foi usado para ler e discos de gravação usando o Bloco de Controle método (FCB) arquivo anterior.

Outras dicas

DOS pode ser pensado como uma biblioteca usada para fornecer um arquivos / diretórios da abstracção para o PC (-e um pouco mais). int 21h é um hardware simples "truque" que torna mais fácil de código de chamada a partir desta biblioteca sem saber antecipadamente onde ele será localizado na memória. Alternativamente, você pode pensar nisso como a maneira de utilizar a API DOS.

Agora, o tema de interrupções de software é um problema complexo, em parte porque os conceitos evoluíram ao longo do tempo como Intel adicionou recursos para a família x86, enquanto tenta permanecer compatível com o software de idade. Uma explicação adequada levaria algumas páginas, mas vou tentar ser breve.

A principal questão é se você está em modo real ou modo protegido .

modo real é o simples, o modo "original" de operação para o processador x86. Este é o modo que DOS é executado em (quando executar programas DOS no Windows, um processador de modo real é virtualizado, por isso dentro de si as mesmas regras se aplicam). O programa actualmente em execução tem total controle sobre o processador.

Em modo real, há uma tabela de vetores que diz ao processador qual o endereço para saltar para para cada interrupção de 0 a 255. Esta tabela é preenchida pelo BIOS e DOS, bem como drivers de dispositivos, e às vezes programas com especial precisa. Algumas destas interrupções podem ser gerados por hardware (por exemplo, por uma pressão de tecla). Outros são geradas por certas condições de software (por exemplo, dividir por 0). Qualquer delas pode ser gerada por executar o int n instrução.

Os programas podem definir / limpar o sinalizador "habilitar interrupções"; esta bandeira afeta apenas as interrupções de hardware e não afeta int instruções.

Os designers DOS escolheu usar número de interrupção 21h para lidar com solicitações DOS - o número é de nenhum significado real: era apenas uma entrada não utilizado no momento. Existem muitos outros (número de 10h é uma rotina de interrupção instalados pelo BIOS que lida com gráficos, por exemplo). Observe também que tudo isso é para IBM PC compatíveis somente. processadores x86 em sistemas digamos incorporados podem ter seu software e tabelas de interrupção dispostos de forma bastante diferente!

Modo Protegido é o modo complexo, "segurança-aware" que foi introduzido no processador 286 e muito estendida na 386. Ele oferece vários níveis de privilégio. O OS deve configurar tudo isso (e se o sistema operacional começa errado, você tem um potencial de segurança explorar). Os programas do usuário são geralmente confinadas a um modo de "mínimo privilégio" de operação, onde a tentar portas de hardware de acesso, ou mudar a bandeira de interrupção, ou acessar certas regiões de memória, interrompe o programa e permite que o sistema operacional para decidir o que fazer (seja ele terminar o programa ou dar ao programa o que parece querer).

manuseio

interrupção torna-se mais complexa. Basta dizer que, em geral, se um programa usuário faz uma interrupção de software, o número de interrupção é não usado como um vector para a tabela de interrupção. Sim uma exceção de proteção geral é gerado e o manipulador de OS para a referida exceção pode (se o sistema operacional é o design desta forma) trabalho para fora o que o processo quer e serviço a solicitação. Tenho certeza Linux e Windows no passado (se não atualmente) usado este tipo de mecanismo para suas chamadas do sistema. Mas há outras maneiras de conseguir isso, como a instrução SYSENTER.

lista de interrupção de

Ralph Brown contém uma grande quantidade de informações sobre quais interrupção faz o quê. int 21 , como todos os outros, compatível com uma ampla gama de funcionalidade de acordo com valores de registo .

A versão não HTML da lista de Ralph Brown também está disponível.

A instrução INT é uma interrupção de software. Ela provoca um salto para uma rotina apontada por um vetor de interrupção, que é um local fixo na memória. A vantagem da instrução INT é que é apenas 2 bytes de comprimento, como para oposed talvez 6 para um JMP, e que ele pode ser facilmente re-dirigido por modificar o conteúdo do vector de interrupção.

Int 0x21 é uma interrupção de software x86 - basicamente isso significa que há uma tabela de interrupção em um ponto fixo na memória listando os endereços de software de interrupção funções. Quando uma CPU x86 recebe o código de operação de interrupção (ou de outra forma decide que uma interrupção de software em particular deve ser executado), faz referência que a tabela para executar uma chamada para esse ponto (a função naquele ponto deve usar iret vez de ret de retorno).

É possível remapear Int 0x21 e outras interrupções de software (mesmo dentro DOS embora este pode ter efeitos colaterais negativos). Uma interrupção de software interessante para mapear ou cadeia é Int 0x1C (ou 0x08 se você for cuidadoso), que é a interrupção marcação sistema, chamado de 18,2 vezes a cada segundo. Isso pode ser usado para criar processos "fundo", mesmo em modo real de rosca única (o processo de modo real será interrompido 18.2 vezes por segundo para chamar a sua função de interrupção).

No sistema operacional DOS (ou um sistema que está fornecendo alguma emulação de DOS, como o console do Windows) Int 0x21 é mapeado para o que é efetivamente a sistemas operacionais DOS principal "API". Ao fornecer valores diferentes para o registo AH, diferentes funções do DOS pode ser executado como abrir um arquivo (AH = 0x3D) ou impressão para a tela (AH = 0x09).

Isto é de grande The Art of Assembly linguagem de programação sobre interrupções:

Na 80x86, existem três tipos de eventos vulgarmente conhecido como interrupções: Armadilhas, exceções e interrupções (interrupções de hardware). Este capítulo irá descrever cada uma dessas formas e discutir sua apoio nas 80x86 CPUs e máquinas compatíveis com PC.

Embora os termos armadilha e exceção são muitas vezes usados ??como sinônimos, nós vai usar o termo armadilha para denotar um programador iniciado e esperado transferência de controle a uma rotina especial manipulador. Em muitos aspectos, a armadilha é nada mais do que uma chamada de sub-rotina especializada. muitos textos referem-se a armadilhas como interrupções de software. A instrução 80x86 int é o principal veículo para a execução de uma armadilha. Nota que as armadilhas são geralmente incondicional; isto é, quando você executar uma instrução int, controle sempre transfere para o procedimento associado com a armadilha. Desde a armadilhas executar através de uma instrução explícita, é fácil determinar exatamente quais instruções em um programa irá invocar um tratamento armadilha rotina.

Capítulo 17 - Estrutura de interrupção e interrupção serviço Rotinas

(quase) toda a interface do DOS foi disponibilizado como comandos INT21H, com parâmetros constantes dos vários registos. É um truque pouco, usando uma tabela built-in-hardware para saltar para o código certo. Também 33h INT foi para o mouse.

É uma "interrupção de software"; por isso não uma interrupção de hardware em tudo.

Quando um aplicativo chama uma interrupção de software, que é essencialmente o mesmo que o seu fazer uma chamada de sub-rotina, exceto que (ao contrário de uma chamada de sub-rotina) a não precisa saber o endereço de memória exata do código que de invocação.

O software de sistema (por exemplo, DOS e do BIOS) expor suas APIs para a aplicação como interrupções de software.

A interrupção de software é, portanto, uma espécie de-linking dinâmica.

Para ser mais preciso, aqui está o link direto para lista de comando 21H INT do R. Brown: http : //www.ctyme.com/intr/int-21.htm

Na verdade, há uma série de conceitos aqui. Vamos começar com o básico.

Uma interrupção é um meio de solicitação a atenção da CPU, a interrupção o fluxo do programa atual, salto para um manipulador de interrupção (ISR - rotina do interruptor Service), fazer algum trabalho (normalmente pelo sistema operacional kernel ou um driver de dispositivo) e depois voltar.

Quais são alguns usos típicos para interrupções?

  • Interrupções de hardware:. Um dispositivo solicita a atenção da CPU através da emissão de um pedido de interrupção
  • Exceções CPU: Se alguma condição CPU anormal acontece, como uma divisão por zero, uma falta de página, ... a CPU salta para o manipulador de interrupção correspondente para que o sistema operacional pode fazer o que tem que fazer (enviar um sinal para um processo, carregar uma página de swap e atualizar a tabela de TLB / página, ...).
  • Interrupções de software: uma vez que um fins de interrupção até chamando o kernel do sistema operacional, uma maneira simples de implementar chamadas de sistema é usar interrupções. Mas você não precisa, em x86 você poderia usar uma instrução de chamada para alguma estrutura (algum tipo de TSS IIRC), e no mais recente x86 existem SYSCALL / intructions SYSENTER.

CPUs decidir onde ir para olhar para uma mesa (vetores de exceção, vetores de interrupção, IVT em x86 modo real, IDT em x86 modo protegido, ...). Alguns processadores têm um único vector de interrupções de hardware, outro para exceções e assim por diante, eo ISR tem que fazer algum trabalho para identificar o autor da interrupção. Outros têm lotes de vetores, e saltar directamente para ISRs muito específicas.

x86 tem 256 vetores de interrupção. Em PCs originais, estes foram divididos em vários grupos:

  • exceções 00-04 CPU, incluindo NMI. Com CPUs posteriores (80186, 286, ...), esta gama alargada, sobrepondo-se com os seguintes intervalos.
  • 08-0F Estes são interrupções de hardware, geralmente referidos como IRQ0-7. O PC-AT acrescentou IRQ8-15
  • chamadas 10-1F BIOS. Conceitualmente, estes podem ser considerados chamadas do sistema, uma vez que o BIOS é a parte do DOS que depende da máquina de concreto (que é como foi definido no CP / M).
  • 20-2F DOS chama. Algumas delas são multiplexados, e oferecem grande variedade de funções. A principal delas é 21h INT, que oferece a maioria dos serviços do DOS.
  • 30-FF O resto, para uso por motoristas externos e programas do usuário.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top