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.


Themen - FalShen

Seiten: [1]
1
Lowlevel-Coding / Cursor setzen
« am: 12. May 2007, 04:20 »
Ich schätze mal, jeder von euch hat diesen kleinen Abschnitt so in seinem Kernel zu stehen:
        outport(0x03d4,0x0f);
outport(0x03d5,m_nCursor & 0xff);
outport(0x03d4,0x0e);
outport(0x03d5,m_nCursor >> 8);
Oder zumindest sehr ähnlich. Also, dieser Code funktioniert bei mir auf einmal nicht mehr. Zuerst dachte ich, es wäre ein neuer Bug von Bochs. Nein. Es ist auch kein Compilerfehler, hab den Assmblercode überprüft. Ich habe auch die outport Funktion in Assembler und in C geschrieben, kein Unterschied. Ich hab jetzt keine Ahnung was ich hier machen soll, denn der Cursor wird einfach nicht gesetzt.
An einer anderen Stelle lese ich die Register um meine Cursor-Variable zu updaten, das klappt.
        outport(0x03d4,0x0f);
m_nCursor = inport(0x03d5);
outport(0x03d4,0x0e);
m_nCursor |= inport(0x03d5) << 8;
Auch der Versuch, den Cursor auf 0|0 zu setzen, also direkt 0x00 als Positionen zu übergeben, hat nicht funktioniert.
Nun sitz ich hier bis 4 Uhr nachts nur wegen diesem Fehler, und ich könnte schreien, weil ich nicht wieß, was es ist.

Was ist hier falsch? Ist das wiedermal so etwas, dass Code der sonst immer geht, nur bei mir wieder mal absolut nicht funktioniert? Hatte ich ja sch öfters...
2
Lowlevel-Coding / Virtualising
« am: 20. April 2007, 17:15 »
Tja...
Für Multitasking wäre es ja nützlich, den Speicher virtuell zu mappen. Auf Bona Fide wollte ich mich schlau machen. Da hab ich Beispielkernel gefunden und die Memory Management Tutorials von Tim Robinson. War ja ganz nett, aber als ich dann and Implementieren gehen wollte, stieß ich dann auf Probleme... Mappen bringt Fehler, ich hab lange an der Linkerfile rumgespielt, aber brachte nichts.
Was ich vorhabe: Der Kernel soll nach 0xf0000000 gemappt werden (256 MB sollten für ihn reichen), die Programme haben dann auch mehr Platz. Wie und wann soll ich dann im Kernel mappen? Ich will einen Stack für die Pages, wie krieg ich den aufgebaut?
Ich bräuchte irgendwie konkrete Hilfe oder Codestückchen, weil ich hier echt nicht mehr weiterkomme...
Wäre nett wenn mir jemand helfen könnte, danke ^^
3
Lowlevel-Coding / File Concepts
« am: 25. January 2007, 15:14 »
Zur 'Entspannung' arbeite ich jetzt erst mal an einem Single-Task Real Mode OS, mehr oder weniger ein DOS, soll aber später auch Graphisches vereinfachen...
Nun ist die Sache mit einem DOS, dass dabei Dateien eine eher elementare Rolle spielen. Dateisysteme versteh ich ja, nur mein Problem ist: Wohin mit der Datei?
Programmdateien sind ja kein Problem, einfach laden und hinspringen, aber was ist mit den Dateien die im Programm benötigt werden? Wie wird das realisiert?
Zwei Ideen sind mir gekommen: Entweder die Datei irgendwo laden und den Pointer auf die Stelle zurückgeben, oder immer nur so viel laden, wie der Benutzer verlangt (zur Not byte-weise) und dazu irgendwo den Seeker und Dateiname usw. speichern. Beides stellt mich nicht zufrieden (zu speicher- oder speedlastig)...
Sind das die einzigen Möglichkeiten? Oder welche 'professionelleren' Methoden werden hier verwendet?
TFYA
4
Lowlevel-Coding / Init Paging
« am: 03. December 2006, 18:51 »
Und wieder ich :3 Da ich ja alleine nix hinkriege...
Ich will jetzt mal paging nutzen. Dazu muss ich ja erstmal initialisieren. Irgendwie geht der code aber nich...
Ich will den kernel, der an der physikalischen Adresse 0x00100000 liegt, nach 0xC0000000 mappen, das übliche also. Gleich nach dem füllen der Tables und des Directories krieg ich einen Page fault mit cr2 = 0x00000040

Hier der code:
start:
xor eax, eax
; or eax, 2
mov ecx, 0x0400
mov edi, [PAGE_DIR]
rep stosd

or eax, 2
mov ecx, 0x0400
mov edi, [PAGE_TAB1]
rep stosd

mov ecx, 0x0400
mov edi, [PAGE_TAB2]
rep stosd

mov dword [PAGE_DIR], PAGE_TAB1 | 3
mov dword [PAGE_DIR+0xC00], PAGE_TAB2 | 3

mov dword [PAGE_TAB1 + 0xB8*4], 0x000B8000 | 3

