OSDev

для всех
Текущее время: 13 ноя 2019, 23:26

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Назрел ряд вопросов PCI(X)/Memory Map
СообщениеДобавлено: 06 ноя 2019, 13:52 
Аватара пользователя

Зарегистрирован: 15 дек 2015, 11:12
Сообщения: 12
Доброго времени суток. Реализовываю модуль управления шиной PCI посему назрело несколько вопросов:

1) Как я понял при изменении BAR'ов требуется перекофигурировать бридж и указать ему какой диапазон адресов используют устройства к нему подключенные. Тут возникает вопрос как быть, если на устройствах подключенных к этой шине есть 32-х и 64-х битые BAR'ы, и даже одно устройство может иметь сразу оба типа, т.е. чтобы получить адекватный диапазон нужно размещать MMIO регисты в пределах первых 4-х гигабайт, если на шиние висит хотябы удно устройство с 32-х битным BAR'ом ? Как пример из атача: Видеокарта NVIDIA GTX970 [001:00:00] имеет два 64-х битных BAR'а и один 32-х битный... Тогда зачем вообще 64-х битные BAR'ы ?

Вложение:
Комментарий к файлу: Список PCI устройств, брижди и хаб пропущены, чтобы влезть на экран.
PCI.jpg
PCI.jpg [ 1.85 МБ | Просмотров: 94 ]


2) По поводу карты памяти, в ней есть диапазоны MMIO, но они не совпадают с реальными MMIO устройств на шине PCI, что это за MMIO такие и кто их использует и будут ли они актуальны после переконфигурирования PCI шины и устройств на ней ? И опять таки Reserved диапазоны, кем и для чего они зарезервированы ?
Карта памяти с того-же ПК что и список функций PCI

Вложение:
Комментарий к файлу: Карта памяти, отображены только области помеченне как MMIO и Reserved
mmap.jpg
mmap.jpg [ 1.96 МБ | Просмотров: 94 ]


3) Корневой хаб так-же как и бриджи требует конфигурацию диапазонов подчиненных устройств, или он транслирует всё напрямую ? И если требует, где про это почитать ? (Заголовок у него нулевого типа, как и у функций)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Назрел ряд вопросов PCI(X)/Memory Map
СообщениеДобавлено: 06 ноя 2019, 14:17 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1117
3) Кофигурирование не изменилась, в угоду совместимости. Так что да требуется.
2) Это PCI Hole из-за того что биос лочит их изменения подвинуть их нельзя. Это связано ремапингом банков памяти.
т.е контроллер памяти что-бы не терять 4-тый гб переотображает его на гигабайт выше. А 4 гб традиционно отдается для PCI устройств.

В приделах этих диапазонов вы можете настраивать ваши BAR.

По мимо PCI устройств в PCI Hole также располагаются APIC и Флешка-биоса.

1) Тут чисто для удобства вашей ОС. Если у вас ОС 32 битная то все BAR загоняете в 4-тый ГБ.
А если 64 битная. То BAR32 в 4Гб а BAR64 там где MMAP указал. Последние могут оказаться больше 1 Гб.


Последний раз редактировалось pavia 06 ноя 2019, 15:15, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Назрел ряд вопросов PCI(X)/Memory Map
СообщениеДобавлено: 06 ноя 2019, 14:54 
Аватара пользователя

Зарегистрирован: 15 дек 2015, 11:12
Сообщения: 12
Благодарю за ответы. В целом ситуация прояснилась.

-- UPD --
Разобрался по первому вопросу окончательно, регистры устройства могут быть только в 32-х битном пространстве. А буфферы и прочая память на устройстве могут быть и 64-х битными. В области конфигурации мостов PCI-PCI, какраз две пары отдельных регистров, одна пара 32-х битная, определяющая базу и лимит транслируемых адресов для доступа к регистрам. И пара 64-х битных, которые описывают диапазон реальной(Prefetchable) отображаемой памяти устройства.

По второму: интересно почему EFI отобразил все PCI устройства строго ниже(F000 0000 - F314 0000), им-же настроенной PCI hole(F800 0000 - 1 0000 0000), в область отмеченную в MemoryMap как RAM ? Тонкий намёк что ОС в любом случае должна перенастроить PCI шину под себя ?
Понял, там отображается только конфигурационное пространство PCI Express шины, а не порты самих устройств.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Назрел ряд вопросов PCI(X)/Memory Map
СообщениеДобавлено: 07 ноя 2019, 06:21 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1117
TechnoWiz@rd писал(а):
Разобрался по первому вопросу окончательно, регистры устройства могут быть только в 32-х битном пространстве. А буфферы и прочая память на устройстве могут быть и 64-х битными.

