1
Offtopic / Re: Windows vs. Linux - eine Geschichte
« am: 29. October 2009, 12:22 »
glaube zu mich zu erinnern das schon mal gelesen zu haben, eine quelle anzugeben wäre nett.
03. December 2024, 18:34
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
mov ax,0x7c09
steht dann in der entsprechenden Zeile, und wenn ich mir danach den regdumps anschaue, dann ist auch der entsprechende wert dring.
cli
;Das Auskommentierte kann man löschen
;mov ax, cs ; Code-Segment holen
;mov ds, ax ; Daten-Segment gleichsetzen
;xor eax, eax ; ax = 0
;mov es, ax ; Extra-Segment auf Null setzen
;mov si, GDT ; Quelle : GDT
;xor di, di ; Ziel : 0x0000
;mov cx, 6 ; 6 DoubleWords kopieren (ganze GDT)
;rep movsd
mov ax,GDT ; <- neu eingefügt
mov [GDTS+2],ax ; <- neu eingefügt
lgdt [GDTS]
Hier wird die Adresse des Anfangs der GDT in GDTS -> base eingetragen. Jetzt kann die GDT geladen werden.cli
mov ax, cs ; Code-Segment holen
mov ds, ax ; Daten-Segment gleichsetzen
xor eax, eax ; ax = 0
mov es, ax ; Extra-Segment auf Null setzen
mov si, GDT ; Quelle : GDT
xor di, di ; Ziel : 0x0000
mov cx, 6 ; 6 DoubleWords kopieren (ganze GDT)
rep movsd
Ich frage mich schon die ganze Zeit warum die GDT an die Adresse 0x0000 im Arbeitsspeicher verschoben wird. Vor allem weil immer dachte der Bereich ist für mich tabu. Kann mich jemand aufklären?Wenns auch ein wenig AMD für x64 und ein bisschen Ballast sein dürfen dann schau auch mal hier: http://files.asxsoft.de/public/nuke/manuals.tar.gzSchon die Intel manuals überfordern mich z.T.^^ habe aber mal in zwei pdfs reingeselen, sehr interessante sachen. Danke.
void printf(char *text);
int main()
{
printf("Mega hammer geil, die Textausgabe funzt :)");
for(;;);
}
void printf(char *text)
{
char *ptr;
for ( ptr = (char *)0xb8000; *text != 0; text++ )
{
*(ptr++) = *text;
*(ptr++) = 0xe;
}
}
das hier funktioniert bei mir. Probier mal aus.// Print text on the screen
void kprintf(char* chBuffer, const unsigned int iXPos, const unsigned int iYPos)
{
VGAMem = (char*) 0xB8000;
while(*chBuffer)
{
*VGAMem = *chBuffer;
VGAMem++;
*VGAMem = 0x07;
VGAMem++;
chBuffer++;
}
}
(auch wenn es wohl nichts mitt dem problem zutun hat)Es heißt übrigens nicht confirm, sondern conform, was hier wohl übersetzt sowas wie "übereinstimmen" bedeutet.Hmm, ich bin mir da nicht sicher aber: "confirm-bit" und "comforning code segment" aber nicht "conform-bit". confirm (Verb) ="übereinstimmen", conform (Adj.) ="übereinstimmend".
Wenn in ein Codesegment gewechselt wird MIT Call Gate (egal ob Conforming oder nicht), dann geht das ganze nur wenn CPL >= DPL (Weniger Rechte als Segment).
Conforming code segments can be accessed from any privilege level that is equal"Auf ein "Conforming code segment" kann vom jeden privileglevel zugegriffen werden, der entweder gleich oder nummerisch grösser ist (weniger privilegien hat) als der DPL [Zielsegment]."
to or numerically greater (less privileged) than the DPL of the conforming code
segment. Also, the CPL is not changed when the processor accesses a conforming
code segment that has a different privilege level than the CPL.
Conforming code segment and nonconforming code segment<- zu meiner Schande muss ich zugeben, dass ich das nicht ganz vestehe, heisst es: "Zum Beispiel: wenn das DPL[Ziel Privileg Level] eines Codesegments 2 ist, dann können programme die auf CPL[Aktueller Privileg Level] 0 oder 1 laufen NICHT auf dieses Codesegment zugreifen"
accessed through a call gate — The DPL indicates the numerically lowest
privilege level that a program or task can have to be allowed to access the
segment. For example, if the DPL of a conforming code segment is 2,
programs running at a CPL of 0 or 1 cannot access the segment.