
Passei por algumas aulas básicas de sistemas operacionais, séries de vídeos, etc., e tenho essa dúvida em relação aos drivers do sistema operacional versus drivers do BIOS. Como um sistema operacional básico conhece o endereço de memória de cada peça de hardware? Como um sistema operacional funciona imediatamente em qualquer computador. Existe um layout de memória de dispositivo padrão que todos conhecem? Ou o sistema operacional redirecionaria seu IVT para apontar para drivers de dispositivos BIOS? Por favor, indique-me algum material de leitura para este tópico.
Responder1
Como um sistema operacional básico conhece o endereço de memória de cada peça de hardware? Como um sistema operacional funciona imediatamente em qualquer computador.
A CPU conhece apenas o primeiro endereço a ser executado. O BIOS/Firmware deve "responder" a este endereço para que a CPU seja inicializada.
E para memória e E/S (espero que você saiba que existem 2 espaços no x86: Memória e E/S, certo?) havia muitos padrões.
Primeira era dos PCs
Havia uma área semi-oficial na memória chamada BIOS DATA AREA. Ele continha algumas informações sobre o número de portas COM e LPT, controladores de unidade de disquete, seus endereços básicos de E/S e assim por diante. O sistema operacional também usou chamadas de BIOS (documentadointerrupções) para acessar o hardware. Fornecedor de placa-mãecodificadoque aborda o BIOS. Alguns dispositivos tinham endereços de E/S oficialmente documentados.
Placas de extensão como ISA não tinham nenhuma ferramenta para ser detectada, exceto BIOS de placas de extensão: o BIOS do sistema verificava a memória em busca de padrões especiais para encontrar o BIOS da placa de extensão e executá-lo. O BIOS da placa pode se instalar como um vetor de interrupção para "sombra" das funções do BIOS para permitir a inicialização da rede, etc.
Em muitos casos, era responsabilidade do usuário configurar a placa com jumpers e fornecer informações ao software (como BLASTER
variável env para parâmetros do sound blaster, etc.).
Era PnP
PnP é um pacote de especificações sobre detecção de hardware. Havia ISA PNP, COM PORT PNP, LPT PNP etc. As especificações descrevem o que o software deve fazer para verificar qual dispositivo está conectado e como o dispositivo deve agir. Alguns barramentos como PCI possuem capacidade PNP integrada. O software pode enumerar todas as placas PCI e perguntar sobre os recursos necessários, seu fornecedor e classe (para encontrar o driver), etc., e então configurá-las. A enumeração também é possível para USB.
"Software", neste caso, pode ser PNPBIOS ou sistema operacional habilitado para PNP. Portanto, o BIOS usou essas especificações para encontrar o dispositivo de inicialização e a ponte PCI Host ("raiz" do barramento PCI) e armazenou essas informações em tabelas especiais na memória (de acordo com a especificação PNPBIOS) e o sistema operacional as leu e usou recursos PCI e USB para enumerar e habilitar dispositivos (os protocolos PCI e USB estão documentados).
Era ACPI
As tabelas ACPI são preenchidas pelo fornecedor da placa-mãe e armazenadas no firmware (o firmware moderno énão"BIOS, mas pode emulá-lo).
Uma tabela especial chamada DSDT descreve qualquer dispositivo do sistema, incluindo botões especiais de laptop, bateria de laptop, ventiladores, complexo raiz PCI-Express e assim por diante.
Os dispositivos são descritos em linguagem chamada AML e o SO deve ter seu intérprete. DSDT pode descrever memória, IO e "métodos" (também escritos em AML) para fazer algumas coisas como "alterar brilho".
ACPI é uma especificação enorme. O sistema operacional usa DSDT para preencher sua "árvore de dispositivos" interna e, uma vez obtido acesso ao "complexo raiz PCI-Express" ou USB raiz, ele usa os protocolos PCI-Express e USB para fazer enumeração e configuração adicionais: a placa pode relatar que suporta memória intervalo A e B, e o sistema operacional o configura para usar "B".
Responder2
A maioria dos sistemas operacionais é composta de vários componentes, como gerenciador de memória, entrada e saída, gerenciador de sistema de arquivos, etc. Anos atrás, com sistemas operacionais monolíticos, tudo era construído junto. A maioria dos sistemas operacionais modernos tem alguma maneira de ativar e desativar dinamicamente os vários componentes. Alguns sistemas operacionais, micro kernels, possuem apenas uma funcionalidade básica de gerenciamento para o sistema operacional, com a maioria dos componentes adicionais, como o sistema de arquivos, sendo adicionados em partes.
Os sistemas operacionais modernos também são construídos em uma série de camadas, semelhante ao modelo OSI para pilhas de rede (consultehttps://en.wikipedia.org/wiki/OSI_model) para fornecer o máximo de independência possível do hardware real em que estão sendo executados.
Portanto, o sistema operacional é basicamente uma máquina abstrata na qual estão conectados módulos concretos e específicos de hardware. Existem especificações de interface, que tendem a ser uma descrição abstrata da máquina, que descrevem o controle, os dados e os serviços que os módulos específicos de hardware devem fornecer ao sistema operacional.
Portanto, um instalador de uma pilha de driver de dispositivo específica conhece suas necessidades específicas e concretas de hardware e faz interface com um dispositivo, mas o sistema operacional não conhece essas necessidades concretas e específicas de hardware. O sistema operacional delega todas as coisas específicas do dispositivo à pilha de drivers de dispositivo.
Eu uso a palavra “pilha” porque a funcionalidade que realiza a comunicação real do dispositivo normalmente é composta de uma série de camadas. Você pode ver isso com o Gerenciador de Dispositivos do Windows na maioria dos dispositivos que mostram um conjunto de arquivos de driver que estão sendo usados para um dispositivo específico.
Portanto, existem vários componentes de software que podem, na verdade, vir de diferentes fornecedores.
Portanto, se o sistema operacional quiser saber detalhes sobre o hardware, ele solicitará esses detalhes ao driver do dispositivo.
Um sistema operacional funciona imediatamente em uma variedade de plataformas de hardware porque os fornecedores do hardware específico que compõe a plataforma fornecem a pilha de drivers de que o sistema operacional precisa para funcionar no hardware concreto e específico.
Diferentes sistemas operacionais terão diferentes especificações de interface para os drivers de dispositivo que o sistema operacional foi projetado para usar. Portanto, para Linux, você deve ter drivers compatíveis com o sistema operacional Linux que forneçam a interface do driver Linux. Para Windows você precisa ter drivers de interface do Windows.
Como existe uma pilha de drivers, pode ser que alguns dos componentes de software da pilha sejam os mesmos entre diferentes sistemas operacionais, desde que o mesmo hardware esteja sendo usado. As partes da camada que se comunicam diretamente com o dispositivo de hardware podem ser as mesmas, mas os níveis superiores da pilha, aqueles que devem fazer interface com o sistema operacional real, serão diferentes, pois diferentes sistemas operacionais têm diferentes interfaces de driver de dispositivo.
Existem muitos livros disponíveis sobre sistemas operacionais e muitos projetos de código aberto para vários sistemas operacionais.
Dê uma olhada nesta discussãohttps://www.quora.com/What-is-the-best-book-on-operating-systems
Existem vários livros online gratuitos, comohttp://pages.cs.wisc.edu/~remzi/OSTEP/
E dê uma olhada nesta página do github sobre sistemas operacionais de código abertohttps://github.com/showcases/open-source-operating-systems
Responder3
Em um PC moderno, cada peça de hardware informa algumas informações básicas sobre si mesma quando solicitada. Por exemplo, muitos periféricos estão conectados aoBarramento PCI. Quando o SO deseja saber quais periféricos estão conectados ao barramento PCI, ele envia uma instrução no barramento solicitando que cada periférico envie uma descrição. Isso é chamadoenumerando(os dispositivos ligados) no barramento. Esta descrição utiliza um código numérico para identificar cada modelo de dispositivo denominadoID PCI. Quando o sistema operacional percebe que um dispositivo com um determinado ID PCI está presente, ele tenta carregar um driver para esse ID PCI; se o sistema operacional não tiver um driver, ele poderá tentar baixar um ou informar ao usuário que um dispositivo desconhecido está presente.
Por exemplo, no Linux, você pode executar o comando lspci
para listar os dispositivos PCI. Possui várias opções para exibir diferentes tipos de informações, brinque um pouco se estiver curioso. Descrevo o mecanismo que o Linux usa para carregar um driver para um dispositivo PCI emesta resposta. Esse é apenas um exemplo; outros sistemas operacionais de PC possuem um mecanismo para fazer a mesma coisa, mas esse mecanismo pode ser completamente diferente.
Como o sistema operacional sabe que existe um barramento PCI e como acessá-lo? Acho que isso está codificado se você construí-lo para uma arquitetura de PC. Observe que a “arquitetura de PC” é mais específica que a “CPU x86” — você poderia colocar um conjunto diferente de barramentos em torno de uma CPU x86, mas então ela não seria chamada de PC (moderno).
Diferentes arquiteturas de máquinas podem ou não ter maneiras de enumerar os drivers presentes. Por exemplo, o PC até meados da década de 1990 não possuía tais métodos. Antes do barramento PCI, havia oBarramento ISA. Em um barramento ISA, se você quiser saber se um dispositivo está presente em um determinado endereço, envie um comando para ele. Se você obtiver uma resposta que entenda, ótimo. Se o comando travar o computador ou causar um efeito indesejado porque há um periférico completamente diferente, difícil. Em um PC da década de 1908, o sistema operacional perguntou ao BIOS sobre os dispositivos que foram configurados (mas o BIOS não listou todos os dispositivos, apenas os tipos de dispositivos que o BIOS conhecia), e o usuário que instalou uma placa de extensão precisava fornecer seu detalhes de configuração no BIOS ou na configuração do sistema operacional. O BIOS incluía alguns drivers básicos para teclado e tela, e sistemas operacionais como o DOS chamavam esses drivers; outros sistemas operacionais (ou aplicativos) podem acessar o hardware diretamente (especialmente para exibição, pois os drivers do BIOS eram lentos e limitados).
Ainda hoje, a maioria dos sistemas embarcados não tem como enumerar os periféricos integrados. Muitos dispositivos (especialmente baseados em ARM, mas não apenas) descrevem seus periféricos em uma estrutura de dados chamadaárvore de dispositivos. Esta estrutura de dados é armazenada em ROM ou memória flash e ocarregador de inicialização(o equivalente ao BIOS) comunica os dados ao sistema operacional. Dessa forma o SO não precisa ser construído para um conjunto específico de dispositivos, ele lê essas informações ao iniciar.