Это просто совпадение. Такого деления нету толи у NVidia толи у AMD регистров 128 мб. ;)

TechnoWiz@rd писал(а):
В области конфигурации мостов PCI-PCI, какраз две пары отдельных регистров, одна пара 32-х битная, определяющая базу и лимит транслируемых адресов для доступа к регистрам. И пара 64-х битных, которые описывают диапазон реальной(Prefetchable) отображаемой памяти устройства.

Prefetchable - предварительная выборка. Это для буферов и памяти устанавливается, для ускорения.
То что они 64 битные это просто совпадение. Бывает и наоборот.


TechnoWiz@rd писал(а):
По второму: интересно почему EFI отобразил все PCI устройства строго ниже(F000 0000 - F314 0000), им-же настроенной PCI hole(F800 0000 - 1 0000 0000), в область отмеченную в MemoryMap как RAM ? Тонкий намёк что ОС в любом случае должна перенастроить PCI шину под себя ?
Понял, там отображается только конфигурационное пространство PCI Express шины, а не порты самих устройств.

Я не сразу посмотрел на MMAP да там походу указаны только APIC-ки и флешка-биса. У вас же 4 ядра?
Так что размеры PCI hole надо отдельно определять по мостам.
MMAP пропустил регион DD154000-F8000000. Вот в нём в теории вы можете расположить все PCI устройства.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Назрел ряд вопросов PCI(X)/Memory Map
СообщениеДобавлено: 07 ноя 2019, 09:21 
Аватара пользователя

Зарегистрирован: 15 дек 2015, 11:12
Сообщения: 12
pavia писал(а):
TechnoWiz@rd писал(а):
Разобрался по первому вопросу окончательно, регистры устройства могут быть только в 32-х битном пространстве. А буфферы и прочая память на устройстве могут быть и 64-х битными.

Это просто совпадение. Такого деления нету толи у NVidia толи у AMD регистров 128 мб. ;)
...
Prefetchable - предварительная выборка. Это для буферов и памяти устанавливается, для ускорения.
То что они 64 битные это просто совпадение. Бывает и наоборот.

Я не совсем правильно выразился, конечно деления на чисто RAM и регистры нет. Но Prefetchable - это такие регистры которые могут читаться за несколько транзакций, задом наперед и вообще как угодно и при этом не изменят состояния устройства до тех пор пока значение этого регистра целиком не будет передано CPU. Только такие регистры и память могут быть 64-х битными. Это требование прямо прописано в спецификации PCI Express(Бит - признак 64-х битного BAR'а позволено устанавливать только с битом Prefechable). Регистры которые должны быть прочитаны за одну транзакцию и никак иначе для PCI Express допускаются только в Legacy устройствах, и могут иметь только 32-х битный BAR. Приведу пример, может не совсем точный, но суть передающий:
Допустим у нас есть устройство с 32-х битным портом, каждый раз при чтении из которого возвращается ячейка таблицы и внутренний индекс ячейки увеличивается на 4 байта. Мы запрашиваем считать DWORD из этого регистра, контроллер считывает первый байт и тут на шине происходит более приоритетный запрос и вот тут будет два варианта поведения контроллера:

1) BAR располагается в Prefechable области памяти - контроллер откладывает текущую транзакцию и выполняет более приоритетную, а устройство тем временем считает что операция чтения завершена и инкриментирует внутренний индекс. После выполнения приоритетной транзакции, контроллер возвращается к чтению нашего DWORD'а и дочитывает оставшиеся три байта, но, индекс таблицы уже изменился, и у нас в DWORD солянка из одного байта первой ячейки таблицы и трех байт второй ячейки, что не есть хорошо.
2) BAR располагается не в Prefechabe области памяти - контроллер придерживает более приоритетную транзакцию до того момента, пока не будет вычитано всё двойное слово целиком, из-за чего страдает время отклика более приоритетных устройств на этой шине.

pavia писал(а):
Я не сразу посмотрел на MMAP да там походу указаны только APIC-ки и флешка-биса. У вас же 4 ядра?
Так что размеры PCI hole надо отдельно определять по мостам.
MMAP пропустил регион DD154000-F8000000. Вот в нём в теории вы можете расположить все PCI устройства.

Да, если еще точней, то Haswell i7 4770k


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Назрел ряд вопросов PCI(X)/Memory Map
СообщениеДобавлено: 08 ноя 2019, 14:59 
Аватара пользователя

