OSDev http://osdev.su/ |
|
Назрел ряд вопросов PCI(X)/Memory Map http://osdev.su/viewtopic.php?f=6&t=3897 |
Страница 1 из 1 |
Автор: | TechnoWiz@rd [ 06 ноя 2019, 13:52 ] |
Заголовок сообщения: | Назрел ряд вопросов PCI(X)/Memory Map |
Доброго времени суток. Реализовываю модуль управления шиной PCI посему назрело несколько вопросов: 1) Как я понял при изменении BAR'ов требуется перекофигурировать бридж и указать ему какой диапазон адресов используют устройства к нему подключенные. Тут возникает вопрос как быть, если на устройствах подключенных к этой шине есть 32-х и 64-х битые BAR'ы, и даже одно устройство может иметь сразу оба типа, т.е. чтобы получить адекватный диапазон нужно размещать MMIO регисты в пределах первых 4-х гигабайт, если на шиние висит хотябы удно устройство с 32-х битным BAR'ом ? Как пример из атача: Видеокарта NVIDIA GTX970 [001:00:00] имеет два 64-х битных BAR'а и один 32-х битный... Тогда зачем вообще 64-х битные BAR'ы ? Вложение:
Комментарий к файлу: Список PCI устройств, брижди и хаб пропущены, чтобы влезть на экран. PCI.jpg [ 1.85 МБ | Просмотров: 12943 ] 2) По поводу карты памяти, в ней есть диапазоны MMIO, но они не совпадают с реальными MMIO устройств на шине PCI, что это за MMIO такие и кто их использует и будут ли они актуальны после переконфигурирования PCI шины и устройств на ней ? И опять таки Reserved диапазоны, кем и для чего они зарезервированы ? Карта памяти с того-же ПК что и список функций PCI Вложение:
Комментарий к файлу: Карта памяти, отображены только области помеченне как MMIO и Reserved mmap.jpg [ 1.96 МБ | Просмотров: 12943 ] 3) Корневой хаб так-же как и бриджи требует конфигурацию диапазонов подчиненных устройств, или он транслирует всё напрямую ? И если требует, где про это почитать ? (Заголовок у него нулевого типа, как и у функций) |
Автор: | pavia [ 06 ноя 2019, 14:17 ] |
Заголовок сообщения: | Re: Назрел ряд вопросов PCI(X)/Memory Map |
3) Кофигурирование не изменилась, в угоду совместимости. Так что да требуется. 2) Это PCI Hole из-за того что биос лочит их изменения подвинуть их нельзя. Это связано ремапингом банков памяти. т.е контроллер памяти что-бы не терять 4-тый гб переотображает его на гигабайт выше. А 4 гб традиционно отдается для PCI устройств. В приделах этих диапазонов вы можете настраивать ваши BAR. По мимо PCI устройств в PCI Hole также располагаются APIC и Флешка-биоса. 1) Тут чисто для удобства вашей ОС. Если у вас ОС 32 битная то все BAR загоняете в 4-тый ГБ. А если 64 битная. То BAR32 в 4Гб а BAR64 там где MMAP указал. Последние могут оказаться больше 1 Гб. |
Автор: | TechnoWiz@rd [ 06 ноя 2019, 14:54 ] |
Заголовок сообщения: | Re: Назрел ряд вопросов PCI(X)/Memory Map |
Благодарю за ответы. В целом ситуация прояснилась. -- 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 шины, а не порты самих устройств. |
Автор: | pavia [ 07 ноя 2019, 06:21 ] |
Заголовок сообщения: | Re: Назрел ряд вопросов PCI(X)/Memory Map |
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 устройства. |
Автор: | TechnoWiz@rd [ 07 ноя 2019, 09:21 ] |
Заголовок сообщения: | Re: Назрел ряд вопросов PCI(X)/Memory Map |
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 |
Автор: | TechnoWiz@rd [ 08 ноя 2019, 14:59 ] |
Заголовок сообщения: | Re: Назрел ряд вопросов PCI(X)/Memory Map |
Вот сдампил полную карту памяти с того 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) |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |