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 - RedEagle

Seiten: 1 ... 4 5 [6] 7 8 ... 13
101
Da ich, seit dem alten thread, das OS gewechselt habe:

C++: g++
ASM: nasm
Editor: Kate (für C++ und asm-code)
102
Lowlevel-Coding / Re: Reboot nach lesen eines Registers?!?
« am: 25. August 2007, 12:45 »
Ich habe jetzt bochs unter linux eingerichtet, und dort funktionierts.
Trotzedem danke.

Ach noch was: Der Cyrix 6x86 unterstützt so wie ich das seh kein Register cr4[...]
:-o   :?

103
Lowlevel-Coding / Re: Reboot nach lesen eines Registers?!?
« am: 25. August 2007, 12:18 »
ändert auch nichts...
104
Lowlevel-Coding / Re: Reboot nach lesen eines Registers?!?
« am: 25. August 2007, 12:02 »
Bei cr0 gibg es auch, zudem ist des nicht in "", und somit kein asm-code,,,

Werds mal eben testen...

--[edit]--

DWORD cr4()
{
   unsigned int reg;
    asm volatile ("movl %%cr4, %0" : "=a" (reg));
   return reg;
}

selbes problem, der name ist also nicht verantwortlich...

zu bochs:
bis zum neustart, ununterbrochen diese meldung:
[FDD  ] read() on floppy image return 0
wobei die exception nicht auflistet ist, da danach das logfile sofort wider geleert wird :(
105
Lowlevel-Coding / Reboot nach lesen eines Registers?!?
« am: 25. August 2007, 11:55 »
Hi, wenn ich folgenden code ausführe gibts ein reboot:

DWORD cr4()
{
   unsigned int cr4;
    asm volatile ("movl %%cr4, %0" : "=a" (cr4));
   return cr4;
}

Der folgende code hingegen funktioniert:
DWORD cr0()
{
   unsigned int cr0;
    asm volatile ("movl %%cr0, %0" : "=a" (cr0));
   return cr0;
}

was ist oben falsch, was unten richtig ist??

CPU: Cyrix 6x86
106
Lowlevel-Coding / Re: Paging debuggen??
« am: 22. August 2007, 14:19 »
Ok, Dann werde ich mal mit den 4MB Pages arbeiten. Danke

"Wenn das PRESENT bit nicht gesetzt ist, kommt ein Pagefault, unabhängig von den anderen Flags. Das ist der Sinn des PRESENT bits."
:-o Stimmt.  :? Jetzt wüsste ich selber gerne, wass ich mir dabei gedacht habe  :roll:

---

Mein alter Kernel lief nur unter bochs, bei einem echten PC ging nichts. Deshalb teste ich den neuen Kernel nur auf einem echten PC. Zudem ist dann dass loggen über die rs232 leichter (und in echtzeit).
Da ich nun auf linux umgestiegen bin, habe ich bochs garnicht erst installiert.
107
Lowlevel-Coding / Re: Paging debuggen??
« am: 22. August 2007, 13:05 »
zu 1 "Warum nicht 4MB-Pages für den Kernelspace? (also von 0 bis 12MB zB)":
Wie mach man den 4MB-Pages?

zu 2 "Warum wird der Kernelspace mit PG_USERACCRESS gemappt?":
Weil jedes tool zugriff auf den Kernel haben soll, und ggf funktionen überschreiben o,ä.
maw.: Alle Macht dem User ;) - Der kernel soll nicht geschützt werden!

zu 3 "Warum erstellst du für den gesammten Adressraum PageTables? Du brauchst doch momentan nur von 0-11MB, oder?":
Mach ich nicht. (s. PG_COMPLETE)

zu 4 "Warum machst du dir die Arbeit und gehst jeden Eintrag einzeln durch?":
s, 3

zu 5 "Warum ist bei PG_REOSNULL PG_WRITEABLE und PG_USERACCRESS gesetzt? Warum nicht einfach 0?":
s, 2. Auch wenn der Speicher nicht reserviert wurde, soll trotzem drauf zugegriffen werden können. (auch wenn es nicht gerade sinnvoll ist)

zu 6 "...":
Ich möchte bis 0xB00000 die Pages "present" machen. Zudem soll beim Kernel die Virtuelle adresse der Physikalischen entsprechen (zumindest der nicht dynamisch reservierte speicher). Nicht presenter speicher, und damit auch nicht reservierter speicher (ich bin mir über die unterschiede im klaren) sollen auf 0x00000000 zeigen

maw.: für einfaches debuggen muss ich bochs installieren...
108
Lowlevel-Coding / Paging debuggen??
« am: 22. August 2007, 11:24 »
Hi
ich habe mich jetzt mit paging beschäftigt, und habe den code fertig. Natürlich funktioniert noch nichts.
Leider fehlt mir momentan die Idee, wie ich dass debuggen könnte.
Das Problem liegt wahrscheinlich beim erstellen des PageDirectorys bzw der Tables.
Ich könnte jetzt die gesammten Daten per rs232 in eine html-Tabelle schreiben, und kontrolieren, was bei ca 4MB Daten allerdings ein enormer aufwand währe.
Wie habt ihr das gemacht??

