Na saída de lspci -vv, o que significam as linhas de região?

2

Eu tenho a seguinte saída da execução de lspci -vv -s 00:00 no meu computador de placa única que executa o Linux.

07:05.0 RAID bus controller: Adaptec AAC-RAID (Rocket) (rev 03)
        Subsystem: Adaptec ASR-2230S + ASR-2230SLP PCI-X (Lancer)
        Control: I/O- Mem+ BusMaster+ SpecCycle+ MemWINV+ VGASnoop-
        ParErr- Stepping- SERR+ FastB2B-
        Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR-
        Latency: 64 (250ns min, 250ns max), Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 74
        Region 0: Memory at f7a00000 (64-bit, non-prefetchable) [size=2M]
        Region 2: Memory at f79ff000 (64-bit, non-prefetchable)
[Remaining output truncated]

O exemplo acima é apenas uma saída de exemplo e não exatamente o que estou obtendo, mas contém os itens de interesse.

Eu entendo a maior parte da saída do comando lspci , mas gostaria que alguém me explicasse as linhas que começam com Region ... Que tipo de memória estou observando aqui especificado pela Região? linha? Como posso acessá-lo? Com isso solicitado, estou tentando realizar a comunicação entre dois computadores de placa única conectados ao barramento PCI. Eu deveria poder falar diretamente. Tudo o que existe é um árbitro de PCI rodando o barramento. Isso é o que eu tenho feito até agora ...

Eu criei um módulo do kernel Linux para o tráfego PCI de saída. Basicamente, ele mapeia todo o caminho do userspace (com um aplicativo de espaço do usuário) usando a implementação mmap do driver. Eu escrevo para o local retornado pelo mmap e eu realmente vejo o tráfego com um analisador de ônibus! Agora, no outro computador de placa única, tento ler seu recurso sysfs para o dispositivo PCI, mas só vejo todos os FFs e nenhuma alteração.

Qualquer conselho ou explicação sobre como todo esse mapeamento de memória ocorre, envolvendo PCI, seria muito apreciado. Obrigado!

    
por penguin4hire 06.04.2013 / 00:42

2 respostas

2

Nos dispositivos PCI / PCI-X / PCI-E, existem registros BAR no espaço de configuração PCI. E durante a inicialização do Kernel do Linux, ele irá varrer o barramento PCI, encontrar todos os dispositivos PCI, incluindo ponte PCI-para-PCI e dispositivos PCI. E o kernel irá verificar quantas BARs existem no espaço de configuração dos dispositivos PCI. E verifique quanto espaço de memória cada BAR precisa e o tipo de espaço de memória escrevendo 0xFFFFFFFF no registro BAR. Então o kernel irá alocar os recursos de espaço de memória para os dispositivos PCI.

No seu caso, Region lion mostra os registros da BAR.

Em cada driver de dispositivo correspondente, pode-se obter o endereço físico base que o Kernel Linux aloca para cada BAR chamando pci_resource_start () e chamar pci_iomap () para mapear o endereço físico básico para o endereço virtual do kernel ou usando remap_pfn_range () para implementar um método mmap para o processo de espaço do usuário para mapear o endereço físico para o endereço virtual do processo de espaço do usuário.

    
por 06.04.2013 / 11:18
2

Os registros nos dispositivos são mapeados por IOmap ou em memória (true para x86) Região mostra em qual endereço virtual do kernel esses registros são mapeados. Neste caso, eles são mapeados para memória em um espaço de endereço virtual do kernel.

    
por 06.04.2013 / 15:55