Beiträge anzeigen

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.


Nachrichten - Sapphire

Seiten: [1]
1
Lowlevel-Coding / Re: Problem mit Textausgabe
« am: 29. June 2008, 06:53 »
OK. Danke. Jetz weiß ich wieder was mehr ;)
2
Lowlevel-Coding / Re: Problem mit Textausgabe
« am: 28. June 2008, 07:00 »
Ich bin da jetzt nicht so gut informiert aber liegt an 0x7C00 nicht normalerweise der Bootloader ?

Und bei dieser boot.ini find ich es auch komisch das er

C:\NanoOS\NanoOS.bin="NanoOS"

findet. Denn der Laufwerksbuchstabe C wird doch erst von Windows vergeben wenn es gestartet wird oder? Und vorher ist er in der Registry gespeichert.
Also müsstes du deine Datei eigentlich genau so angeben wie der Eintrag von Windows:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS.0="Microsoft Windows XP Home Edition"

Also ist für mich alles sehr komisch. Kann natürlich auch sein das es schon alles so seine richtigkeit hat. :)

Gruß Sapphire
3
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 25. June 2008, 19:26 »
OK. Läuft nun alles.

Nach noch einem kleinen Fehler der mir eine Page-Fault bei 0xFFFFFFFF angezeigt hat, funktioniert nun alles.
(Wen es interesiert: Der Fehler liegt in der Timer-Funktion die jede Sekunde etwas auf den Bildschrim schreibt.)

Danke an alle nochmal.
4
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 25. June 2008, 16:33 »
Ok danke. Werde das ganze jetz mal Testen mit den Tips die ihr mir gegeben habt. Wenn ich selbst jetzt nichts mehr finde werde ich mcih nochmal melden.

[EDIT]
Die memset Funktion ist die hier aus dem Forum aus dem Resourcen Teil. Vll sollte die Dort auch berichtigt werden.
[/EDIT]
5
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 24. June 2008, 19:53 »
Also hier mein Source Dateien.
http://cid-f20ff61cbfb84ec7.skydrive.live.com/self.aspx/%c3%96ffentlich/Kernel.zip

Ich hoffe es hilft.

Kann mir villeicht jemand ne Seite empfehlen wo ich was über das Bebuggen mit Bochs finden kann ?

6
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 24. June 2008, 15:07 »
Also hab jetz noch etwas rausgefunden:
An der for Schleife liegt es auch nicht.
Ich bae for der for-Schleife noch einen timer_waitticks eingebaut der 60 Sekunden warten soll.
Das heißt es muss irgendwo nachdem aktivieren das Paging passieren.

Fals jemand jetz noch ws weiß was habwegs nützlich sein könnte bitte einfach posten. Ich weiß wirklich ncih wo der Fehler liegen könnte.
7
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 24. June 2008, 14:19 »
Also bei mir geht das alles nícht so ... leider... .

QEMU will bei mir einfach nicht laufen. Entweder findet er eine Datei von KQEMU nicht, und wenn ich KQEMU dann installiere findet er eine andere wieder nicht.

Und bei Bochs bin ich einfach zu blöd mit diesem step xxx die richtige stelle zu treffen. Hab dort schon einen Watchpoint angelegt der mir melden soll wenn auf 0x001023C3 zugegriffen wird, aber das klappt auch nicht. Weiß jemand wie man dort noch weiter kommen könnte ?

Sonst muss ich mich wohl nochmal an qemu versuchen.

[EDIT]
Auf jeden Fall habt ihr Recht das es nicht hier ran liegt:
  char* Mem = 0xC0000000; //3 GB
  char* String = "Test... Dies ist an die 3 GB Grenze geschrieben!";
  for(i=0;i<strlen(String);i++)
  {
    *Mem = *String;
    Mem++;
    *Mem = KVC_White;
    Mem++;
  }
Wenn ich diesen Teil weglasse bekomme ich auch eine Page-Fault, jedoch an Adresse 0x00102363.

Kann sich das jemand erklären ? Vielleicht wird ein Teil der ersten Map nicht richtig erstellt, das mein Code an der for-Schleife anschließend eine Page-Fault auslöst.

Wenn ich mir meine Disassembli (?) so ansehe ist in _main auch keine Schleife am Ende. könnte es sein das der Compiler die leere for-Fchleife einfach ignoriert ?

