Installable ISRs and the Kernel
9/8/2008
Uma rotina serviço interrupção instalável (ISR) é aquele que pode ser instalado e permissão para uma interrupção após o kernel gancho compilado. Normalmente, se tiver uma interrupção ser acoplado para fornecer serviço para algum evento, a codificar precisa ser interno quando o kernel é originalmente compilado. Se um novo dispositivo é inserido um barramento Peripheral Component Interconnect (PCI) de exemplo, a codificar ao identificador de solicitação interrupção (IRQ) deve estar no kernel já; caso contrário, o IRQ não pode ser acoplado. Os OEMs podem planejar alguns expansão e camada de adaptação compilar um OEM (OAL) que acomoda vários dispositivos em uma maneira flexível. Entretanto, se um dispositivo desconhecido está inserido o pacote suporte placa (BSP), há uma alta probabilidade que não é possível acessá-lo.
Os OEMs devem planejar somente para o IRQ seja exposto a um ISR que não seja compilado para o kernel. Quando um ISR é instalado, a seguinte considerações devem ser levadas em conta:
O driver DLL é semelhante a qualquer driver DLL que cria um segmento serviço interrupção (ist) e aguarda para ser disparado. Para instalar o ISR DLL, chamar o LoadIntChainHandler função, que carrega o ISR DLL para espaço de endereço do kernel e inicializa-lo. Essa função também força o kernel para criar uma lista de ISRs instalados esse identificador uma interrupção específica.
Observação
O ISR DLL instalável deve estar na Seção Files com nenhuma variável correção ou in a Seção Modules Com o sinalizador kernel, K, definir para um kernel-variável correção estilo. Uma variável correção é a funcionalidade de ROMIMAGE que permite que você inicializar um variável global na Nk.exe no tempo MAKEIMG.
O ISR DLL é um DLL stripped-Down que pode ser carregada pelo kernel e usado para fornecer um serviço para um IRQ. Como um regular ISR, um ISR instalado retorna um valor SYSINTR_* que dispara uma espera ist no driver DLL.
O OEM deve ENC qualquer IRQs para os ISRs instalados. O OEM ainda é o primeiro chamar que o kernel faz se um OEM tem acoplado um IRQ por chamado HookInterrupt. A OEM pode identificador qualquer IRQs desejar nas ISRs tradicionais que são compilado para o kernel. Os OEMs devem decidir se um IRQ deve ser manipulado por uma ISR. instalado Nenhum IRQ que permite o OEM para serem manipulados por um ISR instalado é disparada por uma chamar para NKCallIntChain. Quando o kernel é chamado e é passado um valor interrupção a partir de OEM, a kernel procura todos os ISRs instalados que foram registrados para o mesmo valor. Em seguida, baseado em um primeiro, encomendando primeiro Out (FIFO), o kernel passa a lista até o primeiro ISR na lista retorna um valor Other Than SYSINTR_CHAIN. Depois de um valor, que não é um valor SYSINTR_CHAIN, é retornado, o kernel pára ISRs chamado adicionais instalado e retorna esse valor para o chamador de NKCallIntChain.
A seguinte lista mostra que os OEMs devem baseia a valor de retorno de NKCallIntChain.
- Se a lista inteira é processada e o ISR não identificador de IRQ, a NKCallIntChain função retorna SYSINTR_CHAIN.
- Se a valor de retorno de NKCallIntChain Não é SYSINTR_CHAIN, os OEMs devem desativar a interrupção e retornar o valor SYSINTR_* para o kernel.
- Se o valor retornado do NKCallIntChain é SYSINTR_CHAIN, os OEMs devem retornar SYSINTR_NOP para o kernel e deixar a interrupção habilitado.
Você pode mapa (n.); mapear (v.) múltiplo interrupções para um único sistema compartilhados de IRQ. A seguinte lista mostra as diferentes maneiras para mapa (n.); mapear (v.) múltiplo interrupções para um único sistema compartilhados de IRQ:
- Uso IOCTL_HAL_REQUEST_SYSINTR e transmitir a OAL o IRQ e a OAL retorna um Sysintr valor que você pode usar. Se seu driver descarrega, use IOCTL_HAL_RELEASE_SYSINTR.
- Disco rígido-codificar o Sysintr Os valores em seu OAL. Vários Sysintr Valores podem corresponder a um IRQ. Valores de IRQ e Sysintr Valores podem ter um relação um-para-um, que define a usar como padrão Sysintr valor para a IRQ. Para obter exemplos, consulte SETUP_INTERRUPT_MAP e OEMRequestSysIntr. Você pode adicionar o disco rígido-codificado Sysintr Valores, começando SYSINTR_FIRMWARE + 16, para OEMInit, imediatamente após o último SETUP_INTERRUPT_MAP. Não é possível usar SETUP_INTERRUPT_MAP diretamente porque ele inclui instâncias de DEBUGCHK, que garante que o mesmo IRQ não está mapeado duas vezes. Embora este método não seja tão flexível quanto aquele acima, depois que você tenha configurado a OAL, você pode atualização o Registro para informar o serial drivers sobre quais Sysintr Para usar.
O genérico codificar exemplo ISR instalável está localizado no _WINCEROOT%\Public\Common\Oak\Drivers\GIISR %. O genérico ISR instalável deve exportar a seguinte funções:
O seguinte E/S controle códigos são específicos para o driver:
- IOCTL_GIISR_INFO
- IOCTL_GIISR_PORTVALUE
See Also
Other Resources
Defining an Interrupt Identifier
Implementing an ISR
Loader
PCI Bus Driver
Real-Time Priority System