Acessando informações de hardware UEFI do Linux

0

Eu quero obter informações sobre hardware por meio do UEFI. Eu sei, eu posso pegar as variáveis efi e fazer o dump usando a ferramenta fwts no Linux. Além disso, eu sei sobre o comando "device" para o shell EFI, que mostrará todos os dispositivos gerenciados pela UEFI. Mas eu não vejo o método, como eu posso obter essa informação do Linux. Eu sei, há uma variedade de métodos para obter informações sobre o hardware usando outras ferramentas, mas eu quero saber se isso é possível usando UEFI (isso se para o meu estudo).

    
por luckydemon 17.10.2018 / 18:57

1 resposta

0

Não há dispositivos gerenciados pelo UEFI. Porque o sistema operacional Linux chamou a função UEFI ExitBootServices. Isso é necessário para permitir que o SO inicie o gerenciamento de qualquer dispositivo.

OS modernos incluem drivers para dispositivos de hardware. Um único dispositivo não deve ser acionado por dois drivers diferentes. Isso inclui dispositivos pai / "barramentos", que são usados para enumerar e se comunicar com seus dispositivos filhos.

Por exemplo, um hub USB em seu monitor, que você conecta ao seu computador através de uma porta USB-C, que está em uma placa PCI-E conectada a um slot PCI-E na placa-mãe. Seu firmware de inicialização pode ter a capacidade de carregar um executável EFI de um dispositivo de armazenamento USB conectado a essa porta USB. Mas quando você executa esse executável e chama o UEFI ExitBootServices, ele pode assumir o controle de todos eles.

Portanto, a regra geral é que o sistema operacional é o que enumera o hardware conectado. O firmware não tem mais controle. Você não pode pedir ao firmware para enumerar o hardware atualmente conectado e obter qualquer resultado sensato.

Existem exceções à regra geral. Eles são todos muito horríveis de se lidar. A pergunta, conforme escrita, não inclui nenhum motivo para enumerar todas as exceções que se aplicam à sua máquina. Então não faça isso.

Algumas informações de hardware estão disponíveis por meio de ACPI e DMI. As tabelas ACPI são tecnicamente fornecidas através de UEFI, em virtude da passagem de um ponteiro (e suponho que deixando a memória relevante reservada, no mapa de memória em que o SO é passado pela UEFI). Presumivelmente, o DMI é semelhante.

O comando DMI é dmidecode . O DMI parece ser principalmente uma coleção de identificadores. Alguns deles são reunidos a partir do hardware no momento da inicialização. Nenhum destes é necessário para ser abrangente, então basicamente você precisa ter drivers de ônibus para encontrar todos os dispositivos de hardware que você precisa.

Existem vários comandos ACPI incluindo acpidump e acpixtract . Uma das ferramentas é um desmontador de uma linguagem interpretada chamada AML, que o sistema operacional executa em várias ocasiões.

A AML pode soar um pouco horrível, mas pelo menos foi projetada para que você evite ter um driver de sistema operacional e um driver AML associado ao mesmo hardware e causar conflitos. Por exemplo, o sistema operacional tem um driver para um dispositivo Embedded Controller e a AML pode realmente conversar com o driver do sistema operacional. Ou a ACPI pode reservar certos recursos de hardware, para que a AML possa usá-los diretamente, e o sistema operacional sabe que não é permitido usá-los.

O ACPI também substitui a versão anterior do ISA PNP. Isso é usado para enumerar dispositivos legados como portas seriais, onde eles não podem ser enumerados pelo próprio sistema operacional.

Da mesma forma, a ACPI é nominalmente responsável por informar ao sistema operacional para procurar os registros iniciais da PCI ou endereços de memória IO. (Não estou em dia aqui. Mas se a ACPI disser que não há nenhuma, posso imaginar que o Linux tentaria investigar o endereço normal para isso de qualquer maneira).

Muitos dispositivos são acessados através do barramento PCI, direta ou indiretamente.

O IIRC Windows irá expor isso no Gerenciador de Dispositivos mostrando PCI como um dispositivo filho da ACPI. O Linux não parece se incomodar (eu tenho pci0000:00/ diretamente em /sys/devices ); Não me lembro se a ACPI- > PCI está em um formato especializado que basicamente não há exposição de pontos, ou se é o Linux que, em casos especiais, não se incomoda em expor a ACPI como o dispositivo pai.

    
por 17.10.2018 / 21:25