Disassembli
_main           proc near               ; CODE XREF: seg000:0000002Dp
seg000:000002D1
seg000:000002D1 var_30          = dword ptr -30h
seg000:000002D1 var_C           = byte ptr -0Ch
seg000:000002D1 arg_0           = byte ptr  4
seg000:000002D1
seg000:000002D1                 lea     ecx, [esp+arg_0]
seg000:000002D5                 and     esp, 0FFFFFFF0h
seg000:000002D8                 push    dword ptr [ecx-4]
seg000:000002DB                 push    ebp
seg000:000002DC                 mov     ebp, esp
seg000:000002DE                 push    esi
seg000:000002DF                 push    ebx
seg000:000002E0                 push    ecx
seg000:000002E1                 sub     esp, 18h
seg000:000002E4                 mov     ebx, [ecx]
seg000:000002E6                 push    0
seg000:000002E8                 call    sub_EF0
seg000:000002ED                 call    sub_283
seg000:000002F2                 call    sub_1730
seg000:000002F7                 pop     eax
seg000:000002F8                 mov     eax, [ebx+4]
seg000:000002FB                 pop     edx
seg000:000002FC                 add     eax, [ebx+8]
seg000:000002FF                 sub     eax, 1000000h
seg000:00000304                 push    eax
seg000:00000305                 push    1000000h
seg000:0000030A                 call    sub_17B0
seg000:0000030F                 call    sub_1805
seg000:00000314                 add     esp, 10h
seg000:00000317                 test    eax, eax
seg000:00000319                 jnz     short loc_334
seg000:0000031B                 push    eax
seg000:0000031C                 push    eax
seg000:0000031D                 push    0Fh
seg000:0000031F                 push    1002A5h
seg000:00000324                 call    sub_FD8
seg000:00000329                 lea     esp, [ebp-0Ch]
seg000:0000032C                 pop     ecx
seg000:0000032D                 pop     ebx
seg000:0000032E                 pop     esi
seg000:0000032F                 pop     ebp
seg000:00000330                 lea     esp, [ecx-4]
seg000:00000333                 retn
[/EDIT]
8
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 23. June 2008, 20:34 »
Also das CR2 Register enthält den Wert 0x001023C3, was ja bedeuten würde das die erste Page nicht richtig erstellt wurde oder ?

EDIT:
Da kann doch i-etwas nicht oder ? wenn der Fehler in der ersten page liegt könnte ich danach doch garnicht mehr KMSG aufrufen oder ? Das klappt ja aber noch!
9
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 23. June 2008, 19:42 »
Ok Ich habe jetz alles nocheinmal neu compiliert und jetz wird der Wert des cr3 Register richtig angegeben ( der gleiche wie die Adresse des PageDirectory) .

EDIT: @ Korona: Ich benutze auch die Ursprüngliche Funktion jetzt auch. Mein letzter Post war da vll ein wenig(...) zu undeutlich.

Aber ich bekomme immernoch eine "Coprocessor Fault Exiption" (Bei mir Interrupt 14 ! Ist das so richtig?)
Also müsste das PageDirectory bzw die PageTables nicht richtig erstellt werden.

Ich werde mir das ganze nochmal angucken und die Lösung posten wenn ich sie finde.

Danke schonmal für die Hilfe bis jetzt, wenn ich den Fehler nicht finde werde ich mich nochmal melden.
10
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 23. June 2008, 19:00 »
Danke @ MNemo für die aufklärung über AND und XOR. Mit Bitoperatoren hatte ich noch nicht sehr viel zu tun ... .

Also ich habe jetzt noch eine Funktion für das auslesen des CR0 Registers.
Die Werte von CR0 und CR3 sind:
CR0: 0xE0000011
CR3: 0x00005000

Da der Wert von CR3 auf keinen Fall stimmen kann da der von mir angeforderte Speicher erst bei 16 MB beginnt, habe ich mir die Funktion Paging_SwapDirectory nocheinmal angeguckt.
Dabei sidn mir 2 Dinge aufgefallen:
1.
Ich bin mir nicht sicher ob man die Parameter mit mov vom Stack nehmen sollte.
Werden die Werte nicht so nur kopiert und der Stack dadurch auch zerstört?
2.
Ich dachte mir es muss "ebp+12" und nicht "ebp+8" heißen?
Als ich es ausprobiert habe, hat es nicht mal mehr einen Interrupt gegeben:
VirtualPC hat Windows zu einem Bluescreen gebracht, VirtualBox macht einige Zeit nichts und schaltet sich dann mit einem internen Fehler ab, und Bochs startet andauernt neu.

