Нет.Адрес в BAR является физическим адресом начала BAR.Таким образом, устройство знает, когда и как ответить на запрос чтения или записи из памяти.Например, допустим, что BAR (BAR0) имеет длину 128 КБ и базовый адрес 0xb840 0000
, тогда устройство ответит на чтение или запись в память по любому из этих адресов:
0xb840 0000
0xb840 0080
0xb840 1184
0xb841 fffc
но НЕ по любому из этих адресов:
0x5844 0000 (Below BAR)
0xb83f 0000 (Below)
0xb83f fffc (Below)
0xb842 0000 (Above BAR)
0xe022 0000 (Above)
Это было более важно в исходном PCI, где шина была фактически общей средой, и устройства могли видеть запросы на адреса, принадлежащие другим устройствам.,С архитектурой PCI-Express «точка-точка» только «мосты» PCI будут когда-либо видеть запросы адресов памяти, которыми они не владеют.Но он все еще работает точно так же.А младшие биты адресного пространства по-прежнему позволяют устройству назначать различные функции / операции различным частям пространства (как в вашем устройстве, создавая отдельное окно памяти, к которому вы пытаетесь обратиться).
ТеперьКак вы как программист обращаетесь к области памяти BAR - это другой вопрос.Практически для всех современных систем все обращения к памяти , осуществляемые программами, осуществляются по виртуальным адресам.Таким образом, чтобы ваш доступ к памяти достиг устройства, необходимо сопоставить виртуальный адрес с физическим адресом.Обычно это делается с помощью таблиц страниц (хотя некоторые архитектуры, такие как MIPS, имеют выделенную область виртуального адресного пространства, которая постоянно отображается на часть физического адресного пространства).
Точный механизм выделения виртуального адресного пространства и настройки таблиц страниц для сопоставления этого пространства с физическим адресным пространством BAR зависит от процессора и ОС.Таким образом, вам нужно будет выделить некоторое виртуальное адресное пространство, а затем создать таблицы страниц, отображающие от начала выделенного пространства до (BAR0) + 0x80000
, чтобы работать с вашим окном.(Я описываю это как два шага, но ваша ОС, вероятно, предоставляет один вызов функции для выделения виртуального адресного пространства и сопоставления его с физическим диапазоном одним махом.)
Теперь процесс назначения физическое адресное пространство для устройства (то есть на самом деле вставка адреса в BAR) обычно выполняется очень рано при инициализации системы BIOS системы или аналогичным механизмом ранней загрузки, покаПеречисление всех устройств PCI, установленных в системе.Требуемый размер адресного пространства определяется запросом устройства, после чего базовый адрес достаточно большой области физического адреса записывается в БАР.
Последний вопрос: почему ваше окно памяти имеет смещение 0x80000 в пределахадресное пространство устройства полностью зависит от устройства, и на него нельзя ответить более широко.