É possível obter as informações de uma árvore de dispositivos usando / sys de um kernel em execução?

20

Geralmente para sistemas arm, as árvores de dispositivos fornecem informações de hardware ao kernel (Linux). Essas árvores de dispositivos existem como arquivos dts (fonte da árvore de dispositivos) que são compilados e carregados no kernel. O problema é que não tenho acesso a esse dtsarquivo, nem mesmo a um dtbarquivo.

Eu tenho acesso a /syse /procna máquina e eu queria perguntar se isso me permitiria "adivinhar os valores corretos" para ser usado em uma dts?

Também uma resposta em potencial poderia destacar adicionalmente o aspecto, se a resposta a essa pergunta também depender de se a interface da árvore de dispositivos foi usada em primeiro lugar (ou seja, a dtbfoi criada e fornecida ao kernel) em vez de mais hackers ", simplesmente desviamos da baunilha e corrigir o kernel para solucionar o problema de informações do dispositivo apenas para o nosso kernel "-solution?

humanidade e paz
fonte
Você tem acesso à imagem de inicialização? Você pode extrair a árvore do dispositivo a partir daí. Eu posso ajudar.
Phk #

Respostas:

27

/proc/device-tree ou /sys/firmware/devicetree/base

Eu acho que ambos são pseudônimos, /sys/firmware/devicetree/baseprovavelmente sendo a melhor escolha depois de domesticar /proc.

Você pode acessar as propriedades dts dos arquivos:

 hexdump /sys/firmware/devicetree/base/apb-pclk/clock-frequency

O formato de saída para números inteiros é binário, então hexdumpé necessário.

dtc -I fs

Obtenha uma árvore de dispositivos completa no sistema de arquivos:

sudo apt-get install device-tree-compiler
dtc -I fs -O dts /sys/firmware/devicetree/base

envia os dts para stdout.

Veja também: Como listar a árvore de dispositivos do kernel | Troca de pilha Unix e Linux

dtc no Buildroot

O Buildroot tem uma BR2_PACKAGE_DTC=yconfiguração para colocar dtcdentro do sistema de arquivos raiz.

QEMU -machine dumpdtb

Se você estiver executando o Linux dentro do QEMU, o QEMU gerará automaticamente os DTBs se você não fornecer explicitamente -dtb, e também poderá despejá-lo diretamente com:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine dumpdtb=dtb.dtb

conforme mencionado em: https://lists.gnu.org/archive/html/qemu-discuss/2017-02/msg00051.html

Testado com esta configuração QEMU + Buildroot no kernel do Linux v4.19 arm64.

Ciro Santilli adicionou uma nova foto
fonte
4

Não sei se entendi corretamente.

Se você estiver em um sistema inicializado usando um dtb, sua árvore de dispositivos deverá estar acessível dentro de debugfs.

Você também pode experimentar as ferramentas dtc da Pantelis Antoniou, que incluem fdtdump e fdtget que imprimem dts a partir de um blob.

Se você não possui uma árvore de dispositivos e não inicializou a inicialização a partir de um dtb, precisará passar pelo código da máquina e adicionar todos os atributos e nós específicos do dispositivo aos seus dts. Não há uma árvore de dispositivo "sintética" gerada para essa inicialização. Um ponto de partida seria uma máquina ou pai semelhante e, em seguida, trabalhar seu sistema sistema por sistema.

FRob
fonte
Obrigado, para esclarecer. Há uma chance de que o dtbpode ser acessível através através dos debugfs ainda que contar com CONFIG_DEBUG_FSno .confige até mesmo se estiver definida ainda no mero capricho que eles realmente usou uma dtbpara começar, eu leio esse direito? Então, com um pouco de "azar", eles não usaram nenhum tipo de patch direto do kernel instalado na interface da árvore de dispositivos, certo? Então isso significa que o último recurso seria o código da máquina, uma vez que eles violam a GPLv2 e fecham a fonte do kernel, certo?
HumanidadeANDpeace
Sim e sim para os dois primeiros. Por fim, IANAL, mas o arco da máquina / ??? / mach - ??? / board - ???. C conteria os dispositivos especiais presentes para uma máquina em kernels antigos. Isso deve ser coberto pela GPL e deve estar disponível por uma taxa. Drivers de dispositivo individuais podem ter código fechado, sem violação.
FROB