2015-05-12 8 views
6

После ознакомления с некоторыми документами основы, что я понял, Base Address Register - это адресное пространство, к которому можно получить доступ через PCIe IP. PCIe IP может либо передавать данные в регистр базовых адресов, либо записывать полученные данные на него.Что такое регистр базового адреса (BAR) в PCIe?

Я прав? Или что-то не хватает?

ответ

4

Я думаю, что это очень простой вопрос, и я хотел бы предложить, чтобы читать:

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

Устройство может иметь до шести 32-битных БАР или комбинировать два БАР с 64-разрядным БАР.

+0

Это означает, что BAR является частью комплекса корней. И если есть шесть БАР, к нему можно подключить максимум 6 конечных точек PCIe. Я прав? –

+1

БАР находятся в конечных точках. Каждая конечная точка может отображать до 6 областей памяти. – Paebbels

+0

Это означает, что данные, полученные (или передаваемые) PCIe, сохраняются в ячейке памяти, указанной в регистре базовых адресов? Если да, то почему существует еще один БАР? –

3

Linux точка ядра зрения

хороший способ научиться чему-то взаимодействовать с ним, так что давайте использовать ядро ​​Linux для этого.

Вот минимальный пример PCI на QEMU эмулировать устройство: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/366b1c1af269f56d6a7e6464f2862ba2bc368062/kernel_module/pci.c

Первые 64 байта конфигурации PCI стандартизированы:

enter image description here

Изображение из LDD3.

Таким образом, мы можем видеть, что есть 6 БАР. wiki page затем показывает содержимое каждого BAR:

enter image description here

Ширин область требует волшебной записи, однако: How is a PCI/PCIe BAR size determined?

Этой память установка устройства PCI, и дает информацию к ядру.

Каждый BAR соответствует диапазону адресов, который служит отдельным каналом связи для устройства PCI.

Длина каждой области определяется аппаратным обеспечением и передается в программное обеспечение через регистры конфигурации.

Каждая область также имеет дополнительные аппаратные определенные свойства, кроме длины, в частности тип памяти:

  • IORESOURCE_IO: должны быть доступны с inX и outX
  • IORESOURCE_MEM: должны быть доступны с ioreadX и iowriteX

Несколько функций ядра Linux Linux принимают BAR как параметр iden тифы, который канал связи должен использоваться, например:

mmio = pci_iomap(pdev, BAR, pci_resource_len(pdev, BAR)); 
pci_resource_flags(dev, BAR); 
pci_resource_start(pdev, BAR); 
pci_resource_end(pdev, BAR); 

Глядя в исходный код устройства QEMU, мы видим, что QEMU устройства зарегистрировать эти регионы с:

memory_region_init_io(&edu->mmio, OBJECT(edu), &edu_mmio_ops, edu, 
       "edu-mmio", 1 << 20); 
pci_register_bar(pdev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &edu->mmio); 

и ясно, что свойства BAR определяются аппаратными средствами, например номер BAR 0, имеет тип памяти PCI_BASE_ADDRESS_SPACE_MEMORY, а область памяти 1MiB long 1 << 20.

Смотри также: http://wiki.osdev.org/PCI#Base_Address_Registers конечно.

Смежные вопросы