x86-Programmierung und -Betriebsarten (Teil 4)

Zugriffsschutz zweiter Ebene

Die I/O-Permission-Bit-Map stellt praktisch einen Zugriffsschutz zweiter Ebene dar: Wenn die Werte von CPL und IOPL dem aktiven Task einen Zugriff auf den I/O-Adressbereich gestatten, so untersucht der Prozessor anschließend zusätzlich noch die I/O-Permission-Bit-Map, um zu ermitteln, ob der gewünschte Port auch tatsächlich angesprochen werden kann. Das geschieht auf der Basis einer eins-zu-eins-Zuordnung von I/O-Adresse und dem entsprechenden Bit in der Map. Dem Port mit der Adresse 0 ist das Bit mit Offset 0 innerhalb der Map, dem Port mit der Adresse 1 das Bit mit Offset 1 usw. zugeordnet. Ist das einem Port entsprechende Bit in der Map gesetzt, also gleich 1, so löst die CPU bei einem Zugriff auf den zugehörigen Port eine Exception "allgemeiner Protection-Fehler" aus. Ist das Bit gelöscht, so fährt der Prozessor mit der I/O-Operation fort.

Die Länge der Map bestimmt die Zahl der so zusätzlich geschützten Ports. Es ist also nicht erforderlich, dass die I/O-Permission-Bit-Map alle I/O-Adressen abdecken muss. Allen von der Map nicht erfassten I/O-Ports wird automatisch ein gesetztes Bit zugeordnet, das heißt ein Zugriff auf die außerhalb der Map liegenden Ports führt automatisch zu einer Exception. In einem ISA-PC reicht es zum Beispiel aus, die 3ffh niederwertigsten Ports durch eine Map abzudecken. Ein Zugriff auf Ports mit höherer Adresse löst eine Exception aus. Sie sehen erneut, dass die Schutzmechanismen des Protected Modes nicht nur Programme und das System schützen, sondern auch eine wesentlich einfachere Lokalisierung von Bugs ermöglichen. Um den gesamten I/O-Adressraum abzudecken, sind insgesamt (64k Ports)/(8 Bit je Byte) + (8 Bit 11111111), das heißt 8193 Byte notwendig.

Beachten Sie, dass 16-Bit-Ports zwei und 32-Bit-Ports vier aufeinanderfolgenden Bits zugeordnet sind. Nur wenn beide beziehungsweise alle vier zugeordneten Bits gleichzeitig gelöscht sind, kann der Prozessor die I/O-Operation fortsetzen. Ist auch nur eines der Bits gleich 1, so löst der Prozessor eine Exception aus.