Como um SO se comunica com outros componentes de hardware?

6

Como um programa rodando em uma CPU (principalmente OS) acessa outro hardware de PC? Tais como placa gráfica, HDD e assim?

Pelo que eu li, no DOS, isso foi feito usando chamadas de BIOS, especificamente a instrução INT. Mas, a instrução INT só deve saltar para o espaço certo na RAM. Então, como pode algum programa armazenado na RAM acessar outro hardware de computador, quando a CPU só pode acessar a RAM e receber interrupções?

O Windows também usa instruções INT, ou há uma nova maneira de se comunicar com o hardware?

    
por wonea 11.03.2010 / 22:47

4 respostas

9

[H]ow can program runnig on CPU (mostly OS) acess other PC hardware? Such as Graphic card, HDD and so?

A resposta completa a esta questão é complexa e difícil de responder em geral. Então, vou tentar respondê-lo em geral, e espero dar-lhe algumas dicas para encontrar informações adicionais para aprender mais. Espero que isso seja útil.

Para os modos protegidos de 32/64 bits usados pelo MS Windows 95 e mais recentes ou o Linux para um processador x86 (IA-32), o software interrompe (como o código de operação INT para x86) vá para a tabela de vetores apropriada Interromper (ou tabela de despacho) que pode direcionar a CPU onde, no SO, o processo deve ir para o manipulador de interrupção (ou Rotina de Serviço de Interrupção, ISR) para manipular a solicitação.

Em x86 modo real , como o MS-DOS, eles podem ser manipulados pelo BIOS que fornece detalhes de implementação específicos de baixo nível para esse sistema / chipset / placa-mãe em particular.

[H]ow can some program stored in RAM acess other computer HW, when CPU can acess only RAM, and reeive interrupts?

Então você não quer a resposta usual mão-ondulada ? Vou tentar responder isso, mas não sou engenheiro de computação nem especialista em arquitetura de computadores.

Existem vários mecanismos, incluindo

(Src: CS 473 - IO , Universidade Estadual do Novo México , pfeiffer, 2006)

O mais simples é a E / S mapeada na memória, onde um endereço de memória pode ser mapeado para os registros de um dispositivo de hardware (por exemplo, UART ) e a CPU e escrever e / ou ler determinados endereços de memória para acessar o hardware diretamente. Isso é rápido e simples, mas reduz o alcance do endereço de memória do que pode ser usado como RAM.

Os outros são técnicas mais avançadas desenvolvidas para permitir que CPUs modernas e Sistemas Operacionais mais avançados acessem hardware de maneira controlada.

No próprio sistema operacional, eles são normalmente chamados de drivers de dispositivo, pois incluem detalhes específicos sobre os dispositivos de hardware que suportam.

And, does windows use int instructions as well, or is there any new way to communicate with HW?

Sim e sim, mas acho que expliquei isso.

    
por 12.03.2010 / 00:14
4

Existem várias maneiras de o software rodando na CPU em um PC poder se comunicar com o resto do hardware.

Os mais simples de entender são as portas de E / S. O software usa a instrução OUT para gravar 8, 16 ou 32 bits por vez em uma porta de E / S. Da mesma forma, o software usa a instrução IN para ler de uma porta de E / S. As portas de E / S residem em um espaço de endereço de 16 bits separado, não relacionado ao espaço de endereços usado pela memória principal. Cada peça de hardware que usa portas de E / S possui um intervalo de endereços de E / S; escrever e ler cada um desses endereços tem um efeito diferente (e muitas vezes ler e escrever no mesmo endereço tem efeitos diferentes também).

Outra maneira é a E / S mapeada na memória, em que parte do espaço de endereço da memória é mapeada para uma peça de hardware. Em vez de ir para a memória principal, as leituras e gravações de e para essa região da memória vão para o hardware correspondente. O que eles querem dizer depende do hardware e da região (não é incomum ter mais de uma região de E / S mapeada na memória na mesma peça de hardware); ler e gravar nele poderia ter um efeito especial (como é comum em portas de E / S) ou simplesmente ler e gravar diretamente na memória do hardware (por exemplo, o buffer de quadros da placa de vídeo).

Na outra direção (o restante do hardware está falando com o software em execução na CPU), também há várias maneiras. O mais simples seria aguardar a solicitação do software (por meio de uma porta de E / S ou E / S mapeada por memória); usado sozinho, isso pode ser muito ineficiente.

Outra forma é o hardware gravar diretamente na memória principal. Isso é muito eficiente para transferir grandes quantidades de dados e também pode ser usado na outra direção (para ler a partir da memória principal). No entanto, o software ainda precisa saber quando a transferência está concluída.

O último caminho é interrompido. A CPU recebe uma solicitação de interrupção, juntamente com o número da interrupção. A CPU interrompe (assim o nome) o que estava fazendo e alterna para outra parte do código (que parte depende do número da interrupção). Geralmente, cada hardware corresponde a um único número de interrupção, mas os números de interrupção geralmente são compartilhados por várias fontes de interrupção. Existem também tipos especiais de interrupção que não possuem um número; por exemplo, o NMI.

Para um exemplo prático, vamos pegar uma placa de interface de rede simples. Esta placa de rede possui um conjunto de registros, que podem ser acessados via portas de E / S ou I / O mapeadas na memória. Ele também pode ler e gravar na memória principal e possui um pino de interrupção.

Para enviar um pacote à rede, o driver da placa de rede grava primeiro o pacote completo na memória, em um endereço alinhado a um múltiplo de 4 bytes. Em seguida, ele grava em alguns registradores na placa de interface de rede, informando o endereço de memória, o tamanho do pacote e algumas outras informações. A placa de rede lê o pacote da memória, envia-o para a rede e sinaliza a interrupção. O controlador de interrupção (uma peça separada de hardware) envia a solicitação de interrupção para a CPU e informa o número da interrupção. No manipulador de interrupções, o motorista lê um registro do cartão que diz que a interrupção era sobre um pacote sendo enviado, lê outro registrador para descobrir qual pacote foi enviado e sabe que agora pode reutilizar a memória em que havia escrito o pacote. .

Para receber pacotes da rede, o driver da placa de rede aloca um bloco de memória a ser usado como armazenamento para os pacotes e grava vários registros na placa informando o endereço de memória do bloco de memória, seu tamanho e alguma outra informação. Quando um pacote é recebido da rede, a placa de rede o grava nesse bloco de memória, juntamente com o tamanho do pacote e algumas outras informações. Ele atualiza alguns registros que informam a ele e ao driver quanto espaço livre há nesse bloco de memória, onde o espaço livre começa e onde o espaço usado começa (o buffer é circular, portanto, depois de chegar ao fim, ele rola para o início). Finalmente, sinaliza sua interrupção. O driver lerá os registros e a memória para obter o (s) pacote (s) e atualizará os registros para informar à placa que o espaço está livre novamente.

Existem outras coisas que o cartão pode informar ao motorista escrevendo seus registros e sinalizando uma interrupção; por exemplo, que o cabo de rede foi desconectado, que houve um erro de transmissão e assim por diante.

    
por 19.03.2010 / 16:40
1

O que você está procurando é " IRQ ", Interromper solicitações do hardware para a CPU. Existe um artigo básico aqui .

    
por 11.03.2010 / 22:51
0

Isso seria o que os drivers de hardware são para. Além disso, o Windows agora usa um HAL (Hardware Abstraction Layer) no lugar do DOS.

    
por 11.03.2010 / 22:48