PS: Meine Speicherfunktion funktioniert richtig. Ich habe mir vorher schonmal die Adresse die es zurückliefert angeguckt. Die ist korrekt.
11
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 23. June 2008, 13:46 »
Stimmt, ist mir noch garnicht aufgefallen das ich dort weitermache, bei mir kam aber auch noch nie die Meldung "Invalid Page Directory Adress", also kann es daran nicht liegen.

Danke für den Hinweis mit dem xor.
[EDIT]
Also laut diesem "Artikel" http://www.oreilly.de/catalog/cplus2ger/chapter/ch11.pdf ist xor genau richtig! Oder verstehe ich da jetz was falsch?
[/EDIT]

Hmm also bei mir ist es Interrupt 15 (Coprocessor Fault).

12
Lowlevel-Coding / Re: Paging Fehler: Bit 31 in cr0
« am: 23. June 2008, 11:01 »
Bin grade noch in der Schule deswegen folgt der Wert der Register später.
Also Die Pagetables und das PageDirectory liegen auf jeden Fall in Bereichen die ein Alignment von 4kB haben. Das habe ich schon getestet.

Ich benutze leider Virtual PC bzw. VirtualBox, da Bochs bei bei mir leider schon am Anfang nicht richtig funktioniert hat, ... dass heißt es leif auf Bochs aber nicht auf richtigen PCs deswegen dachte ich mir das es so ja wenig Sinn macht, wenn das ganz dann nur auf Bochs läuft.

Sobald ich zuhause bin werde ich mal den Wert der Register posten.

Ich bin mir auch nicht so sicher ob die Werte die ich für cr0 und cr3 erhalte richtig sind, da ihc dort mit gcc inline assembler arbeite und mir das noch weniger vertraut ist als die Syntax von NASM.

[EDIT]
Also als Registerwerte bekomme ich folgendes bei Bochs, VirtualPC und VirtualBox:
GS:0x00000010
FS:0x00000010
ES:0x00000010
DS:0x00000010

EDI:0x00004000
ESI:0x000001FE
EBP:0x00105F20
ESP:0x00105EF4
EBX:0xFFFFFFFF
EDX:0xFFFFFFF4
ECX:0x00000001
EAX:0x00000000

EIP:0x001010F4
CS:0x00000008
EFLAGS:0x00010046
USERESP:0x00105F28
SS:0x001010F3

CR0:0x000B8000
CR3:0x000B8000

Ich denke das es bei den Werten von CR0 und CR3 wohl an meinem inline Assembler liegt, also poste ich auch mal den Code davon:
        __asm__ ( "movl %%eax, %%cr0\n"
                  "push %%eax\n"
                  "call _PrintUIAsHex":::"%eax");

        __asm__ ( "movl %eax, %cr3\n"
                  "push %eax\n"
                  "call _PrintUIAsHex":::"%eax");
[/EDIT]
13
Lowlevel-Coding / Paging Fehler: Bit 31 in cr0
« am: 22. June 2008, 21:44 »
Hallo nachdem mir hier schon so schnell mit meiner memalloc Funktion geholfen wurde, habe ich wieder ein Problem an dem ich schon einige Zeit sitze.

Situation:
Ich lege erst ein PageDirectory und 2 PageTables an. Die erste Table mappt die ersten 4 MB Virtuellen Speicher auch in die ersten 4 MB der Physischen Speichers, und die 2te Mappt den Speicherbereich bei genau 3GB an 0xB8000 wo sich ja der Video speicher befindet.
Anschließend setze ich das Bit 31 in cr0 um Paging zu aktivieren.
Wenn ich jetz ganz normal auf die Adresse 0xB8000 zugreife geht alles gut nur wenn ich auf 0xC0000000 (3GB) zugreife bekomme ich eine Exception.

Problem:
Obwohl ich Bit 31 gesetzt habe ist es nicht gesetzt  :-P wenn mein Interrupt Handler aufgerufen wird. Ich denke das er mir das Bit garnicht richtig setzt.

Frage:
Ist mein Code falsch (Code folgt unten) oder gibt es Fälle wo er das Bit einfach nicht setzten kann / bzw löscht der Prozessor das Bit 31 bei einer Exception automatisch ?
Wer net wenn mir da jemand Auskunft geben könnt.

