Ausgabe 8 — Änderungen 1948 → 2292

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, da� diese Seite nicht ohne zusätzliche Massnahmen aus dem Speicher entfernt werden kann.
+
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 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.
+
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                    ; GR�N-Anteil
+
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 h�ufig benutzter Befehl, der unnötig lange ist: Einen Register Null zu setzen. Hier im Beispiel ax.
+
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 gross�. Das gleiche kann mit XOR oder SUB erreict werden, nur eben kleiner:
+
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 gross�, hmm? 8 Bytes nur für die Schleife. Dann machen wir das mal kleiner:
+
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 ge�ndert wird
+
     or al,1; Steuerungsbit von cr0 geändert wird
−
     mov cr0,eax ; muss �ber Umweg �ber ein anderes Register gemacht werden
+
     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 f�llen
+
     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; Segmentgr��e 0..15
+
     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 Segmentgr��e 16...19
+
     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; Segmentgr��e 0..15
+
     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 Segmentgr��e 16...19
+
     db 0xCF  ; Zusatzinformationen und Segmentgröße 16...19
 
     db 0x00  ; Segmentadresse 24..31
 
     db 0x00  ; Segmentadresse 24..31
 
gdt_end
 
gdt_end