2

У меня есть следующий вывод от запуска lspci -vv -s 00:00 на моем одноплатном компьютере под управлением 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]

Выше приведен только пример выходных данных, и не совсем то, что я получаю, но оно содержит интересующие элементы.

Я понимаю большую часть вывода команды lspci , но мне бы хотелось, чтобы кто-то объяснил мне строки, начинающиеся с Region ...На какой тип памяти я смотрю, указанную в строке Region? Как я могу получить к нему доступ? С учетом этого я пытаюсь установить связь между двумя одноплатными компьютерами, подключенными по шине PCI. Я должен иметь возможность говорить напрямую. Все, что есть PCI-арбитр, управляющий шиной. Это то, что я сделал до сих пор ...

Я создал модуль ядра Linux для исходящего PCI-трафика. По сути, он отображает весь путь из пользовательского пространства (с приложением пользовательского пространства), используя реализацию драйвера mmap. Я пишу в местоположение, возвращаемое mmap, и на самом деле вижу трафик с помощью анализатора шины! Теперь на другом одноплатном компьютере я пытаюсь прочитать его ресурс sysfs для устройства PCI, но вижу только все FF и никаких изменений.

Будем весьма благодарны за любые советы или объяснения того, как происходит все это отображение памяти, включая PCI. Спасибо!

2 ответа2

2

В устройствах PCI/PCI-X/PCI-E имеются регистры BAR в пространстве конфигурации PCI. И во время загрузки Linux Kernel он сканирует шину PCI, находит все устройства PCI, включая мост PCI-PCI и устройства PCI. И ядро проверит, сколько BAR есть в конфигурационном пространстве устройств PCI. И проверьте, сколько памяти требуется каждому BAR, и тип памяти, записав 0xFFFFFFFF в регистр BAR. Затем ядро выделит ресурсы пространства памяти для устройств PCI.

В вашем случае Region lion показывает регистры BAR.

В каждом соответствующем драйвере устройства можно получить базовый физический адрес, который ядро Linux выделяет для каждого BAR, вызывая pci_resource_start() и вызывая pci_iomap() для сопоставления базового физического адреса с виртуальным адресом ядра, или используя remap_pfn_range() для его реализации. Метод mmap для процесса пользовательского пространства для сопоставления физического адреса с виртуальным адресом процесса пользовательского пространства.

2

Регистры на устройствах являются либо IOmapped, либо отображены в памяти.(True для x86) Регион показывает, в каком виртуальном адресе ядра эти регистры отображаются. В этом случае они отображаются в памяти в виртуальном адресном пространстве ядра iven.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .