Sistemas Operativos I
Transcrição
Sistemas Operativos I
Windows Device Drivers Programação de Periféricos SO - 2013/14 Arquitetura Windows Tipos de processos user-mode System Support Process • Logon process e session manager Service Processes • Agendador de tarefas, spool de impressao e servidores em geral incluem processos que executam como serviços no windows (MySQL, Tomcat, SQLServer …) User Application • Windows 32-bit, Windows 64-bit, Windows 3.1 16-bit, MS-DOS 16-bit, POSIX 32-bit, or OS/2 32-bit Subsistems • POSIX, OS/2 e Windows Tipos de processos kernel-mode Windows Executive Contém os principais serviços do sistema operacional como gerência de memória, gerência de processos e threads, segurança, I/O, comunicação entre processos Windows Kernel Funções de baixo nível do sistema como escalonamento de threads, interrupções e lançamento de exceções, e contém também um conjunto de rotinas e objetos básicos que são usados pelo executive para implementar os serviços de mais alto nível Device Drivers Incluem os drivers de dispositivos, sistema de arquivos e protocolos de rede Hardware Abstraction Layer É uma camada de código que isola o kernel, os drivers e o executive das diferenças de hardware de plataformas específicas (como motherboards, por exemplo) Windowing e graphics system Implementa todas as funções de renderização, janelas e controles de interface, conhecido como Windows User and GDI Functions Drivers possuem a extensão .sys Geralamente são armazenados no diretório windows/system32/drivers possuem geralmente um arquivo .inf que possui todas as informações de instalação do driver Tipos de Drivers User-mode drivers • • Virtual Device Drivers: usados para compatibilidade de aplicações DOS 16bits, capturam as chamadas feitas por estas aplicações e mapeiam para Win32 Printer Drivers Kernel-mode drivers • • File system drivers: tratam as requisições direcionadas aos dispositivos de armazenamento ou dispositivos de rede Plug and play drivers:trabalham com algum hardware e integramse ao power manager e ao plug and play manager do windows • • • • • Class Drivers: drivers genéricos para classes de dispositivos Minidrivers: drivers que adicionam aos class drivers algumas funções específicas do fabricante Function drivers: incorporam todas as funcionalidades necessárias para suportar um dispositivo Filter Drivers: filtram requisições de I/O para um driver específico e adicionam informações ou modificam seu comportamento Legacy drivers: drivers que controlam diretamente um hardware sem a ajuda de nenhum outro driver Tipos de Drivers Windows Driver Model – WDM Framework introduzido à partir das versões Win98 e Win2000 que standariza os drivers em um modelo unificado e implementa os padrões de plug and play e power management Os drivers WDM são organizados em “camadas” (layered drivers) e comunicam-se através de I/O Request Packets IRPs Vantagens dos drivers que aderem ao WDM • São compatíveis com Win98, WinME Win2000, WinXP e Win2003 server, Windows Vista (source and binary) Desvantagens • • • • Curva de aprendizado é muito alta Interações com eventos de power managemente a plug and play é muito complexa e por isso várias máquinas apresentam problemas nas funções de sleep e wakeup devido à bugs nos drivers É necessário muito código de suporte para codificar um driver É necessário conhecimento muito avançado do WDM mesmo para criar drivers muito simples I/O Request Packet O IRP é uma estrutura de dados criada pelo I/O System onde ele armazena todas as informações necesárias para realizar a operação O IRP contém informações sobre qual a rotina Dispatch que será chamada do driver (create, read, write, close ...), informações do status da operação (que vai sendo atualizada conforme o andamento) e também contém ponteiros para estruturas importantes que serão utilizadas no processo Exemplo da hierarquia Estrutura de um driver DriverEntry A principal função dessa rotina é informar ao I/O System os ponteiros para as funções que o driver irá implementar extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { DriverObject->DriverUnload = DriverUnload; DriverObject->DriverExtension->AddDevice = AddDevice; DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = DispatchWmi; servkey.Buffer = (PWSTR) ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(WCHAR)); if (!servkey.Buffer) return STATUS_INSUFFICIENT_RESOURCES; servkey.MaximumLength = RegistryPath->Length + sizeof(WCHAR); RtlCopyUnicodeString(&servkey, RegistryPath); servkey.Buffer[RegistryPath->Length/sizeof(WCHAR)] = 0; return STATUS_SUCCESS; } Driver Development Kit - DDK Ambiente utilizado para a compilação de drivers que possui diversas ferramentas utilitárias e exemplos funcionais para quase todos os tipos de drivers possíveis A maior parte dos desenvolvedores de drivers e inclusive a própria documentação do DDK aconselha que se inicie o desenvolvimento de um novo driver sempre a partir de um dos exemplos do DDK Download gratuito no site da Micro$oft Possui uma extensa e desorganizada documentação técnica sobre o desenvolvimento de drivers Exemplo 1: Stupid driver O driver possui apenas as rotinas DriverEntry e DriverUnload Não realiza nenhuma operação, apenas é carregado e descarregado pelo sistema A configuração do driver é feita manualmente no register Código do driver #include <ntddk.h> VOID OnDriverUnload(IN PDRIVER_OBJECT pDriverObject); NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pusRegistryPath) { DbgPrint("Carregando o driver!!\n"); //informando o endereço da rotina de unload pDriverObject->DriverUnload = OnDriverUnload; return STATUS_SUCCESS; } VOID OnDriverUnload(IN PDRIVER_OBJECT pDriverObject) { DbgPrint("Finalizando o driver...\n"); }