?
Moin.
Wie man es im oben aufgelisteten Code ja hoffentlich deutlich genug sehen kann, ist es durchaus möglich von jeden der Kerne aus auf das BIOS auch selber nacheinander zu zugreifen und damit Biosfunktionen(z.B. wie hier vom int int $0x10 zur Ausgabe der jeweiligen Local-ID) ausführen zu lassen, wenn man im 16 Bit-Adressmode bleibt und lediglich zum Addressieren des APICs die Segmentgrösse entspechend erhöht und dann wieder in den Realmode zurück wechselt. Dabei bleibt die von uns vorher im PM eingestellte Segmentgrösse auch nach dem Wechsel zum RM erhalten, womit der gesamte 4 Gigabyte grosse Adressraum auch im 16Bit RM zusammen mit 32 Bit-Adressregister adressiert werden kann.
Dafür muss man also gar nicht zwingend ein modernes OS verwenden, oder entwickeln wollen. Sondern man kann auch weiterhin das BIOS verwenden.
...
Im Beispiel wurde hier nur das FS-Segmentregister erweitert. Es wäre aber ebenfalls möglich die Segmentregister DS, ES, oder GS auf ähnliche Weise zu erweitern. Um weniger Segment-Override Prefixe zu verwenden bietes es sich daher auch an statt FS nur DS zu verwenden, womit wir dann auch weiterhin einen Zeiger auf unserer Datensegment haben und zusätzlich jede Adresse im gesamten 4 Gigabyte Adressraum damit bekommen, ohne ein Segment-Override Prefix verwenden zu müssen. Dafür muss unser erweitertes Segmentregister gar nicht zwingend auf Null gesetzt werden, um eine 'flat'-Adressierung zu ermöglichen.
Adressierungs-Beispiel, wenn die Segmentgrösse von DS bereits schon entsprechend erweitert wurde:
xor eax, eax
mov ax, Adresse von unserem Datensegment im ersten MB
mov ds, ax
shl eax, 4 ; in eine Flat-Adresse wandeln
mov edi, Adresse vom linearen Framebuffer im 4. Gigabyte
sub edi, eax ; davon die Flat-Adresse vom Datensegment abziehen
lea si, PIXEL
mov eax, [si] ; 4 Byte aus unserem Datenbereich lesen
mov [edi], eax ; und zum linearen Framebuffer schreiben
Dirk