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