Куда указывает PCI BAR0? - PullRequest
       17

Куда указывает PCI BAR0?

0 голосов
/ 14 октября 2018

У меня есть устройство PCI, у которого есть некоторый адрес памяти внутри BAR0.Я предполагаю, что этот адрес памяти является просто виртуальным адресом ОС, который указывает на некоторую физическую память устройства.Вопрос в том, куда это указывает?Читая документацию по устройству и исходный код прошивки, я заметил, что у этого устройства есть какой-то регистр, отвечающий за установку так называемых окон памяти.Я прыгал, что BAR0 будет точно указывать на них, однако это не тот случай и выглядит так:

адрес BAR0 -> Некоторая неизвестная память -> + 0x80000 Окно моей памяти

Так почемумое окно памяти смещено на 0x80000 от того места, на которое указывает BAR0, куда этот BAR0 указывает нам на + как оно кем-либо установлено?

Спасибо

1 Ответ

0 голосов
/ 15 октября 2018

Нет.Адрес в 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 в пределахадресное пространство устройства полностью зависит от устройства, и на него нельзя ответить более широко.

...