mov dword [PAGE_TAB2], 0x00100000 | 3
mov dword [PAGE_TAB2+4], 0x00101000 | 3
mov dword [PAGE_TAB2+8], 0x00102000 | 3
mov dword [PAGE_TAB2+12], 0x00103000 | 3
mov dword [PAGE_TAB2+16], 0x00104000 | 3
mov dword [PAGE_TAB2+20], 0x00105000 | 3
mov dword [PAGE_TAB2+24], 0x00106000 | 3

mov eax, PAGE_DIR
mov cr3, eax

mov eax, cr0
or  eax, 0x80000000
mov cr0, eax

jmp dword start2

start2:

mov esp, stack

push ebx
call main

stop:
cli
hlt

und die linkfile
OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
phys = 0x00100000;
corr = 0xBFF00000;
virt = 0xC0000000;
SECTIONS
{
. = virt;

.text : AT(ADDR(.text) - corr)
{
code = .; _code = .;
*(.text)
. = ALIGN(0x1000);
}
.data : AT(ADDR(.data) - corr)
{
data = .; _data = .;
*(.data)
*(.rodata*)
. = ALIGN(0x4);
}
.bss : AT(ADDR(.bss) - corr)
{
bss = .; _bss = .;
*(.bss)
*(COMMON)
. = ALIGN(0x1000);
}
end = .; _end = .;
}

Danke im vorraus...
5
Lowlevel-Coding / Einfach nur ?
« am: 28. November 2006, 19:26 »
Ich weiß echt nicht was ich falsch gemacht habe... wirklich nicht...
Es scheint so als ob alle Interrupts falsch ankommen. Das ist aber auch alles was ich herausfinden konnte.
Was passiert ist folgendes: Sobald ich anschalte, gibt es keinen Exception error. Das ist in diesem fall nicht gut, da die IRQ's nicht gemappt waren. Danach habe ich die IRQ's gemappt, aber nun werden die nicht ausgeführt. Irgendwas läuft da ganz falsch, ich kann's nicht mal beschreiben.
Ich poste hier mal den link zum source, mit Floppy image. Ich wäre wirklich sehr, sehr dankbar wenn sich dann doch jemand die Mühe machen würde und mal einen Blick drauf werfen würde. (Leider größtenteils unkommentiert)
http://scanish.dyndns.org/scen/kernel.zip
Vielen Dank für eure Aufmerksamkeit!
6
Lowlevel-Coding / GRUB and Video
« am: 04. November 2006, 13:11 »
Ich find's immer wieder witzig...

Hab mal schnell auf GRUB umgestellt, wegen comfort und meiner angeborenen Faulheit (meine RAM-size usw.) Dabei musste ich feststellen, dass keine Zeichen mehr ausgegeben werden. Weder bei 0xB8000 (farb-text) noch bei 0xB0000 (mono-text). Der Code funktioniert so weit, zum einen weil's der selbe wie immer ist, zum anderen weil ich sehen kann, dass der Cursor bewegt wird. Aber, wie gesagt, es wird kein einziges Zeichen ausgegeben. Nicht mal bei direkter Beschreibung des Spechers im Assemblerteil. Ich bin echt ratlos.
Hab auch alle Sektionen nach dem linken überprüft und so weiter, aber es ist alles korrekt. Deshalb habe ich GRUB als den schuldigen identifiziert und glaube irgendwie, dass da irgendwas nicht stimmt.
7
Lowlevel-Coding / Printing numbers
« am: 25. October 2006, 21:54 »
Yay, ich bin's wieder, der noob... Is' seltsam, aber ich krieg offenbar nix hin. Vllt könnt ihr mir wieder helfen, wäre sehr nett. Ihr könnt mich auch auslachen...

Ich will ne beliebige 32-bit Zahl ausgeben. Eine einzelne Ziffer hab ich schon, aber wenn ich diesen code ausführe, kriege ich immer nur eine '1' als ausgabe. Bochs Debug bringt mir nix, da ich da nicht mehr durchsehe.
void printnum(_u32 n)
{
_u32 num = n;
if(num == 0) putch('0');
else
{
for(i=9;i>=0;i--)
{
_u32 exp = 10^i;
if(num >= exp)
{
_u8 d = num / exp;
putdigit(d);
num -= d * exp;
}
}
}
}

Hoffe ihr könnt mir noch einmal helfen...

PS: Sollte ich eine printf-funktion schreiben oder mich lieber von einer Klippe stürzen?
8
Lowlevel-Coding / PMode Wahnsinn
« am: 16. October 2006, 19:55 »
Ich hab mir TeeJay's PMode tutorial durchgelesen, und danach Code erstellt. Ich hab ihn mit dem mitgelieferten Code verglichen und angeglichen.
Ich kriege nur noch 'Exception 13'.
Dann hab ich mit verschiedenen Artikeln/Tutorials von Bona Fide verglichen. Das selbe.
Schlußendlich habe ich TeeJay's Code compiliert, wie es angegeben war, und war sehr überrascht, dass das Ergebnis das selbe war.
Okay, bin ich nun einfach zu blöde? Sicher ist, dass ich kurz vorm Computer-aus-dem-Fenster-Schmeißen bin, weil's mich echt nervt.
Ich brauche Hilfe! Ich will doch bloß in den Protected Mode umschalten!!
TFYA
Seiten: [1]

Einloggen