Code:
Definition
struct Paging_PageDirectory
{
  unsigned int PageTableAdress[1024];
};

struct Paging_PageTable
{
  unsigned int PhysPageAdress[1024];
};

/*
Aktiviert Paging.
*/
void Paging_Enable( void );
/*
Deaktiviert Paging.
*/
void Paging_Disable( void );
/*
Ändert das aktive PageDirectory und
gibt die Adresse des Alten zurück
*/
void Paging_SwapDirectory( struct Paging_PageDirectory* Directory);
/*
Gibt das aktive PageDirectory zurück.
*/
struct Paging_PageDirectory* Paging_GetActivDirectoy( void );
/*
Erstellt ein PageDirectory an übergeben Adresse.
*/
struct Paging_PageDirectory* Paging_CreatePageDirectory( void* Adress);
/*
Fügt einen Eintrag im Angebeben PageDirectory hinzu und
erstellt eine PageTable an angebener Adresse.
*/
struct Paging_PageTable* Paging_AddPageDirectoryEntry(unsigned short Entry,void* PageTableAdress,struct Paging_PageDirectory* PagingDirectory);
/*
Gibt einen Eintrag aus einem PageDirectory zurück.
*/
struct Paging_PageTable* Paging_GetPageTable(struct Paging_PageDirectory* Directory,unsigned short Entry);
/*
Fügt einen Eintrag in eine PageTable hinzu.
*/
void Paging_AddPageTableEntry(struct Paging_PageDirectory* Directory,unsigned short DirectoryEntry,unsigned short TableEntry,void* PhysAdress);


Assembler Code
;C: void Paging_Enable( void );
_Paging_Enable:
  push eax
  mov eax,cr0   ;cr0 in eax laden
or eax,0x80000000  ;Bit Nr. 31 setzen
mov cr0,eax   ;eax in cr0 schreiben
pop eax
ret           ;zurück

;C: void Paging_Disable( void );
_Paging_Disable:
  push eax
  mov eax,cr0   ;cr0 in eax laden
  xor eax,10000000000000000000000000000000b  ;Bit Nr. 31 löschen
  mov cr0,eax   ;eax in cr0 schreiben
  pop eax
  ret
 
;C: void Paging_SwapDirectory( unsigned int DirectoryAdress );
_Paging_SwapDirectory: ; 1 Parameter: Adresse des neuen PageDirectory
 push ebp 
 mov ebp, esp 
 push eax

 mov eax, [ebp+8] ;Adresse nach eax lesen
 mov cr3, eax

 pop eax
 mov esp, ebp 
 pop ebp 
 ret
 
;C: unsigned int Paging_GetActivDirectoy( void );
_Paging_GetActivDirectory:
  mov eax,cr3 ;cr3 in eax laden
  ret         ;zurück (eax = Adresse)

C Code
/*
Erstellt ein PageDirectory an übergeben Adresse.
*/
struct Paging_PageDirectory* Paging_CreatePageDirectory( void* Adress)
{
  //Überprüfen ob gültige Adress
  if((((unsigned int)Adress)&0xFFFFF000)!=((unsigned int)Adress))
  {
    KMSG("Invalid Page DIrectory Adress\n\r");
    //1 Sekunde warten
    timer_waitticks(100);
  }
  // 
  memset(Adress,0x00,4096);
  return (struct Paging_PageDirectory*)Adress;
};

/*
Fügt einen Eintrag im Angebeben PageDirectory hinzu und
erstellt eine PageTable an angebener Adresse.
*/
struct Paging_PageTable* Paging_AddPageDirectoryEntry(unsigned short Entry,void* PageTableAdress,struct Paging_PageDirectory* PagingDirectory)
{
    //In Directory Eintragen
    PagingDirectory->PageTableAdress[Entry] = (((unsigned int)PageTableAdress) | 0x007);
    //Paging Table mit 0 füllen
    memset(PageTableAdress,0x00,4096);
    //PageTable zurückgeben
    return (struct Paging_PageTable*)PageTableAdress;
};

/*
Gibt einen Eintrag aus einem PageDirectory zurück.
*/
struct Paging_PageTable* Paging_GetPageTable(struct Paging_PageDirectory* Directory,unsigned short Entry)
{
  return (struct Paging_PageTable*)((Directory->PageTableAdress[Entry]) ^ 0x007);
};

