Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Конфигурирование BAR PCI
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
GrAlexI
Данный вопрос обсуждался, но возникают непонятки, да и на практике не могу разобраться, как назначается базовые адреса, да и как выделяется диапазон памяти?

Понятно конечно, что при установки младших 4 битов в значение "0000" (которые не изменяются) указываю, что требуется адрес для памяти ввода-вывода и этот адрес должен располагаться где-то в 32-разрядном адресном пространстве. А вот указание требуемого объема памяти, надо что-либо указывать?

Если требуется 64 байта тогда первые 6 бит указывают на мою память, а остальные фиксирована (указывает BIOS). Не надоли как-то указать эти 6 бит - 4 из которых имеют значение "0000" (смотреть выше) и остальные, например, установить в "1", а оставшиеся 26 бит - "0"?

После этого BIOS считывает установленные значения и записывает адрес в PCI устройство. И вот здесь возникает вопрос этот пройдённый адрес от BIOS - указатель на начало адресного пространство, которое необходимо сохранить или PCI устройство должно его как-то обработать?
Shivers
Цитата(GrAlexI @ Dec 28 2011, 11:54) *
Данный вопрос обсуждался, но возникают непонятки, да и на практике не могу разобраться, как назначается базовые адреса, да и как выделяется диапазон памяти?

Понятно конечно, что при установки младших 4 битов в значение "0000" (которые не изменяются) указываю, что требуется адрес для памяти ввода-вывода и этот адрес должен располагаться где-то в 32-разрядном адресном пространстве. А вот указание требуемого объема памяти, надо что-либо указывать?

Если требуется 64 байта тогда первые 6 бит указывают на мою память, а остальные фиксирована (указывает BIOS). Не надоли как-то указать эти 6 бит - 4 из которых имеют значение "0000" (смотреть выше) и остальные, например, установить в "1", а оставшиеся 26 бит - "0"?

После этого BIOS считывает установленные значения и записывает адрес в PCI устройство. И вот здесь возникает вопрос этот пройдённый адрес от BIOS - указатель на начало адресного пространство, которое необходимо сохранить или PCI устройство должно его как-то обработать?

Я может чтото не понимаю, но в чем собственно проблема?
Биос пишет FFFFFFFF, считывает значение, и по количеству непрописываемых единиц определяет размер памяти для устройства. Потом вычисляет прописывает BAR ... можно работать.
А вот как непрописываемые единицы устроены и сколько их - это зависит от самого устройства. У мостов часто делают специальный регистр маски, которым настраивает размер окна. В зависимости от маски и BAR в писиайном хеадере будет читаться по разному; т.е. размер может быть настраиваемым.
GrAlexI
Под фразой "Биос пишет FFFFFFFF", ты имеешь в веду, что BIOS записывает 2 раза BAR - сперва FFFFFFFF (определив необходимой памяти), а потом непосредственно адрес (на места где "1" при считывании)? То тогда все понятно. Я правильно размышляю?
Shivers
Цитата(GrAlexI @ Dec 28 2011, 16:15) *
Под фразой "Биос пишет FFFFFFFF", ты имеешь в веду, что BIOS записывает 2 раза BAR - сперва FFFFFFFF (определив необходимой памяти), а потом непосредственно адрес (на места где "1" при считывании)? То тогда все понятно. Я правильно размышляю?

Два раза минимум. Можете бут блок от какой нибудь материнки дизассемблировать и посмотреть исходники; сейчас куча инструментов лежит в свободном доступе для ковыряния биосов, можно что угодно разломать на модули, кроме разве что яблочного ифая который отличен от биоса.
GrAlexI
Огромное спасибо за разьяснение!!!!!

А не подскажишь при обращении к памяти ввода-вывода по типу операции C/BE = "0110" или "0111" (чтение, запись памяти), как программно обратится по этим операции. Точнее чтобы обратиться к блоку памяти имеются команды процессора или это реализуется на DMA? Я знаю для обращения к порту имеются команды inb, inw, outl и т.д., а как обратися к памяти?
Shivers
Цитата(GrAlexI @ Dec 28 2011, 18:14) *
Огромное спасибо за разьяснение!!!!!

А не подскажишь при обращении к памяти ввода-вывода по типу операции C/BE = "0110" или "0111" (чтение, запись памяти), как программно обратится по этим операции. Точнее чтобы обратиться к блоку памяти имеются команды процессора или это реализуется на DMA? Я знаю для обращения к порту имеются команды inb, inw, outl и т.д., а как обратися к памяти?

Я не программер )
Но с точки зрения хоста, обращение в Cfg делается так (в интелах и большинстве мипсов, очень распостраненный способ): есть регистр адреса - задаем адрес, функцию и команду. И есть регистр данных - туда кладем данные которые надо записать, и оттуда считываем если надо прочитать. Вероятно это и делают команды которые вы описали.
А вот пространство Memory просто мэппится в адресное пр-во процессора, возможно страничным способом, возможно напрямую. Опять же для настройки мэппинга у хоста есть регистр базового адреса ... впрочем тут лучше почитать литературу, как окна настраиваются, могу ошибиться; обычно этим занимается биос. Но резюмируя, в рабочей настроенной системе весь PCI Memory вы должны видеть в виде адресов процессора, т.е. прямой адресацией. И доступ тут может быть двумя способами: процессорный ввод/вывод (самый медленный способ), и DMA (т.е. сторонний мастер) который может выжать из PCI по максимуму. Про процессорный ввод/вывод писал выше - прямая адресация и т.д., а вот как DMA настраивается, это надо читать доку на контроллер DMA, которых может быть в системе несколько. В принципе, теоретически, типовой DMA контроллер должен программироваться - базовым адресом откуда_читать, базовым адресом в памяти куда_класть, и размером копируемой области. Кроме того, у контроллера DMA есть пара статусов о работе/ошибках и т.д., и обычно настраивается прерывание об окончании/сбое DMA.
Но, опять же, я железячник а не программер, и с интелами давно не работаю. Как это далется в вашей ОС и SDK, и тем более сточки зрения названий функций, я не знаю ) Поспрашивайте у программеров, этот вопрос уже лет 15 должен быть разжеван )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.