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

Seiten: [1]
1
Lowlevel-Coding / Re: Keyboard Treiber und Weitere Schritte
« am: 01. December 2013, 22:39 »
Hehe nein. Programme kann ich noch nich starten. Aber das dürfte ja soweit kein Problem sein, als das Programme ja nichts weiter als C-Codes sind und als "Prozesse" ausgeführt werden.
Ich dachte eig. evtl ein Terminalprozess zu starten, von wo aus man die Programme starten kann. Sowas wie ne Konsolenumgebung also.
Bis jetzt ist mein OS nur so weit:
Kernel startet -> init GDT -> init IDT -> init IRQs -> init ISR -> init Timer -> init Keyboard.
Bis jetzt gibt er nur sowas wie "Willkommen" aus und dann kann man tippen soviel man will. Also noch nichts großartiges, obwohl es mir eig ziemlich
gut gefällt haha.
2
Lowlevel-Coding / Keyboard Treiber und Weitere Schritte
« am: 01. December 2013, 21:16 »
Hallo!
Es ist zwar kein Problem, aber ich wollte dennoch einfach mal fragen.
Ich hab einen kleinen Keyboardtreiber geschrieben, der die gängigsten Operationen beherrscht (Eingabe, Shift, Backspace, Enter).
Wenn ich das in Bochs starte und z.B. 'ä' ,'ü' 'ß' 'Alt Gr' drücke, krieg ich die nachricht, dass diese Keys nicht gemappt sind.
Wie kann ich das umgehen?

Weiterhin wollte ich einfach mal Fragen, wie ich mit dem ganzen umgehe.
Ich habe jetzt eine Ausgabefunktion für VGA und einen Eingabetreiber.
Sollte ich jetzt einen Prozess 'Terminal' erstellen, der beim Start automatisch aufgerufen wird und die Eingabe z.B. in nem Array speichert und mit im Programm hinterlegten Befehlen vergleicht und auswertet?

Was wäre der nächste logische Schritt beim OS-Deving?
Bin ich jetzt besser beim Multithreading aufgehoben? Weil ich hab die befürchtung, dass ich das im reinen Terminalmodus
noch garnicht sinnvoll verwenden kann.

Wie kann man es z.B. Anstellen eine Art kleines textpasiertes Paintprogramm zu erstellen?
Wie kann man z.B. Daten am besten speichern? Verkettete Liste? Oder kann man tatsächlich z.B. .txt Datein erstellen.
Aber wo speichern?