Hier einfach mal der Code:
#define SIZEOF_PAGEDIRECTORY (1024*4) ////PD = 1024PT * 4B = 4096
#define SIZEOF_PAGETABLE     (1024*4) ////PT = 1024PF * 4B = 4096
#define SIZEOF_PAGE          (1024*4) ////1 Page-größe (4KB)

#define PG_PRESENT     0x01 //Vorhanden
#define PG_WRITEABLE   0x02 //Speicher auch beschreibbar
#define PG_USERACCRESS 0x04 //Für user zugreifbar (ring3)
#define PG_OUTOFRANGE  0x0200 //Existiert auf Physikalischer ebene nicht (z.B. 17.MB bei 16MB-RAM)
#define PG_REOSDEFAULT (PG_PRESENT | PG_WRITEABLE | PG_USERACCRESS)
#define PG_REOSNULL    (             PG_WRITEABLE | PG_USERACCRESS)

 DWORD *KernelPageDirectory = (DWORD*)0x701000; //Kernelspace (auch virtuell == physikalisch)
 DWORD *KernelPageTables    = (DWORD*)0x702000;

int InitKernelPageDirectory()
{
 int error=0;
 //1024 PageTables einfügen initialisieren
 DWORD currentPT = (DWORD)KernelPageTables;
 DWORD *PageDirectory = KernelPageDirectory;

 for(int i=0; i<1024; i++)
 {
  *PageDirectory = currentPT | PG_REOSDEFAULT;

  error = InitKernelPageTable(currentPT); //Das flag muss mit, um zu wissen, ob spätere tabels present sein müssen oder nicht
  if(error&(~PG_COMPLETE))return error;
  if(error == PG_COMPLETE) break;

  PageDirectory+=4;
  currentPT += SIZEOF_PAGETABLE;
 }

 return 0;

}

int InitKernelPageTable(DWORD PageTable)
{
 static DWORD paddr = 0;
 DWORD flag; //Flags, ob present und son scheiß
 if(paddr < 0xB00000) flag = PG_REOSDEFAULT;          //bis 11MB gehört dem Kernel
 else                {flag = PG_REOSNULL; paddr = 0;} //Danach ist frei und verboten

 //1024 Pages einfügen initialisieren
 for(int i=0; i<1024; i++)
 {
  if(paddr > MaxPhysicalMemory) flag |= PG_OUTOFRANGE; //Wenn die Andresse auserhalb des Vorhanden Arbeitsspeicher liegt

  *(DWORD*)PageTable = paddr | flag; //paddr enthält die physikalische addresse
  PageTable += 4;
  paddr     += SIZEOF_PAGE;
  if(paddr < 0xB00000) flag = PG_REOSDEFAULT;            //bis 11MB gehört dem Kernel
  else                {flag = PG_REOSNULL; paddr = 0;}   //Danach ist frei, und verboten
 }

 if(paddr == 0) return PG_COMPLETE;
 return 0;
}

Das setzten der Register wird wohl richtig sein:
#define CR0_PAGING 0x80000000

//...

 cpu::cr3((DWORD)KernelPageDirectory);
 cpu::cr0(cpu::cr0() | CR0_PAGING);
109
Offtopic / Re: Hexadezimalzahlenschreibweise (2xAh 2xCh) ???
« am: 21. August 2007, 16:05 »
Das x ist eine variable!!
Bei 2x6h Steht das h für hex, und das x für einen belibigen Wert zwischen 0 und F
110
OS-Design / Re: Fragen zu paging
« am: 18. August 2007, 12:45 »
Vielen Dank!
Frage 3+4 wurde durch 1 beantwortet ;)
111
OS-Design / Fragen zu paging
« am: 18. August 2007, 12:15 »
Leider finde ich keine gescheitet tutorials. Ich habe mir zwar anhand von codes schon etwas aneignen können, aber einige Fragen gibt es noch:

1. Es gibt 1 PageDirectore, mit 1024 Pagetables. Ist das richtig (habe nehmlich auch schon 1PageDirectore mit nur einer Pagetable gesehen, dann hätte man aber nur 4MB...)??

2. Jeder Task verwendet dieses PageDirectore. Es wird nicht für jeden task ein eigenes Angelegt!?

3. Was sagt das present-bit aus?? Dass der speicher gemappt wurde, oder dass er generell an einen Prozess vergeben wurde (also aktiv und somit im Prozess vorhanden ist).

4. Wie erkenne ich, ob ein pageframe vergeben oder frei ist? (fals oben gemappter speicher gemeint ist)

Das wars erstmal... evtl kommt stäter noch was ;)
112
Lowlevel-Coding / Re: memcpy wird nicht erkannt
« am: 16. August 2007, 14:32 »
Jo, Danke, genau das suchte ich ;)
113
Lowlevel-Coding / memcpy wird nicht erkannt
« am: 16. August 2007, 11:56 »
Hi
Ich (bzw mein compiler) braucht die memcpy-funktion.
Soweit kein Problem.

