Как узнать или настроить карту адресов устройства PCI / P CIe? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь понять, как проинструктировать CPU дать команду PCI-устройству сопоставить его память с физическим адресом CPU.

Я прочитал https://wiki.osdev.org/PCI#Memory_Mapped_PCI_Configuration_Space_Access и я понимаю, как настроить устройство PCI через порты ввода-вывода ЦП:

Используются два 32-битных местоположения ввода-вывода, первое местоположение (0xCF8) называется CONFIG_ADDRESS, а второе (0xCF C) называется CONFIG_DATA. CONFIG_ADDRESS указывает адрес конфигурации, который требуется для доступа, в то время как доступ к CONFIG_DATA фактически генерирует доступ к конфигурации и передает данные в регистр CONFIG_DATA или из него.

Итак, чтобы настроить PCI device Мне просто нужно указать адрес конфигурации, который я хочу настроить, а CONFIG_DATA - это место, куда я помещаю данные. Оба они являются местоположениями ввода / вывода, поэтому я использую инструкции ввода / вывода в ЦП.

Эти два места ввода / вывода дают мне доступ к 256-байтовому «большому регистру», который я могу использовать для настройки PCI устройство. Все поля этого большого регистра описаны на странице OSDEV. Эти 2 бита представляют интерес:

Пространство памяти - если установлено в 1, устройство может отвечать на обращения к пространству памяти; в противном случае ответ устройства отключен.

Пространство ввода-вывода - Если установлено значение 1, устройство может отвечать на доступы к пространству ввода-вывода; в противном случае ответ устройства будет отключен.

Однако, помимо этого, неясно, как получить или установить физическое адресное пространство, в котором каждое устройство PCI будет отвечать

1 Ответ

1 голос
/ 06 мая 2020

Эти два места ввода / вывода дают мне доступ к 256-байтовому «большому регистру», который я могу использовать для настройки устройства PCI.

Этот «большой регистр» представляет собой структуру с много полей. Одно из полей - «Регистр команд», который содержит глобальные флаги включения / выключения, которые можно использовать для отключения возможности устройства отправлять данные на шину (IRQ, запись с устройства в память и т. Д. c) и отвечать на вещи из шины (записывает из ЦП в устройство и т. д. c).

Другие поля включают «БАРЫ» (регистры базового адреса, начиная со смещения 0x10 в пространстве конфигурации устройства), которые сообщают устройству, какой адрес диапазон (в пространстве портов ввода-вывода или физическом адресном пространстве), которое устройство должно принимать. Для них устройство будет жестко подключено к использованию либо портов ввода-вывода, либо физических адресов (и это не может быть изменено), а размер области также будет жестко подключен (и это также не может быть изменено). Поскольку эти вещи являются аппаратными, вы можете записать нули в BAR и узнать, что было зашито (чтобы определить размер области и требуется ли устройству пространство портов ввода-вывода или физическое адресное пространство).

К счастью, Прошивка отвечает за настройку BAR, поэтому (за исключением устройств с горячей заменой и «необычных обстоятельств») ОС не нуждается в самой установке BAR, и может просто считывать значение / s из BAR (которые были установлены прошивкой) для определить адрес (в пространстве портов ввода-вывода или физическом адресном пространстве), который устройство уже было настроено для использования. К сожалению, если ОС необходимо определить размер области (например, и она не может полагаться на драйвер устройства, который уже знает размер для своего устройства), ОС может потребоваться прочитать значение прошивки, а затем выполнить «запись нулей в узнать размер области ", а затем восстановить значение микропрограммы.

Конечно, в пространстве конфигурации PCI не будет указано, для чего используются полосы BAR - это зависит от драйвера устройства, чтобы узнать, для чего каждая область (описана каждым BAR) используется для.

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

...