Как адресное пространство ввода-вывода сопоставляется с устройствами?

Я надеюсь, что вопрос сформулирован достаточно хорошо, чтобы кто-то понял.

Я понимаю, что основная память (ОЗУ) и ввод-вывод, управляемый портом ввода-вывода, имеют собственное адресное пространство, которое используют такие инструкции, как IN, OUT.

Если бы кто-то написал программу на ассемблере в реальном режиме, должен ли разработчик иметь необходимую документацию, показывающую, в каком диапазоне адресов находятся конкретные слоты на материнской плате? Скажем, слот PCIe имеет адрес X, принтер Y.

Являются ли адреса стандартным диапазоном адресов в зависимости от типа шины?

Что я могу прочитать, чтобы понять это лучше? Надеюсь, кто-то может помочь. Спасибо.

~ изменить

Относится к системам ПК.


person Ryan Warren    schedule 10.02.2012    source источник
comment
Вы имеете в виду какую-то конкретную платформу?   -  person Jim Rhodes    schedule 10.02.2012
comment
Ответ для стандартного ПК, где ожидается, что программное обеспечение будет работать во множестве различных конфигураций, полностью отличается от ответа для встроенного ПК, где программное обеспечение должно поддерживать только фиксированную конфигурацию. Вам нужно сузить свой вопрос.   -  person David Schwartz    schedule 10.02.2012
comment
Извиняюсь. Я имею в виду ПК.   -  person Ryan Warren    schedule 10.02.2012


Ответы (2)


На компьютере x86 биос обычно управляет распределением плоского/физического адресного пространства, и все использует какое-то место в этом пространстве. Таким образом, BIOS будет «перечислять» устройства pcie, выходя на каждый слот pcie, чтобы увидеть, есть ли там кто-нибудь. Существуют стандартные регистры конфигурации, которые должно иметь устройство pcie, некоторые из которых указывают, сколько адресного пространства и какого типа (на основе ввода-вывода или с отображением памяти). биос пытается сделать всех счастливыми и дать им то, что они хотят. Windows или Linux не будут переназначать эти устройства или адреса, они берут то, что им дает биос. не каждая система pcie работает таким образом, но, к сожалению, так работает ПК.

Поэтому, если вы хотите разобраться в тонкостях, приобретите эту книгу http://www.mindshare.com/shop/?c=b§ion=0A6B150A Я думаю, что есть ссылка для скачивания, если вы погуглите "архитектура системы pci"

если вы запускаете linux, то найдите исходники для lspci, есть несколько библиотек и примеров, которые вы можете разобрать и сделать свои собственные, чтобы изучить, какие устройства есть в вашей системе и каковы их базовый адрес и диапазон памяти. Скорее всего, вы захотите просто сделать то, что делают другие операционные системы, и прочитать хост-контроллеры pcie, чтобы увидеть, что и где было выделено, и предоставить эту информацию программному обеспечению, работающему в этой системе. Вы можете загрузиться один раз, и принтер получит адрес 0xE0000000, а в следующий раз 0xDB000000, предоставить механизм вашей среде для предоставления этих адресов или абстрагировать их на какой-то фиксированный адрес в адресном пространстве вашей среды, и ваш код будет управлять преобразованием в физический адрес. /реальный адрес устройства.

Я предполагаю, что, используя термин «реальный режим», вы говорите о какой-то разновидности системы x86, и, вероятно, это какой-то ПК. Может мак. Не совсем уверен, как это делает Mac, недостаточно знаю об их перечислении. аппаратное обеспечение, вероятно, по-прежнему представляет собой процессор Intel с северным и южным мостом, за которым следует несколько мостов pcie или других микросхем Intel pcie, которые в конечном итоге заканчиваются рядом устройств pcie, либо припаянных к плате (видеочипы и т. д.), либо слоты pcie для подключаемых карт. Если вы запускаете Linux и используете lspci и смотрите на производителя и номера деталей, вы можете найти большинство руководств/таблиц данных для устройств Intel (идентификатор поставщика 8086) на веб-сайте Intel, и вы можете использовать lspci и его родственные программы для изучения элемента управления. и регистры состояния в этих контроллерах pcie, опять же, если вы заинтересованы в том, чтобы копнуть глубже, я не уверен, что вас действительно интересует.

Адреса не являются стандартными и не фиксированными, каждый биос наполовину настраивается для этой модели материнской платы, диапазон адресов для пространства PCI обычно составляет один гигабайт или меньше всего пространства процессора, но это окно меняется с переходом на 64 немного и потребность в большем пространстве (медленный ход). расположение этого окна pcie зависит от аппаратного обеспечения (см. таблицы данных, которые я упомянул для этих различных устройств Intel, или через, или nvidia, или кто-то еще, если это система AMD), если BIOS настроен на работу в 32-битном режиме, это окно pcie для всех устройств pcie может быть где-то между 2 гигабайтами, но, конечно, ниже отметки 4 гигабайта, но это не означает, что все эти системы используют отметку 3 гигабайта. для 64-битной версии я думаю, что они также имеют тенденцию быть ближе к вершине, но от материнской платы к материнской плате они меняются. Затем, когда дело доходит до нумерации шины, она зависит как от материнской платы, так и от конкретного компьютера, некоторые устройства прикрепляются болтами / припаиваются к материнской плате и каждый раз нумеруются в одном и том же порядке, но карты, которые вы вставляете в слоты, должны реагировать на host и иногда получить перечисление в зависимости от того, кто ответит первым, вы можете загрузиться 20 раз и увидеть один и тот же макет, загрузиться еще раз, и две карты могут поменяться местами, потому что порядок их перечисления изменился. Таким образом, даже если кажется, что ваша видеокарта всегда находится в одном и том же месте, нигде жестко не записывайте этот номер, всегда сканируйте шину или таблицы pcie или выполняйте вызовы библиотеки, чтобы узнать, что где находится. он, вероятно, не будет двигаться после того, как вы что-то найдете, пока вы не перезагрузитесь и не попытаетесь снова, поэтому вам не нужно продолжать повторное сканирование, чтобы найти, где что-то каждый раз, когда вы хотите получить к нему доступ.

да, если вы обновляете или понижаете версию своего биоса, биос - это просто программное обеспечение, иногда изменения в биосе связаны с перечислением pcie (не так уж редко, скажем, популярная видеокарта плохо работает на материнской плате, они вставляют мод в программное обеспечение биоса изменить сброс или что-то еще, чтобы дать этой карте больше шансов на работу), и это может изменить перечисление для всей системы.

person old_timer    schedule 10.02.2012
comment
Спасибо! Это очень помогает задержаться. - person Ryan Warren; 10.02.2012
comment
Этот ответ хорош, но он не включает одну ключевую деталь: как именно BIOS передает сопоставление портов ввода-вывода с ЦП? - person Alex D; 21.10.2014

Если бы кто-то написал программу на ассемблере реального режима

ISR - это то, что вам может понадобиться (процедуры обслуживания прерываний).
;

Это список адресов обработчиков прерываний, хранящихся в первом сегменте памяти. (сегмент 0000). Каждый номер прерывания имеет 4-байтовый адрес обработчика, сегмент и смещение, к которым будет переходить программа при вызове этого прерывания.

Адрес можно найти, умножив номер прерывания на 4, что является смещением, по которому хранится адрес обработчика.

Расположение ISR может быть определено как 0000:ax*4, прерывания DOS имеют общий номер 21h. Так что просто загрузите топор этим (или другим)

Здесь есть список прерываний DOS... он довольно большой...

http://www.ctyme.com/intr/int-21.htm

person ady    schedule 18.06.2013