lspci “Memória em…” vs / proc / bus / pci / devices BAR address

4

Eu tenho um aplicativo de espaço do usuário que eu uso para gravar nos registradores de um dispositivo pci. Leva o endereço de memória de base do dispositivo como um argumento. Em vez de procurar por lspci em cada plataforma, eu queria escrever um script bash para usar o ID do fornecedor / dispositivo para procurar o endereço base e chamar o aplicativo.

Vamos usar um controlador de rede Intel com o ID de dispositivo '0891' como exemplo. Isso está em uma caixa do Ubuntu, mas eu preciso que ele funcione em diferentes distribuições Linux.

Pensei em apenas analisar a saída de lspci com algo assim:

lspci -vn | grep -A 3 0891 | grep Memory | awk '{print $3}'

que produz:

f0500000

Mas estou interessado em obter o endereço base de algum lugar no sistema de arquivos, em vez de confiar em outro aplicativo, então tentei:

cat /proc/bus/pci/devices | grep 0891 | awk '{print $4}'

Isso produz:

f0500004

Por que o segundo valor é compensado por 4 bytes?

Pergunta bônus: Onde posso obter endereços de memória base do dispositivo PCI que funcionarão em distribuições sem depender de outros aplicativos, como o lspci?

    
por Tanner 30.12.2015 / 06:31

1 resposta

2

Do que eu posso determinar o formato de 0x ???? 0004 comunica algumas informações adicionais. O bit 2 indica que o BAR é um endereço 1 = 64 bits, 0 = 32 bits, o bit 3 indica que a região da memória é 1 = pré-cabível, 0 = não pré-cabível.

    
por 12.07.2016 / 23:52

Tags