Viele Fragen und ich hoffe auf rege Antworten!
Vielen Dank im Vorraus!!!
3
Lowlevel-Coding / Re: Und wieder ein Problem. Timer @ IRQ0
« am: 29. November 2013, 20:26 »
Ahhhh wunderbar! Vielen Dank!  :mrgreen:
4
Lowlevel-Coding / Re: Und wieder ein Problem. Timer @ IRQ0
« am: 29. November 2013, 19:58 »
Okay es klingt zwar ziemlich dämlich. Und ich entschuldige mich im vorraus dafür.
Der Fehler bestand einfach darin, dass ich in der asm die irq's zum isr_stub jumpen lassen hab anstatt zum irq...
das ist das dumme wenn man die isrs kopiert um sich arbeit zu sparen haha.
Ein Ding ist mir bis jetzt aber immer aufgefallen.
Ich hab von RealMode BIOS-Print immernoch diesen blinkenden Positions-Unterstrich, der sich auch nicht bewegt, wenn ich im VGA-Speicher rumschreibe.
Ist zwar optisch, aber wie verschwindet der?
5
Lowlevel-Coding / Und wieder ein Problem. Timer @ IRQ0
« am: 29. November 2013, 19:31 »
Hey... mal wieder lol. Ich fühl mich als würde ich das Forum zuspamen. Sorry dafür!
Ich hab schon wieder ein Problem, das mich fuchsig macht.
Und zwar habe ich IRQs eingerichtet und remapped, damit IRQ0 nicht Double Fault aufruft.
Soweit so gut.
Dass dies geklappt hat merkt man, dass er nicht mehr 18222 mal in der Sekunde Double Fault Exception Catched (hab zur Probe mal das hlt ausgeschaltet)
Aber wenn den Timer "installiere" (also eine Handler-Funktion erstelle, die Funktion eintrage, und den so den IRQ -32 mache (ich habe die IRQs 0-15 auf IDT 32 - 47 gelegt) dann rührt sich nichts. Also der Kernel läuft wie vorher nur dass die Funktion ihren Satz nicht ausgeben mag.

Hier werden erstmal die IRQs installiert:
void irq_install()
{
void init_irq()
{
irq_remap();
set_idt_entry(32, (unsigned)irq0, 0x08, 0x8e);
set_idt_entry(33, (unsigned)irq1, 0x08, 0x8e);
set_idt_entry(34, (unsigned)irq2, 0x08, 0x8e);
    usw usw..
}

Hier geremapped
void irq_remap(void)
{
    outportb(0x20, 0x11);
    outportb(0xA0, 0x11);
    outportb(0x21, 0x20);
    outportb(0xA1, 0x28);
    outportb(0x21, 0x04);
    outportb(0xA1, 0x02);
    outportb(0x21, 0x01);
    outportb(0xA1, 0x01);
    outportb(0x21, 0x0);
    outportb(0xA1, 0x0);
}
Die dazugehörige costum Funktion
void outportb (unsigned short _port, unsigned char _data)
{
    asm volatile("outb %1, %0" : : "dN" (_port), "a" (_data));
}

Hier ist das Array und der handler_installer, der die handler in dem array ablegt
void* irq_routines[16]=
{
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
};

void irq_install_handler(int irq, void (*handler)(struct regs *r))
{
irq_routines[irq] = handler;
}
Von hier aus werden die Handler aufgerufen
void irq_handler(struct regs *r)
{
void(*handler)(struct regs *r);
handler = irq_routines[r->int_no -32];
if(handler)
{
handler(r);
}
if (r->int_no >= 40)
{
outportb(0xA0, 0x20);
}
outportb(0x20,0x20);
}


So.. Menge Zeug erstmal
Hier ist jetzt der timer_handler
und der installer
void timer_handler(struct regs *r)
{
timer_ticks++;
if(timer_ticks %18==0)
{
print("1 Second passed\n");
}
}

void init_timer()
{
irq_install_handler(0, timer_handler);
}

und nicht zu vergessen der Aufruf in der main()
init_irq();
init_timer();
asm volatile("sti");
6
Lowlevel-Coding / Re: Assembler Generell (push byte x)
« am: 28. November 2013, 18:10 »
Okay xD auch wenn ich jetzt oft hintereinander gepostet und Beiträge editiert habe...
Ich wollte nur bescheid sagen: Problem gelöst
Der Fehler lag hier:
mov fault_handler, %eax
Es muss heissen:
mov $fault_handler, %eax
7
Lowlevel-Coding / Re: Assembler Generell (push byte x)
« am: 28. November 2013, 16:48 »
soooo. gefixt, kompiliert und in main initialisiert. dannach als test a=a/0; gemacht.
image geupdated und bochs ausgeführt. Er startet immer wieder neu ??.
Ich dachte ich mach das, damit das nicht passiert :S.

Das ist der Code den ich vin Bochs kriege:
00053351628e[CPU0 ] read_RMW_virtual_dword_32(): segment limit violation
und das für ziemlich viele Adressen. Läuft diese Violations also in ner Endlosschleife ab

edit:
hab ein klein wenig geändert.
Jetz bekomm ich von Bochs folgendes:

00124087052e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087058e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087148e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087154e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087244e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087250e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087318e[CPU0 ] fetch_raw_descriptor: GDT: index (736f) e6d > limit (27)
00124087352e[CPU0 ] load_seg_reg(ES, 0x636f): RPL & CPL must be <= DPL
00124087386e[CPU0 ] fetch_raw_descriptor: GDT: index (3f) 7 > limit (27)
00124087420e[CPU0 ] load_seg_reg(ES, 0x000a): RPL & CPL must be <= DPL
00124087476e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087482e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087550e[CPU0 ] load_seg_reg(ES, 0x535f): invalid segment
00124087584e[CPU0 ] load_seg_reg(ES, 0x4d5f): invalid segment
00124087640e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087646e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087714e[CPU0 ] fetch_raw_descriptor: GDT: index (c07) 180 > limit (27)
00124087748e[CPU0 ] fetch_raw_descriptor: GDT: index (a07) 140 > limit (27)
00124087782e[CPU0 ] fetch_raw_descriptor: GDT: index (807) 100 > limit (27)
00124087816e[CPU0 ] fetch_raw_descriptor: GDT: index (607) c0 > limit (27)
00124087850e[CPU0 ] fetch_raw_descriptor: GDT: index (407) 80 > limit (27)
00124087884e[CPU0 ] fetch_raw_descriptor: GDT: index (207) 40 > limit (27)
00124087940e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087946e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124088014e[CPU0 ] fetch_raw_descriptor: GDT: index (107) 20 > limit (27)
00124088070e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124088076e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124088222p[IOAP ] >>PANIC<< I/O apic write with len=1 (should be 4)

Bochs startet also ca. 4 mal, dann bleibts hängen und fragt ob ich "die" möchte
8
Lowlevel-Coding / Re: Assembler Generell (push byte x)
« am: 28. November 2013, 16:34 »
oh damn. man man! Oh man. Es kam mir zwar seltsam vor, hab mir aber bei nichts gedacht, dass bei bei dem Tut die Vars unterschiedlich dargestellt worden sind. Dummes Windows haha.
Danke. Jetzt Kompiliert er ^^
9
Lowlevel-Coding / Re: Assembler Generell (push byte x)
« am: 28. November 2013, 15:45 »
okay gut. jetzt habe ich aber noch mehr Probleme bekommen :/

Der Teilcode in isrs.c
#include "system.h"
extern void isr0();
extern void isr1();
extern void isr2();
extern void isr3();
extern void isr4();

void isrs_install()
{
set_idt_entry(0, (unsigned)isr0, 0x08, 0x8E);
set_idt_entry(1, (unsigned)isr1, 0x08, 0x8E);
set_idt_entry(2, (unsigned)isr2, 0x08, 0x8E);
set_idt_entry(3, (unsigned)isr3, 0x08, 0x8E);
set_idt_entry(4, (unsigned)isr4, 0x08, 0x8E);
}

Der Teilcode in start.S
.global _start
_start:
    // Stack initialisieren
    mov $kernel_stack, %esp
 
    // C-Code aufrufen
    call main
 
    endlessjmp:
    jmp endlessjmp
   
    //ISRs
    .global _isr0
    .global _isr1
    .global _isr2
    .global _isr3
    .global _isr4
   
    _isr0: //Divide by Zero
      cli
      push $0x0000
      push $0x0000
      jmp isr_common_stub
     _isr1: //Debug
      cli
      push $0x0000
      push $0x0001
      jmp isr_common_stub

.extern _fault_handler
     
     isr_common_stub:
      pusha
      push %ds
      push %es
      push %fs
      push %gs
      mov $0x10, %ax
      mov %ax, %ds
      mov %ax, %es
      mov %ax, %fs
      mov %ax, %gs
      mov %esp, %eax
      push %eax
      mov _fault_handler, %eax
      call %eax
      pop %eax
      pop %gs
      pop %fs
      pop %es
      pop %ds
      popa
      add $8, %esp
      iret

Was mir die Konsole ausspuckt:

start.o: In function `isr_common_stub':
(.text+0x11e): undefined reference to `_fault_handler'
isrs.o: In function `isrs_install':
/home/dennis/Desktop/Tutorial/src/isrs.c:37: undefined reference to `isr0'
/home/dennis/Desktop/Tutorial/src/isrs.c:38: undefined reference to `isr1'
/home/dennis/Desktop/Tutorial/src/isrs.c:39: undefined reference to `isr2'
/home/dennis/Desktop/Tutorial/src/isrs.c:40: undefined reference to `isr3'
/home/dennis/Desktop/Tutorial/src/isrs.c:41: undefined reference to `isr4'
make: *** [kernel] Error 1

Langsam verzweifele ich.
10
Lowlevel-Coding / Assembler Generell (push byte x)
« am: 28. November 2013, 15:07 »
hey hey!
Ich hab da n großes Problem. Naja wahrscheinlich eher ein kleines.
Am besten schreibe ich direkt den Code und was dabei rauskommt
_isr0: //Divide by Zero
      cli
      push byte 0
      push byte 0
      jmp isr_common_stub
     _isr1: //Debug
      cli
      push byte 0
      push byte 1
      jmp isr_common_stub

Das erzeugt bei mir den Fehler:
$ make
gcc -m32 -c -o start.o start.S
start.S: Assembler messages:
start.S:67: Error: junk `0' after expression
start.S:68: Error: junk `0' after expression
start.S:72: Error: junk `0' after expression
start.S:73: Error: junk `1' after expression
Es ist gut möglich, dass es mit Nasm gehen würde, aber dann müsste ich den ganzen Code ändern.
Wie mache ich es in der Notation?
11
Lowlevel-Coding / Re: Probleme mit dem Tutorial (GDT)
« am: 27. November 2013, 16:18 »
Ahh! damn okay jetzt hab ich es verstanden! Ich dachte ständig ich mache mehrere GDT's. Das war der Knoten, Danke.
Gut.
Achso, ja der Code aus meinem letzten Post ist natürlich unvollständig, ohne das Neuladen der Seg-Registers.
Das hab ich nach dem Inlinebefehl zum Laden des GDT ebenso in Inline gemacht.

void load_gdt()
{
asm volatile("lgdt %0" : : "m" (gdtp));
asm volatile("mov $0x10, %%ax;mov %%ax, %%ds;mov %%ax, %%es;mov %%ax, %%fs;mov %%ax, %%gs;mov %%ax, %%ss;" : : );
asm volatile("ljmp $0x8, $.1;.1:;" : : );
print("ola");
}

So sieht das dann aus.
Scheint auch zu funktionieren. Hab testhalber ein print("ola") hinzugefügt um zu sehen ob er bis zum Ende kommt oder vorher abbricht.
Aber nein, er schafft es :).
Soweit in meinem geposteten Codes keine Fehler gefunden werden (Ich hoffe mal, dass es jetzt richtig ist) kann das also als
beantwortet gesehen werden!
Danke nochmal!
12
Lowlevel-Coding / Re: Probleme mit dem Tutorial (GDT)
« am: 27. November 2013, 15:34 »
Sooo. Ich habe mal etwas probiert.
Das Ergebnis (Bochs zeigt nur den Text an, den ich mittels meiner print Funktion anzeigen lasse) sollte eig. bedeutet, dass keine Probleme aufgetreten sind.

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#define GDT_FLAG_DATASEG 0x02
#define GDT_FLAG_CODESEG 0x0a
#define GDT_FLAG_TSS     0x09
#define GDT_FLAG_SEGMENT 0x10
#define GDT_FLAG_RING0   0x00
#define GDT_FLAG_RING3   0x60
#define GDT_FLAG_PRESENT 0x80
#define GDT_FLAG_4K_GRAN 0x800
#define GDT_FLAG_32_BIT  0x400
#define GDT_ENTRIES 5

static uint64_t gdt[GDT_ENTRIES];
struct {
    uint16_t limit;
    void* pointer;
} __attribute__((packed)) gdtp = {
    .limit = GDT_ENTRIES * 8 - 1,
    .pointer = gdt,
};


static void set_entry(int i, unsigned int base, unsigned int limit, int flags)
{
    gdt[i] = limit & 0xffffLL;
    gdt[i] |= (base & 0xffffffLL) << 16;
    gdt[i] |= (flags & 0xffLL) << 40;
    gdt[i] |= ((limit >> 16) & 0xfLL) << 48;
    gdt[i] |= ((flags >> 8 )& 0xffLL) << 52;
    gdt[i] |= ((base >> 24) & 0xffLL) << 56;
}
void init_gdt(void)
{
    set_entry(0, 0, 0, 0);
    set_entry(1, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_CODESEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT);
    set_entry(2, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_DATASEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT);
    set_entry(3, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_CODESEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
    set_entry(4, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_DATASEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
 
    load_gdt();
}
void load_gdt()
{
asm volatile("lgdt %0" : : "m" (gdtp));
}

Das ist die gdt.c Datei.
Kann mir jemand bestädigen das das operabel ist?
13
Lowlevel-Coding / Re: Probleme mit dem Tutorial (GDT)
« am: 27. November 2013, 15:22 »
Okay also doch selber definieren.
Deswegen war ich so verwirrt von dem dargestellten Code lol.
Demnach ist GDT_Entries = 5, weil es 0-5 Entries sind.
Aber was ist mit load_gdt();?
Wie wird die definiert? Wie gebe ich dem lgdt meine Sammlung an GDT's?
Und was ist mit der Variable gdt?
Sollte das Struct in die Funktion set_entry?
Oder sollte das Struct in die von mir dann selbst erstelle Funktion load_gdt();
Aber dann übergebe ich ja trotzdem nicht gdt :/
Weiterhin wird "asm" sowie "__asm__" nicht akzeptiert. er will immer ein '(' vor dem volatile :(
Ich glaub ich steh wirklich etwas neben mir :(
14
Lowlevel-Coding / Re: Probleme mit dem Tutorial (GDT)
« am: 27. November 2013, 12:11 »
naja mein compiler meckert mich an, dass load_gdt nicht definiert ist, genauso wie GDT_ENTRIES lol. Ich glaube ich stehe so aufm Schlauch dass ich was grundlegendes übersehe und wenn ich es sehe, denk ich "oh man... natürlich"
make
gcc -m32 -Wall -g -fno-stack-protector -c -o gdt/gdt.o gdt/gdt.c
gdt/gdt.c:13:21: error: ‘GDT_ENTRIES’ undeclared here (not in a function)
gdt/gdt.c:21:9: error: expected ‘(’ before ‘volatile’
gdt/gdt.c: In function ‘init_gdt’:
gdt/gdt.c:44:5: warning: implicit declaration of function ‘load_gdt’ [-Wimplicit-function-declaration]
gdt/gdt.c: At top level:
gdt/gdt.c:13:17: warning: ‘gdt’ defined but not used [-Wunused-variable]
make: *** [gdt/gdt.o] Error 1


Das ist das was ich bekomme, wenn ich kompiliere :(

So sieht mein Code aus:
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#define GDT_FLAG_DATASEG 0x02
#define GDT_FLAG_CODESEG 0x0a
#define GDT_FLAG_TSS     0x09
#define GDT_FLAG_SEGMENT 0x10
#define GDT_FLAG_RING0   0x00
#define GDT_FLAG_RING3   0x60
#define GDT_FLAG_PRESENT 0x80
#define GDT_FLAG_4K_GRAN 0x800
#define GDT_FLAG_32_BIT  0x400
static uint64_t gdt[GDT_ENTRIES];
struct {
    uint16_t limit;
    void* pointer;
} __attribute__((packed)) gdtp = {
    .limit = GDT_ENTRIES * 8 - 1,
    .pointer = gdt,
};
__asm__ volatile("lgdt %0" : : "m" (gdtp));

static void set_entry(int i, unsigned int base, unsigned int limit, int flags)
{
    gdt[i] = limit & 0xffffLL;
    gdt[i] |= (base & 0xffffffLL) << 16;
    gdt[i] |= (flags & 0xffLL) << 40;
    gdt[i] |= ((limit >> 16) & 0xfLL) << 48;
    gdt[i] |= ((flags >> 8 )& 0xffLL) << 52;
    gdt[i] |= ((base >> 24) & 0xffLL) << 56;
}
void init_gdt(void)
{
    set_entry(0, 0, 0, 0);
    set_entry(1, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_CODESEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT);
    set_entry(2, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_DATASEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT);
    set_entry(3, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_CODESEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
    set_entry(4, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT |
        GDT_FLAG_DATASEG | GDT_FLAG_4K_GRAN | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
 
    load_gdt();
}
15
Lowlevel-Coding / Probleme mit dem Tutorial (GDT)
« am: 27. November 2013, 10:30 »
Hey. Also ich hab Probleme mit der interpretation des Artikels
[1]http://www.lowlevel.eu/wiki/Teil_5_-_Interrupts ,sowie das dazu nötige
[2]http://www.lowlevel.eu/wiki/Global_Descriptor_Table

Aber zunächst eine generelle (vll auch doofe) Frage: Zeigen GDT's auf ein Daten/Code-Segment, oder ist dieses Segment im GDT enthalten?

Naja jedenfalls:
Im Artikel [1] werden ja über init_gdt(void) die GDT's gesetzt.
In dieser Funktion ist ein load_gdt();
Vorraussetzung für dies war der Artikel [2], indem die Funktion set_entry beschrieben wird, die zunächst benötigt wird.
Nur versteh ich die Form vom Struct nicht. Es besitzt weder Namen noch Variable-Beschreibung. (Ich kenne es als strucht bla{ /////}bla1,bla2;)
Wie wird also der Pointer auf das gerade eingerichtete GDT erstellt?
Und was hat es mit der nirgends definierten Funktion load_gdt(); zu tun, die am Ende von init_gdt aufgerufen wird?
Vielen Danke im Vorraus!

Ps.: Achja. Wenn ich den Befehl "make" in Linux aufrufe um das ganze zu builden (ich habe init_gdt(), set_entry() und die struct in eine externe .c datei gelagert und über header eingebunden) dann bekomm ich den Fehler, dass vor dem "volatile" doch bitte ein '(' zu stehen hat.
16
Oh vielen Dank für dein Willkommen haha. Naja laut Hex-Editor lädt der Boot-Sect den Kernel tatsächlich direkt nach die aa55.
Gut ja das Problem mit den Sektoren laden ist klar, wenn keine mehr da sind, kann auch nichts geladen werden.
Fands halt nur seltsam, dass es laut Buch klappen sollte.
Kann mir jetzt aber auch denken: Wenn das Programm von einem realen Datenträger käme, wäre auch darüberhinaus 0-Werte, die man laden kann. Eine Datei hört einfach auf :D.
Naja zumindest läuft es jetzt, und da ich jetzt weiss wie es läuft, warum es läuft und kann mich jetzt den schönen Dingen widmen :).
Trotzdem, vielen Dank!
Achja. Ich hatte vorher nochmal alles überprüft gehabt (vor dem Wechsel zu Bochs).
Er sprang tatsächlich in den PM und gab die Nachricht "Started in 32-Bit Protected Mode" aus.
Sobald ich den Befehl "call KERNEL_OFFSET" (was hier 0x1000 ist, so wie es über gcc und ld auch kompiliert und geladen wurde) wieder eingebunden habe, spielte alles verrückt
17
Okay das klingt jetzt vll seeeehr seltsam. Ich habe Bochs unter Ubuntu durch Anleitung zum laufen gekriegt (install von bochs-x, install von bochs-sdl, veränderung der bochsrk) und jetzt läuft mein boot vollständig!
Woran kann das liegen? Ist da irgendetwas was Bochs richtiger macht?
18
Nun ja, ich will aber, ist kein grund, aber ich will erstmal das grundlegenste über OS-Dev lernen, und dazu gehört ein Bootloader und das Bootstrapping.
Da ich noch relativ neu bei der Sache bin, eröffnen sich bei deiner Antwort natürlich noch weitere Fragen.

Was sind LBA-Adressen und was sind CHS-Adressen?
Beim Start des Bootsektors habe ich doch bp und sp gesetzt?

Bei load_kernel wird der Offset des Kernels über die Konstante KERNEL_OFFSET, die Anzahl der Sektoren über dh (hier 5) und die Disk über dl (hier zunächst von dl in [BOOT_DRIVE], dannach wieder zurück zu dl) übergeben.

Das Problem beim laden hatte ich zuvor auch schon, wo der Boot-Sektor nur aus Lade Daten und gebe sie aus bestand.

Da wurd nach dem padding und der magischen Zahl 55aa (bzw aa55) jeweils 256 mal 0xdada und 256 mal 0xface in den code geschrieben.
Beim laden habe ich immer das Problem: wenn ich mehr Sektoren lade, als ich vorher beschriftet habe, dann kriege ich einen Fehler.
Laut dem Buch, welches ich dafür benutze sollte ich eig 15 Sektoren laden. Soviele wurden aber mit Boot_Sektor und Kernel garnicht beschrieben.

Wie gesagt, Ich wollte als nächstes die main() über assembler labeln, damit auch garantiert dahingesprungen wird.

Ich wollte nach dem Fiasko und der Frustration auch Grub verwenden. Nur da hab ich keinen Einstieg, da ich jetzt in dem Thema "voll drin bin" und weil ich absolut keine Ahnung habe, wie ich Grub in Qemu zum laufen kriege.

Zum Punkt: Bootsektor selber in den PM springen lassen:
Kann ich denn auch den Kernel nach dem laden in den PM-Mode springen lassen? Oder wie meinst du das?

Ich kann auch nicht sagen ob der PM-Kram 100% richtig ist. Hab es über das Buch gemacht (die stellen dabei Aufgaben und nach den Aufgaben entwickelt man es praktisch) hab aber auch schon das komplett nochmal abgeglichen. Hab das Flat-Mode für die GDT verwendet (zwei überlappende, ein Data-Seg ein Code-Seg).
19
Da ich nur max 4 Dateien laden kann, hier der Rest ^^. Und, achja, ich nutze Qemu zu testen, da Bochs bei mir ständig Die'd, wenn ichs starte.
Um zu teste, verbinde ich nach nasm, gcc und ld die boot_sect.bin und kernel.bin zu einer os-image mit cat
Danke trotzdem im Vorraus!
20
 :|Hey hey! Ich brauch ein wenig Hilfe.
Und zwar hab ich einen Boot-Sektor geschrieben, der zunächst einen Text ausgibt, dann den Kernel lädt und dies ebenso mit einer MSG quittiert und dann in den 32-Bit-Protected übergeht und zum Kernel springt.
Kompiliert habe ich die asm mit nasm und die .c's mit gcc und ld ohne 32 flag (ich sitze an nem 64 bit linux). War natürlich zum scheitern verurteilt.
Teilweise spuckt er Fehler aus, dass die Sektoren nicht richtig geladen werden können, teilweise landet er in nem Loop bei dem alles immer wieder schnell durchläuft.
Nachdem ich über gcc und ld mit 32 flag compiliert habe, landet er auch im Endlosmodus.

Seltsamerweise klappt es mit 64Bit-Komp des Kerlen.c's wenn ich am Ende des Boot-Sektors folgendes einbinde:
times 1000-($-$$)db 0
times 1000 dw 0
schreibe. Aber auch nur mit genau dem Kernel :( Verändere ich die Kernel.C, dann klappts wieder nicht.
Der letzte schritt sollte bei mir eig sein, ein Label in asm für die Main-Funk im Kernel anzulegen, damit der Bootloader immer zur main springt.
Aber das kann ich im moment vergessen.

Ich hänge mal die asm' und kernel.c an.
Hoffe ich könnt mir ein wenig helfen.
Seiten: [1]

Einloggen