Pergunta

Nos desenvolvedores de software Intel Manual diz que vetores de interrupção 32-255 são geralmente definido pelo usuário para dispositivos IO externas. Em meus sistemas de classe de programação devo desenvolver um driver de dispositivo simples. A minha pergunta é como posso definir uma específica interrupção vector a ser utilizado para um dispositivo específico? Isso é feito com o BIOS?

Nota: nós estamos desenvolvendo um sistema operacional simples para que minha situação é bastante específica, no entanto, no final, eu preciso entender como tudo isso acontece em um sistema x86. Atualmente, nosso sistema está configurado de forma que alguns vetores de interrupção acima de 32 são atribuídos a dispositivos como uma porta serial e teclado. Ao ler a folha de dados para o controlador ICH5 IO Intel 82801EB, especificamente a seção sobre os 8259 PICs, ele diz que IRQ15 é o canal IDE secundário. Como teria que ser, eventualmente, colocado na pilha como um vetor de interrupção?

I pode apenas ser tão confuso que esta questão não faz sentido, por isso peço desculpas com antecedência.

EDIT: Então, os nossos sistemas de classe programação tem um OS muito simples, que tem rotinas de kernel para a instalação ISRs para interrupções específicas punho dado o número vector. Em nossa classe último trimestre o professor nos deu um arquivo de cabeçalho que definiu o teclado como número vector 0x2c ou algo similar. Eu estou tentando descobrir como mapear as interrupções de canal IDE primária e / ou secundária a diversas ISRs usando nossas rotinas do kernel. Por enquanto, todos os vetores de interrupção não utilizados tem um manipulador padrão que iria imprimir mensagens se uma interrupção ocorreu, de modo interrupções IDE não estão mesmo no momento, no entanto, que é uma outra questão.

Foi útil?

Solução 5

Bem, eu parecem ter encontrado a resposta em nosso código de apoio, especificamente a rotina de inicialização PIC. Com as seguintes linhas de IRQ código são mapeados às 20h e 28h deslocamento na IDT para os PICs mestre e escravo, respectivamente.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

Isto significa que o teclado foi mapeada ao número de vector 2c e os canais primários e secundários serão mapeados a 2e e 2f, respectivamente. Alguns de vocês provavelmente poderia ter me dado respostas melhores se eu tivesse feito a pergunta melhor, mas eu aprecio a ajuda de qualquer maneira!

A Tabela 45 da 82801EB ICH5 folha de dados detalha a 8259 de linhas de IRQ, e no meu OS o mestre é simplesmente carregado às 20h compensados ??eo escravo é 28h.

Obrigado!

Outras dicas

Você pode programar (controlador de interrupção programável) do PIC para mapear certos do dispositivo de IRQ.

Em x86, há dois PIC de que são dando IRQ0-IRQ17 encadeados. IRQ0-7 é gerido pelo 8259 e IRQ8-15 por uma segunda 8259. Os primeiros sinais da CPU e é o mestre, com o segundo (o escravo) sinalizando o primeiro.

O IDT (tabela de descritores de interrupção) mapeia as interrupções para os endereços de ISR (rotinas de serviço de interrupção). Interrupções podem ser levantadas diretamente com a instrução INT (armadilhas de software).

Por exemplo, para aumentar a interrupção 0x80, executar INT 0x80.

Para lidar com 0x80, mov [0x80*4], int_80_handler. Assumindo uma arquitetura de 32 bits, o endereço da função int_80_handler está agora armazenado no local 0x80'th na IDT.

Você vai encontrar estes útil:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en.wikipedia.org/wiki/Interrupt_descriptor_table

Tem sido um tempo desde que eu tenho lidado com este material de modo que este pode ser desligado: Lembro-me de que o PC interrupção controlador tem 15 IRQ linhas. Estes mapa de vectores específicos de interrupção x 86 adjacentes. Assim, quando um gatilhos periféricas uma linha de IRQ, o PIC interrompe a CPU e diz que vetor para saltar para, como se a instrução INT correspondente foi executado. Alguns IRQ são codificado para determinados periféricos, mas acredito que os dispositivos PCI negociar com o OS para IRQs e alguns outros recursos (como fazem o legado dispositivos ISA PNP).

Eu não entendo o que você quer dizer com 'Como isso seria, eventualmente, colocado na pilha como um vetor de interrupção?'

Há duas maneiras possíveis para um dispositivo para obter uma interrupção:

  1. Use o Plug and Play ou mecanismo Pci. Se você fizer isso o BIOS irá chamar o dispositivo periférico e pedir para as necessidades de recursos. Depois o driver pode enumerar os dispositivos plug-and-play, procurar o dispositivo suportado e obter a interrupção de hardware do dispositivo.

  2. Como tem sido feito nos primeiros dias: Basta usar uma interrupção. Adicionar um dip-switch para o dispositivo que permite ao usuário selecionar entre diferentes interrupções. A alocação de recursos está na mão dos usuários agora. O usuário também vai passar o número de interrupção para o motorista no momento do carregamento de alguma forma.

Agora, como ligar a interrupção: Isso depende do sistema operacional e do modo do x86 é executado em Para um sistema de osso nu, nu você pode consultar o IDT (Interrupt Descriptor Table), através de uma instrução especial.. Uma vez que você tem que IDT você pode obter o endereço e picar o endereço do manipulador de IRQ no slot correto. Para modo real Eu não sei como é feito mais.

Se você tem pelo menos um pouco OS em tempo real ou algo OS-como correr, é provável que já existe uma função kernel que faz o trabalho duro para você.

Se bem me lembro, há uma tabela de vetores no início do espaço de memória que aponta para a rotina para chamar quando uma interrupção específica ocorre. I pode estar batendo em um nível muito baixo aqui (programador Assembly x86 de idade), mas a nível de base que você obter o seu vector instalado nessa tabela, em seguida, sua rotina é chamada. Eu não tenho nenhum dos meus material de referência velho comigo por isso não pode dar-lhe as chamadas reais, mas eu ficaria surpreso se o método oficial operado fora do BIOS.

Nestes dias de GUIs eu tenho certeza que existem outros métodos mais adequados, que permitem o compartilhamento de interrupção e todas essas coisas boas.

EDIT: Ignorar muito disso, eu acabei de ver que você está olhando para interrupção 16 e acima, que estão fora das interrupções de hardware. Afastei-me de que o nível de programação antes de haver qualquer interessantes bits de hardware em que o espaço para que eu só nunca lidou com os primeiros 15 IRQs (dia 16 sendo a cascata entre controladores). Eu estou deixando-o apenas no caso, é do interesse de ninguém:)

INT 21h / AH = 25h - definir vector de interrupção; entrada: AL = número de interrupção. DS:. DX -> novo manipulador de interrupção

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top