Эти два места ввода / вывода дают мне доступ к 256-байтовому «большому регистру», который я могу использовать для настройки устройства PCI.
Этот «большой регистр» представляет собой структуру с много полей. Одно из полей - «Регистр команд», который содержит глобальные флаги включения / выключения, которые можно использовать для отключения возможности устройства отправлять данные на шину (IRQ, запись с устройства в память и т. Д. c) и отвечать на вещи из шины (записывает из ЦП в устройство и т. д. c).
Другие поля включают «БАРЫ» (регистры базового адреса, начиная со смещения 0x10 в пространстве конфигурации устройства), которые сообщают устройству, какой адрес диапазон (в пространстве портов ввода-вывода или физическом адресном пространстве), которое устройство должно принимать. Для них устройство будет жестко подключено к использованию либо портов ввода-вывода, либо физических адресов (и это не может быть изменено), а размер области также будет жестко подключен (и это также не может быть изменено). Поскольку эти вещи являются аппаратными, вы можете записать нули в BAR и узнать, что было зашито (чтобы определить размер области и требуется ли устройству пространство портов ввода-вывода или физическое адресное пространство).
К счастью, Прошивка отвечает за настройку BAR, поэтому (за исключением устройств с горячей заменой и «необычных обстоятельств») ОС не нуждается в самой установке BAR, и может просто считывать значение / s из BAR (которые были установлены прошивкой) для определить адрес (в пространстве портов ввода-вывода или физическом адресном пространстве), который устройство уже было настроено для использования. К сожалению, если ОС необходимо определить размер области (например, и она не может полагаться на драйвер устройства, который уже знает размер для своего устройства), ОС может потребоваться прочитать значение прошивки, а затем выполнить «запись нулей в узнать размер области ", а затем восстановить значение микропрограммы.
Конечно, в пространстве конфигурации PCI не будет указано, для чего используются полосы BAR - это зависит от драйвера устройства, чтобы узнать, для чего каждая область (описана каждым BAR) используется для.
Если ОС хочет (пере) настроить саму BAR по какой-либо причине; тогда это значительно сложнее, потому что вы также должны убедиться, что любые мосты перенаправляют доступ к устройству правильно (и если за мостом есть несколько устройств, эти устройства должны использовать поддиапазоны в одном большом диапазоне, который мост будет пересылать); и вы должны убедиться, что кеши ЦП не разрушают все (что в основном означает повторную настройку MTRR / Регистра диапазона типов памяти на всех ЦП одновременно со специальной синхронизацией); и вы должны быть уверены, что ничего не топаете (например, диапазоны, уже используемые прошивкой, RAM, CPU и т. д. c); и убедиться, что все находится в части физического адресного пространства, к которому ЦП может получить доступ (даже если ЦП имеет ошибки и сообщает неправильное «количество бит физического адреса» через. CPUID).