Зарегистрирован: 15 дек 2015, 11:12
Сообщения: 12
Вот сдампил полную карту памяти с того PC. Получается 0xF8000000 - 0x100000000 - это область конфигурационного пространства PCI Express, а все MMIO устройств на шине сгруппированы в разрыве под ним. Вчера высчитывал размер у меня почему-то выходило что это пространство при 64-х шинах занимает 128 мегабайт, аккуратно байт в байт, сейчас выходит на половину меньше. 64 шины(рапорт от ACPI, в той-же MCFG таблице) * 32 устройства * 8 функций * 4096 байт = 64Мб... Или вчера уставший был или сегодня что-то упускаю...
Ну в любом случае областей куда запихнуть MMIO полно, так что задача решена.
Код:
0000 0000 0000 0000 - 0000 0000 0000 8000 RAM (32 KB - 32 768)
           ---- GAP (320 KB - 327 680) ----
0000 0000 0005 8000 - 0000 0000 0005 9000 Reserved memory (4096)
0000 0000 0005 9000 - 0000 0000 0005 F000 RAM (24 KB - 24 576)
           ---- GAP (256 KB - 262 144) ----
0000 0000 0009 F000 - 0000 0000 000A 0000 EFI runtime data (4096)
           ---- GAP (384 KB - 393 216) ----
0000 0000 0010 0000 - 0000 0000 C609 D000 RAM (~3,09 GB - 3 321 483 264)
           ---- GAP (~48 MB - 50 327 552) ----
0000 0000 C909 C000 - 0000 0000 C90A 3000 ACPI NVS (28 KB)
0000 0000 C90A 3000 - 0000 0000 C91F 8000 RAM (~1,33 MB - 1 396 736)
           ---- GAP (~10 MB - 10 461 184) ----
0000 0000 C9BF 2000 - 0000 0000 CA07 E000 EFI runtime data (~4,5 MB - 4 767 744)
0000 0000 CA07 E000 - 0000 0000 CA08 D000 RAM (60 KB - 61 440)
          ---- GAP (~303 MB - 317 460 480) ----
0000 0000 DCF4 E000 - 0000 0000 DCFB 6000 Reserved memory (416 KB - 425 984)
0000 0000 DCFB 6000 - 0000 0000 DD15 4000 Reserved memory (~1,6 MB - 1 695 744)
0000 0000 DD15 4000 - 0000 0000 DD19 0000 RAM (240 KB - 245 760)
0000 0000 DD19 0000 - 0000 0000 DD22 D000 ACPI NVS (628 KB - 643 072)
0000 0000 DD22 D000 - 0000 0000 DD23 3000 ACPI NVS (24 KB - 24 576)
0000 0000 DD23 3000 - 0000 0000 DD23 D000 ACPI NVS (40 KB - 40 960)
0000 0000 DD23 D000 - 0000 0000 DD97 0000 EFI runtime data (~7,2 MB - 7 548 928)
0000 0000 DD97 0000 - 0000 0000 DDEE 6000 EFI runtime data (~5,5 MB - 5 726 208)
0000 0000 DDEE 6000 - 0000 0000 DDEE 8000 EFI runtime data (8192)
0000 0000 DDEE 8000 - 0000 0000 DDF8 5000 EFI runtime data (628 KB - 643 072)
0000 0000 DDF8 5000 - 0000 0000 DDF9 D000 EFI runtime code (96 KB - 98 304)
0000 0000 DDF9 D000 - 0000 0000 DDFF F000 EFI runtime code (392 KB - 401 408)
0000 0000 DDFF F000 - 0000 0000 DE00 0000 RAM (4096)
        ---- GAP (416 MB - 436 207 616) ----
0000 0000 F800 0000 - 0000 0000 FC00 0000 MMIO (64 MB- 67 108 864)
0000 0000 FEC0 0000 - 0000 0000 FEC0 1000 MMIO (4096)
0000 0000 FED0 0000 - 0000 0000 FED0 4000 MMIO (16 KB - 16 384)
0000 0000 FED1 C000 - 0000 0000 FED2 0000 MMIO (16 KB - 16 384)
0000 0000 FEE0 0000 - 0000 0000 FEE0 1000 MMIO (4096)
0000 0000 FF00 0000 - 0000 0001 0000 0000 MMIO (16 MB - 16 777 216)
0000 0001 0000 0000 - 0000 0004 1F00 0000 RAM (~12,5 GB - 13 404 995 584)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB