| Zeile 67: | Zeile 67: | ||
Bit D: | Bit D: | ||
| − | Dieses Bit steht für „dirty“ und wird wiederum vom CPU selbst gesetzt. Das Bit wird jedoch nur dann gesetzt, wenn ein Schreibzugriff auf die entsprechende Page stattfindet. Dadurch wird der Speicherverwaltung signalisiert, | + | Dieses Bit steht für „dirty“ und wird wiederum vom CPU selbst gesetzt. Das Bit wird jedoch nur dann gesetzt, wenn ein Schreibzugriff auf die entsprechende Page stattfindet. Dadurch wird der Speicherverwaltung signalisiert, dass diese Seite nicht ohne zusätzliche Massnahmen aus dem Speicher entfernt werden kann. |
| Zeile 74: | Zeile 74: | ||
==== Kleines Beispiel zu Paging: ==== | ==== Kleines Beispiel zu Paging: ==== | ||
| − | Im folgenden soll nun anhand eines kleinen Beispieles die Wirkungsweise gezeigt werden, wie man Paging benutzt. Dieses Programm soll ein 512 Byte | + | Im folgenden soll nun anhand eines kleinen Beispieles die Wirkungsweise gezeigt werden, wie man Paging benutzt. Dieses Programm soll ein 512 Byte großer Bootsektor werden, der komplett in Assembler mit NASM Syntax geschrieben wird und der zuerst in den Proteced Mode schalten, danach PageDirectory und PageTables initialisiert und Paging aktiviert. In diesem Beispiel werde ich den Videotextspeicher, der normalerweise an der Position 0xB8000 startet, an die Position 0xC0000000 ( 3 GB ) mappen und darauf zugreifen. |
===== Vorbereitungen: ===== | ===== Vorbereitungen: ===== | ||
| Zeile 352: | Zeile 352: | ||
MOV AL, 40h ; ROT-Anteil | MOV AL, 40h ; ROT-Anteil | ||
OUT DX, AL | OUT DX, AL | ||
| − | MOV AL, 2Eh ; | + | MOV AL, 2Eh ; GRÜN-Anteil |
OUT DX, AL | OUT DX, AL | ||
MOV AL, 02h ; BLAU-Anteil | MOV AL, 02h ; BLAU-Anteil | ||
| Zeile 395: | Zeile 395: | ||
=== 1) MOV reg, 0 === | === 1) MOV reg, 0 === | ||
| − | Hier ist ein | + | Hier ist ein häufig benutzter Befehl, der unnötig lange ist: Einen Register Null zu setzen. Hier im Beispiel ax. |
<asm>mov ax, 0 ; 0xB8, 0x00, 0x00</asm> | <asm>mov ax, 0 ; 0xB8, 0x00, 0x00</asm> | ||
| − | Also ist dieser Befehl 3 Bytes | + | Also ist dieser Befehl 3 Bytes groß. Das gleiche kann mit XOR oder SUB erreict werden, nur eben kleiner: |
<asm>sub ax, ax ; 0x29, 0xC0 | <asm>sub ax, ax ; 0x29, 0xC0 | ||
| Zeile 475: | Zeile 475: | ||
| − | Relativ | + | Relativ groß, hmm? 8 Bytes nur für die Schleife. Dann machen wir das mal kleiner: |
<asm>mov cx, 8 ; 0xB9, 0x08, 0x00 | <asm>mov cx, 8 ; 0xB9, 0x08, 0x00 | ||
| Zeile 509: | Zeile 509: | ||
mov eax,cr0 ; In PMode wechseln, indem das niedrigste | mov eax,cr0 ; In PMode wechseln, indem das niedrigste | ||
| − | or al,1; Steuerungsbit von cr0 | + | or al,1; Steuerungsbit von cr0 geändert wird |
| − | mov cr0,eax ; muss | + | mov cr0,eax ; muss über Umweg über ein anderes Register gemacht werden |
jmp codesel:PMode; FarJump zu einer 32-Bit PMode Funktion | jmp codesel:PMode; FarJump zu einer 32-Bit PMode Funktion | ||
| Zeile 535: | Zeile 535: | ||
InitPageDirectoryAndPageTables: | InitPageDirectoryAndPageTables: | ||
mov eax,0 | mov eax,0 | ||
| − | mov ecx,4096*3 ; PageDirectory und 2 PageTables mit 0en | + | mov ecx,4096*3 ; PageDirectory und 2 PageTables mit 0en füllen |
mov edi,0x8000 | mov edi,0x8000 | ||
rep stosd | rep stosd | ||
| Zeile 607: | Zeile 607: | ||
dd 0,0 ; Null-Deskriptor | dd 0,0 ; Null-Deskriptor | ||
codesel equ $-gdt | codesel equ $-gdt | ||
| − | dw 0xFFFF; | + | dw 0xFFFF; Segmentgröße 0..15 |
dw 0x0000; Segmentadresse 0..15 | dw 0x0000; Segmentadresse 0..15 | ||
db 0x00 ; Segmentadresse 16..23 | db 0x00 ; Segmentadresse 16..23 | ||
db 0x9A ; Zugriffsberechtigung und Typ | db 0x9A ; Zugriffsberechtigung und Typ | ||
| − | db 0xCF ; Zusatzinformationen und | + | db 0xCF ; Zusatzinformationen und Segmentgröße 16...19 |
db 0x00 ; Segmentadresse 24..31 | db 0x00 ; Segmentadresse 24..31 | ||
datasel equ $-gdt | datasel equ $-gdt | ||
| − | dw 0xFFFF; | + | dw 0xFFFF; Segmentgröße 0..15 |
dw 0x0000; Segmentadresse 0..15 | dw 0x0000; Segmentadresse 0..15 | ||
db 0x00 ; Segmentadresse 16..23 | db 0x00 ; Segmentadresse 16..23 | ||
db 0x92 ; Zugriffsberechtigung und Typ | db 0x92 ; Zugriffsberechtigung und Typ | ||
| − | db 0xCF ; Zusatzinformationen und | + | db 0xCF ; Zusatzinformationen und Segmentgröße 16...19 |
db 0x00 ; Segmentadresse 24..31 | db 0x00 ; Segmentadresse 24..31 | ||
gdt_end | gdt_end | ||