User Tools

Site Tools


pci_configuration_space

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
pci_configuration_space [2026/02/28 16:36] – msvoelkerpci_configuration_space [2026/02/28 16:47] (current) – [VirtIO: DeviceCfg] msvoelker
Line 107: Line 107:
 Die Zahl in eckigen Klammern gibt über ein Byte-Offset hexadezimal an, wo im Configuration Space der BAR angegeben ist. Die Zahl in eckigen Klammern gibt über ein Byte-Offset hexadezimal an, wo im Configuration Space der BAR angegeben ist.
  
-VirtIO nutzt im legacy mode den BAR vom Typ I/O und im modern mode den BAR vom Typ Memory. Das PCI-Gerät, was VirtualBox bereistellt ist ein Transitional Device. Das heißt, es unterstützt beide Modi. FreeBSD hat einen Treiber pro Modus (src/sys/dev/virtio/pci/virtio_pci_[legacy|modern].c). Es ruft jeweils die entsprechende device_probe Methode auf und trifft die Entscheidung anhand des Rückgabewertes.+VirtIO nutzt im Legacy Modus den BAR vom Typ I/O und im Modern Modus den BAR vom Typ Memory. Das PCI-Gerät, was VirtualBox bereistellt ist ein Transitional Device. Das heißt, es unterstützt beide Modi. FreeBSD hat einen Treiber pro Modus (src/sys/dev/virtio/pci/virtio_pci_[legacy|modern].c). Es ruft jeweils die entsprechende device_probe Methode auf und trifft die Entscheidung anhand des Rückgabewertes. Hier betrachte ich den Modern Modus.
  
 Mit pciconf kann über den Parameter D eine BAR Region ausgelesen werden. Mit pciconf kann über den Parameter D eine BAR Region ausgelesen werden.
Line 188: Line 188:
 </code> </code>
  
-Alle Capabilities sind also VirtIO spezifische Capabilities und die Informationen befinden sich in der Region vom BAR 2. Das Offset gibt an ab welcher Byte Position die Informationen in der BAR Region sind und size wie viele Bytes die Informationen umfassen.+Alle Capabilities sind also VirtIO spezifische Capabilities und die Informationen befinden sich in der Region vom BAR 2, also in der vom Typ memory (die im VirtIO Modern Modus benutzt wird). Das Offset gibt an ab welcher Byte Position die Informationen in der BAR Region sind und size wie viele Bytes die Informationen umfassen.
  
 ==== VirtIO: CommonCfg ==== ==== VirtIO: CommonCfg ====
  
-Die erste Capability vom Typ VirtIO: CommonCfg enthält VirtIO-Gerätunabhängige Einstellungen. Sie startet bei Byte 0 und ist 0x38 Byte groß. Es handelt sich also um den Bereich vor den ganzen 0xffff, also+Die erste Capability vom Typ VirtIO: CommonCfg enthält VirtIO-Gerätunabhängige Einstellungen. Sie startet in der BAR Region bei Byte 0 und ist 0x38 Byte groß. Es handelt sich um den Bereich vor den ganzen 0xffff, also
  
 <code> <code>
Line 233: Line 233:
 </code> </code>
  
-Das VirtualBox PCI-Gerät gibt darüber also z. B. an, welche Features es unterstützt. Für die Features gibt es insgesamt 64 Bit. In device_feature_select wird geschrieben, ob device_feature die unteren 32 Bit (0) oder die oberen 32 Bit (1) anzeigt. In der Ausgabe oben ist in Little Endian gelesen device_feature_select=1, somit gibt das device_feature mit 1 die oberen oberen 32 Bit an. Auf die gleiche Weise schreibt der FreeBSD Treiber die Features, die es davon unterstützt und genutzt werden sollen in driver_feature_select und driver_feature. Auch hier ist in der Ausgabe oben in Little Endian gelesen driver_feature_select=1, somit gibt das driver_feature mit 1 die oberen oberen 32 Bit an.+Das VirtualBox PCI-Gerät gibt darüber also z. B. an, welche Features es unterstützt. Für die Features gibt es insgesamt 64 Bit. In device_feature_select wird geschrieben, ob device_feature die unteren 32 Bit (0) oder die oberen 32 Bit (1) anzeigt. In der Ausgabe oben ist in Little Endian gelesen device_feature_select=1, somit gibt das device_feature mit 1 die oberen oberen 32 Bit an. Auf die gleiche Weise schreibt der FreeBSD Treiber die Features, die es davon unterstützt und nutzen möchte in driver_feature_select und driver_feature. Auch hier ist in der Ausgabe oben in Little Endian gelesen driver_feature_select=1, somit gibt das driver_feature mit 1 die oberen oberen 32 Bit an.
  
 Mit device_feature_select=0 und driver_feature_select=0 sieht die erste Zeile der Ausgabe so aus. Mit device_feature_select=0 und driver_feature_select=0 sieht die erste Zeile der Ausgabe so aus.
Line 274: Line 274:
 </code> </code>
  
-Es sind jedoch nicht immer alle Werte angegeben. Hier ist lediglich die MAC Adresse 08:00:27:54:00:00, der Status=0 und max_virtqueue_pairs=1 angegeben. Weitere Werte, wie z. B. die MTU, werden nur angegeben, wenn entsprechende Features ausgehandelt wurden (z. B. VIRTIO_NET_F_MTU).+Es sind jedoch nicht immer alle Werte angegeben. Welche Werte angegeben sind, hängt von den ausgehandelten Features ab. Hier sind lediglich die MAC-Adresse=08:00:27:54:00:00, der Status=0 und max_virtqueue_pairs=1 angegeben. Die MTU fehlt z. B., weil das Feature VIRTIO_NET_F_MTU nicht ausgehandelt wurde.
pci_configuration_space.1772296577.txt.gz · Last modified: by msvoelker