Aber: sie wird nicht anerkannt.
Also ich habe eine Funktion memcpy aber die wird ja vom compiler in _Z6memcpy*irgendwas* umbenannt. Ist dass der grund? wenn ja, wie verhindere ich dass??

ps.: der Fehler:
rr.cpp:(.text+0xf2): undefined reference ro `memcpy'

(Es wird eine funktion aufgerufen, die eine Struktur zurückgibt)
114
Lowlevel-Coding / Re: Problem beim lesen der Disk im RM
« am: 05. August 2007, 11:26 »
 :oops:
sry, dass ich euch mit so einem scheiß "belestige"
manchmal sieht man den Wald vor lauter Bäumen nicht.

Das Programm liegt im Segment 1000 :-D, und der ramcheck wird nie gecalled  :-D :-D
115
OS-Design / Re: Alternativen zu Assembler und C/C++?
« am: 04. August 2007, 23:32 »
[...]Und da das Ding Inline-Assembler kann, ist damit eigentlich alles problematische erledigt.
:-D

--------------

Man kann einige/viele(?) Microcontroller in BASIC programmieren (z.B. BASCOM-Basic für AVRs).
Theoretisch währe es, wenn man GRUB verwendet möglich, Die BASIC-Variante müsste halt nur entsprechende lowlevel-befehle besitzen (wie IN und OUT). Wenn man einen BASIC-Interpreter mit GRUB lädt, könnte man sogar auf ein Kompilieren des Codes verzichten :evil:
116
Lowlevel-Coding / Re: Problem beim lesen der Disk im RM
« am: 04. August 2007, 21:26 »
So am rande: Track == Cylinder, richtig?

Habe mich vom unteren code verabschiedet. Die unteren, freien Sektoren reserviere ich für spätere Zweckte.
Nun beginne ich beim 2. Cylinder. (Also Cylinder 1).
Dabei habe ich wider probleme:

erstmal code:
   mov ax, 0x1000
   mov es, ax
   mov bx, 0      ; Zieladresse(es:bx)
   mov ah, 2      ; Funktion 2 (Lesen)
   mov al, 36
   mov cx, 0x0101
   xor dx, dx
   int 0x13



So, nun zum Fehler:
erstmal sei gesagt, dass ich vorher das ganze segment 0x1000 prüfe (also lesen und schreiben) - ich kann lesen und schreiben. Ich weiß dass es eigentlich nicht nötig ist.
Desweiteren wird vorher das LW resettet

Fehlerbeschreibung:
int 0x13 wird nicht mehr verlassen (hängt sich auf), die LED des Diskettenlaufwerks leuchtet.

So: nun das komische an diesem Fehler:
Wenn ich nur 1 oder 2 Sektoren aufmal lese, funktioniert alles, bei 3 oder mehr kommt es zu dem Fehler
Getestete Kombinationen (Startsector+anzahl)
1+2, 3+1, 3+2, 4+2, 6+2 OK
1+3, 3+5, 3+3, 4+3, 4+4, 6+3 Fehler
117
OS-Design / Re: Welche Schnittstelle?
« am: 04. August 2007, 19:50 »
Die sereielle schnittstelle (rs232) ist wohl in diesem fall am besten, da sie auch hardwaremäßig recht gut zu handhaben ist.

Zitat
Dazu stellt sich noch die Frage wie ich in meinem OS die Schnittstelle dann am besten ansteuern kann!
??
Über die entsprechenden ports!?!?
Und dann am besten ein gut(!) durchdachtes Protokoll verwenden.
118
Lowlevel-Coding / Re: Problem beim lesen der Disk im RM
« am: 29. July 2007, 22:08 »
OK, wenns nur daran liegt  :-D
Ich bin davon ausgegangen, dass das vom BIOS berechnet wird, da ich ja auch 36 Sektoren gleichzeitig lesen kann...

Jedenfalls danke
119
Lowlevel-Coding / Problem beim lesen der Disk im RM
« am: 29. July 2007, 11:47 »
Ich habe folgenden Code:
   mov ax, 0x1000
   mov es, ax
   mov bx, 0      ; Zieladresse(es:bx) 0-2400
   mov ah, 2      ; Funktion 2 (Lesen)
   mov al, 18     ; Lese 36-18 Sektoren (maximum 36)
   mov cx, 0x0013 ; Cylinder=1, Sector=19
   xor dx, dx
   int 0x13       ; ES:BX = Daten vom Laufwerk
Nach ausführung steht in AH 04h -> "sector not found/read error"

wo muss ich das Problem suchen??
(Ich lasse den codeabschnitt 10 mal durchlaufen (im fehlerfall) und jedesmal der gleiche Fehler)
120
Offtopic / Re: Vorschlag OS Name
« am: 26. July 2007, 12:04 »
Ich habe einfach meinen nick genommen, und "-OperatingSystem" hintergehangen ;)

Du könntest auch nach Fachbegriffen z.B. aus der Chemie suchen. (Aber die Bedeutung sollte klar sein ;))
Seiten: 1 ... 4 5 [6] 7 8 ... 13

Einloggen