/*
Fügt einen Eintrag in eine PageTable hinzu.
*/
void Paging_AddPageTableEntry(struct Paging_PageDirectory* Directory,unsigned short DirectoryEntry,unsigned short TableEntry,void* PhysAdress)
{
  struct Paging_PageTable* Table = Paging_GetPageTable(Directory,DirectoryEntry);
  Table->PhysPageAdress[TableEntry] = (((unsigned int)PhysAdress) | 0x007);
};

Initialisierung und Test:
struct Paging_PageDirectory* Directory = Paging_CreatePageDirectory(highmem_alloc());
  Paging_AddPageDirectoryEntry(0,highmem_alloc(),Directory);
  Paging_AddPageDirectoryEntry(768,highmem_alloc(),Directory);
  //die Ersten 4 MB
  int i=0;
  unsigned int Phys = 0x00000000;
  for(;i<1024;i++)
  {
    Paging_AddPageTableEntry(Directory,0,i,(void*)Phys);
    Phys += 0x1000;
  };
  //3GB Erste Page
  Paging_AddPageTableEntry(Directory,768,0,(void*)0xB8000);
  Paging_SwapDirectory(Directory);
  Paging_Enable();
  KMSG("Paging Enabled!");
  timer_waitticks(200);
 
  char* Mem = 0xC0000000; //3 GB
  char* String = "Test... Dies ist an die 3 GB Grenze geschrieben!";
  for(i=0;i<strlen(String);i++)
  {
    *Mem = *String;
    Mem++;
    *Mem = KVC_White;
    Mem++;
  }
14
Ich hatte das Problem auch schon als angefangen hab. Ich habe meinen Kernel da nach einem Tutorial von hier gemacht hatte. Weiß nichtmehr welches es war aber die Startadresse in der Linkerdatei war falsch. Werde nochmal nachschauen welches es war vll kan es dann jemand ändern.

[EDIT]
Also ich hab es.
http://lowlevel.brainsware.org/wiki/index.php/C-Kernel_starten
Im Tutorial selbst ist es richtig angegeben aber in den Dateien die man runter laden kann ist im Linkerscribt 0x200 statt 0x10200 eingetragen ;)
Wer gut wenn das mal jemand ändern könnt damit nich nochmehr dieses Problem haben.
[EDIT]

Gruß Sapphire
15
Lowlevel-Coding / Re: memalloc
« am: 14. June 2008, 16:09 »
Ok. Danke werde es jetzt so machen.

Hätte ich eig auch drauf kommen müssen, manchmal denkt man viel zu kompliziert.  :roll:
16
Lowlevel-Coding / memalloc
« am: 14. June 2008, 11:57 »
Hallo erstmal.

Ich sitze grad an einer memalloc Funktion. Habe mir Gedanken gemacht und habe jetzt mal ein paar Fragen dazu.

1) Ich habe mir Überlegt das ich am Anfang jeder neu angeforderten Page eine BitMap platziere. Jedes Bit soll 2 Byte darstellen. So habe ich zwar 1 Byte verschwendet bei Speicherbereichen die ungerade sind, aber es geht pro Page nur 1/16 (256 Bytes) des Speichers drauf.

Frage: Ist es Sinvoll 2 Bytes pro Bit zu benutzen oder sollte ich lieber 1 Byte nehmen, wodurch dann aber schon 1/8 (512 Bytes) für die BitMap belegt sind.
Oder ist das ein ganz falscher Ansatz und es geht platzsparender?

2) memalloc muss sich ja auch die breiets angeforderten Pages speichern. Ich habe mir überlegt das man es dafür z.B. eine Page anfordert und dort erstmal nur die Startadressen der Pages speichern könnte.

Frage: Aber wie soll man dann verfahren wenn die Page voll ist? Wie speichere die nächsten Startadressen ?
Und viel wichtiger: Ist das wiederrum sinnvoll? Oder gibt es auch hier eine bessere / platzsparendere Möglichkeit.

Und noch eine Frage die erstmal nichts mit memalloc zu tuen hat:
3)Was kommt nach dem Speichermanager auf Page basis ?
Erst der Virtual Memory und dann eine Funktion alla memalloc oder umgekehrt.

Ich hoffe ihr könnt mir helfen, hatte bisher nur einen simplen Speichermanager der verkette Listen benutzt hat und hab mir daher um sowas keine gedanken gemacht.

Seiten: [1]

Einloggen