|
|
  |
Конфигурирование BAR PCI, Назначение базового адреса регистра PCI |
|
|
|
Dec 28 2011, 08:54
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 22-06-11
Пользователь №: 65 818

|
Данный вопрос обсуждался, но возникают непонятки, да и на практике не могу разобраться, как назначается базовые адреса, да и как выделяется диапазон памяти?
Понятно конечно, что при установки младших 4 битов в значение "0000" (которые не изменяются) указываю, что требуется адрес для памяти ввода-вывода и этот адрес должен располагаться где-то в 32-разрядном адресном пространстве. А вот указание требуемого объема памяти, надо что-либо указывать?
Если требуется 64 байта тогда первые 6 бит указывают на мою память, а остальные фиксирована (указывает BIOS). Не надоли как-то указать эти 6 бит - 4 из которых имеют значение "0000" (смотреть выше) и остальные, например, установить в "1", а оставшиеся 26 бит - "0"?
После этого BIOS считывает установленные значения и записывает адрес в PCI устройство. И вот здесь возникает вопрос этот пройдённый адрес от BIOS - указатель на начало адресного пространство, которое необходимо сохранить или PCI устройство должно его как-то обработать?
Сообщение отредактировал GrAlexI - Dec 28 2011, 08:57
|
|
|
|
|
Dec 28 2011, 12:22
|

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
Цитата(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 в писиайном хеадере будет читаться по разному; т.е. размер может быть настраиваемым.
|
|
|
|
|
Dec 28 2011, 13:15
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 22-06-11
Пользователь №: 65 818

|
Под фразой "Биос пишет FFFFFFFF", ты имеешь в веду, что BIOS записывает 2 раза BAR - сперва FFFFFFFF (определив необходимой памяти), а потом непосредственно адрес (на места где "1" при считывании)? То тогда все понятно. Я правильно размышляю?
Сообщение отредактировал GrAlexI - Dec 28 2011, 13:17
|
|
|
|
|
Dec 28 2011, 15:14
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 22-06-11
Пользователь №: 65 818

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

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
Цитата(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 должен быть разжеван )
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|