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

Seiten: [1] 2 3
1
Lowlevel-Coding / Re:C - Kernel über GRUB ausführen
« am: 16. July 2010, 18:43 »
Wenn ich die "stage1" und "stage2" mittels "copy /b stage1 + stage2 boot" zusammenfüge und mit RawWrite auf Diskette schreibe,
wird GRUB geladen. Aber dann kommt eine Eingabeaufforderung und keine Bootliste... Ich verwende die Binarys von Version 0.94.

2
Lowlevel-Coding / Re:C - Kernel über GRUB ausführen
« am: 16. July 2010, 14:56 »
Das GRUB - Image hab ich aus "stage1" und "stage2" zusammengefügt.
Oh ja, hab vergessen das mit dem bootlace zu erwähnen: Wenn ich bootlace ausführe kommt eine Fehlermeldung das ich das nicht unter einem 64Bit - System ausführen kann... gibts da eine andere Moeglichkeit?

Edit:
Ich hab mir die "floppy.img" - Datei mal in Notepad angesehen und da hab ich nach "Hello World" und "GRUB" gesucht
und fündig geworden. Das heißt das GRUB und mein Kernel in der floppy.img drin sind.
Ausserdem war da drin auch die Meldung "No Systemdisk. Booting from harddisk..." zu finden...
3
Lowlevel-Coding / C - Kernel über GRUB ausführen
« am: 16. July 2010, 14:21 »
Hallo,

ich moechte den GRUB - Bootloader verwenden um meinen C - Kernel auszuführen. Funktioniert allerdings nicht,
weil der Bootloader nicht geladen/erkannt wird. Ich hab das nach diesem Tutorial gemacht: http://www.lowlevel.eu/wiki/C-Kernel_mit_GRUB

Ich verwende Windows 7 64Bit und habe den Kernel mit dem Crosscompiler kompliliert.
So gehe ich vor:

Als erstes folgende Batch - Datei ausführen:

// Assembler
nasm -f elf -o D:/Programmieren/OS/ckernel/kernel.o D:/Programmieren/OS/ckernel/kernel_asm.asm

// C - Kernel
i586-elf-gcc -m32 -ffreestanding -o D:/Programmieren/OS/ckernel/kernel_c.o -c D:/Programmieren/OS/ckernel/kernel.c -Wall -Werror -nostdinc

// Linken
i586-elf-ld -T D:/Programmieren/OS/ckernel/link.txt -o D:/Programmieren/OS/ckernel/bin/kernel.bin D:/Programmieren/OS/ckernel/kernel.o D:/Programmieren/OS/ckernel/kernel_c.o

// Mit dem GRUB - Bootloader "vereinen"
bfi -t=144 -f=D:/Programmieren/OS/ckernel/floppy.img D:/Programmieren/OS/ckernel/bin

pause

(Die Dateien "kernel.c", "kernel_asm.asm" und "link.txt" sind mit den Dateien aus dem Tutorial identisch)

Im "bin" - Ordner ist eine Datei mit dem Namen "boot", welche aus der Datei "stage1" und "stage2" zusammengefügt wurde
(copy /b stage1 + stage2 boot).

Danach schreibe ich die Datei "floppy.img" mit dem Programm "RawWrite" auf eine Diskette (1,44MB).
Wenn ich von der Diskette mit Bochs boote, kommt folgende Ausgabe:

Booting from Floppy...
Disk formatted with WinImage 4.00 (c) 1993-97 Gilles Vollant
Bootsector from C.H. Hochstätter

No Systemdisk. Booting from harddisk
Cannot load from harddisk
Insert Systemdisk and press any key.

Die Konfigurationsdatei für Bochs:
megs:32
romimage: file=BIOS-bochs-latest, address=0xf0000
vgaromimage: VGABIOS-elpin-2.40
floppya: 1_44=a:, status=inserted
boot: a
log: protokoll.log
mouse: enabled=0
debugger_log: debug.log
debugger_log: -

Ich versuch das schon seit Tagen ohne Erfolg...
Wäre also sehr dankbar wenn mir jemand sagen koennte was ich falsch mache  :-)
4
Offtopic / Re: C Klasse-Funktion außerhalb redefinieren
« am: 03. September 2009, 12:07 »
Vielen Dank, klappt wunderbar  :wink:!
5
Offtopic / Re: C Klasse-Funktion außerhalb redefinieren
« am: 03. September 2009, 11:04 »
Sorry, will das aber anders machen, z.B. so:

Klasse KL1
Klasse KL2
Klasse KL3

void KL1::Funktion(int i) {
printf("KL1");
}

void KL2::Funktion(int i) {
printf("KL2");
}

void KL3::Funktion(int i) {
printf("KL3");
}
6
Offtopic / C Klasse-Funktion außerhalb redefinieren
« am: 03. September 2009, 10:36 »
Hi, bin grade dabei eine Klasse in C zu schreiben, komme aber
an einem Punkt nicht weiter.
Ich will eine Funktion, die in in einer Funktion definiert ist, außerhalb
der Klasse redefinieren. Also so:

class Klasse {
    public:
   
    void Funktion(int i);
};

Klasse KL;

void KL::Funktion(int i) {
    // ...
}

Da kommt dann diese Meldung:
KL is not a class or namespace
Bei
void KL.Funktion(int i) {
   // ...
}

kommt

expected initializer before '.' token|
Weiß jemand wie das richtig geht?
7
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 23. August 2009, 15:40 »
Jetzt gehts, hat am IDT - Pointer gelegen, vielen Dank an alle  :-D!
8
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 23. August 2009, 12:29 »
Habs geändert, aber der Fehler ist immernoch der selbe  :-(.
9
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 23. August 2009, 11:38 »
Habs jetzt hinbekommen, das Interrupts.asm mit "ELF" komplimiert wird und
der Linker das akzeptiert. Aber die Interrupts wollen immer noch nicht gehen :(, wenn ich jetzt

asm("sti");
am Ende der remap_irq - Funktion schreibe, dann sagt Bochs:

00004399371-i-@00001d72-[CPU0 ] >> mov byte ptr ds:[eax], 0x00 : C60000
00004399371-e-@00001d72-[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting

Wenn ich ein Interrupt ausführe, ohne das "sti", sagt Bochs wieder das
selbe wie am Anfang:

00008848368-i-@00001038-[CPU0 ] >> int 0x16 : CD16
00008848368-e-@00001038-[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting

Liegt das vielleicht daran?:

idt_set_gate(1, (unsigned)intr1, 0x08, 0x8E);
Hier nochmal der Code:

#include <stdint.h>
#include "hInit.h"

extern void intr0();
...
extern void intr47();

void install_interrupts();

int begin() {
install_interrupts();

v_clear();

v_print("$3-=Xype=-", 0);
v_print("$2Willkommen!", 2);
asm("int $0x16");
v_print(str_replace("Eingabe", "ga", ""), 3);

while(1);
}

static inline void outb(unsigned short port, unsigned char data) {
asm volatile ("outb %0, %1" : : "a" (data), "Nd" (port));
}

void remap_irq(void) {
outb(0x20, 0x11);
outb(0xA0, 0x11);
outb(0x21, 0x20);
outb(0xA1, 0x28);
outb(0x21, 0x04);
outb(0xA1, 0x02);
outb(0x21, 0x01);
outb(0xA1, 0x01);
outb(0x21, 0x0);
outb(0xA1, 0x0);
}

void install_interrupts() {
remap_irq();

idt_set_gate(0, (unsigned)intr0, 0x08, 0x8E);
idt_set_gate(1, (unsigned)intr1, 0x08, 0x8E);
idt_set_gate(2, (unsigned)intr2, 0x08, 0x8E);
...
idt_set_gate(47, (unsigned)intr47, 0x08, 0x8E);

struct {
unsigned int limit;
unsigned int base;
}  __attribute__((packed)) idt_ptr = {
.limit  = 256*8 - 1,
.base  = (unsigned int)IDT,

};

asm("lidt %0" : : "m" (idt_ptr));
}

struct registers {
unsigned int gs, fs, es, ds;
unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
unsigned int int_num, err_code;
unsigned int eip, cs, eflags, useresp, ss;
};

void *interrupt_routines[256];

void install_handler(int interrupt, void (*handler) (struct registers *regs)) {
interrupt_routines[interrupt] = handler;
}

void interrupt_handler(struct registers *reg) {
void (*handler)();

handler = interrupt_routines[reg->int_num];
if (handler) {
handler(reg);
}

if(reg->int_num >= 40) {
outb(0xA0, 0x20);
}
outb(0x20, 0x20);
}

void idt_set_gate(uint16_t num, uint32_t base, uint16_t sel, uint8_t attr) {
IDT[num].offset_low = (base & 0xFFFF);
IDT[num].offset_high = (base >> 16) & 0xFFFF;
IDT[num].selector = sel;
IDT[num].zero = 0;
IDT[num].attribute = attr;
}

#include "hString.h"
#include "hVideo.h"
#include "hInput.h"

Am Assembler - Code habe ich nur wie gesagt die Unterstriche
vor jedes "intr" und vor jede Funktion.
10
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 21:29 »
@DaCodaaa Thx, jo hab ich selber gemacht, ist aber noch net fertig  :-D
11
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 21:22 »
Hab in der *.o Datei von Interrupts.asm nachgeschaut.
Nach dem ich in Interrupts.am vor jeder Variable ein _ habe
waren die in der *.o - Datei auch, und habe in kernel.o nachgeschaut
da waren die Unterstriche genauso, also müsste es passen.
12
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 20:51 »
Es ist nur noch dieser Fehler, wenn der weg ist, klappts endlich.
Wo genau muss ich im Assembler Code die Unterstriche setzen?
13
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 20:26 »
Danke, das mit outb klappt jetzt  :-), nur das mit dem Unterstrich noch net  :-(.

Muss ich das so machen?

Interrupts.asm
intr_0
intr_1
intr_2
...
14
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 19:52 »
"outb" ist nirgends im Assembler Code zu finden, aber "intr" schon.

Welche Symbole?
15
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 19:34 »
Habs mit "coff" gemacht.
nasm -f coff -o Interrupts.o Interrupts.asm
Linker.ld
INPUT("C:\Users\Pk3\Desktop\C_Kernel\Interrupts.o")
INPUT("C:\Users\Pk3\Desktop\C_Kernel\kernel.o")
ENTRY(_begin)
SECTIONS
{
  .text  0x1000 :
  {
    *(.text)
    *(.rdata)
    *(.rodata*)
  }
  .data  :
  {
    *(.data)
  }
  .bss  :
  {
    *(.bss)
  }
}

make.bat
ECHO OFF
nasm -f bin -o boot.bin boot.asm
nasm -f coff -o Interrupts.o Interrupts.asm

cd C:
cd C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\

echo Compiling Kernel...
D:\Programme\CodeBlocks\MinGW\Bin\gcc -O3 -ffreestanding -m32 -fleading-underscore -c -o C:\Users\Pk3\Desktop\C_Kernel\kernel.o C:\Users\Pk3\Desktop\C_Kernel\kernel.c
echo Linking...
C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\ld -O 1 -T C:\Users\Pk3\Desktop\C_Kernel\link.ld -o C:\Users\Pk3\Desktop\C_Kernel\kernel.bin
echo Convert binary...
C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\objcopy -O binary C:\Users\Pk3\Desktop\C_Kernel\kernel.bin
echo Make Image...
copy /b C:\Users\Pk3\Desktop\C_Kernel\boot.bin + C:\Users\Pk3\Desktop\C_Kernel\Interrupts.bin + C:\Users\Pk3\Desktop\C_Kernel\kernel.bin C:\Users\Pk3\Desktop\C_Kernel\os.img

xcopy C:\Users\Pk3\Desktop\C_Kernel\os.img D:\Programme\Bochs-2.3.5\os.img /Y

pause

C:\Users\Pk3\Desktop\C_Kernel\rawwritewin.exe C:\Users\Pk3\Desktop\C_Kernel\os.img a:


Meldungen:
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1b7):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1cc):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1e1):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x1f6):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x20b):kernel.c: undefined referenc
e to `outb'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x220):kernel.c: more undefined ref
erences to `outb' follow
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x2e6):kernel.c: undefined referenc
e to `intr1'
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x327):kernel.c: undefined referenc
e to `intr2'....

Irgentwie wird die Assembler - Datei (Interrupts.asm) nicht mit "kernel.c"
verknüpft....

16
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 19:23 »
Ich hab NASM 2.07, welche hast du?
17
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 19:10 »
Geht net, vielleicht liegts an NASM, also wie ich den Assembler Code komplimiert habe?
18
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 18:57 »
void *interrupt_routines[256]So gehts  :-).

Jetzt nurnoch ein Fehler, der kommt aber vom Linker:
C:\Users\Pk3\Desktop\C_Kernel\Interrupts.o: file not recognized: File format not
 recognized

Linker.ld
INPUT("C:\Users\Pk3\Desktop\C_Kernel\kernel.o")
INPUT("C:\Users\Pk3\Desktop\C_Kernel\Interrupts.o")
ENTRY(_begin)
SECTIONS
{
  .text  0x1000 :
  {
    *(.text)
    *(.rdata)
    *(.rodata*)
  }
  .data  :
  {
    *(.data)
  }
  .bss  :
  {
    *(.bss)
  }
}

Aufruf:
nasm -f elf -o Interrupts.o Interrupts.asm
C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\ld -O 1 -T C:\Users\Pk3\Desktop\C_Kernel\link.ld -o C:\Users\Pk3\Desktop\C_Kernel\kernel.bin
19
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 18:26 »
"intr_dispatcher" war nirgends zu finden, hab einfach die kernel.o gelöscht und weg war der Fehler.

Hier mal die ganze Kernel.c:

#include <stdint.h>
#include "hInit.h"

typedef struct {
uint16_t  offset_low;
uint16_t selector;
uint8_t zero;
uint8_t attribute;
uint16_t offset_high;
}id_table;

id_table IDT[256];

int begin() {
//idt_set_gate(0x16, (unsigned), 0x08, IDT_STD_GATE);

v_clear();

v_print("$3-=Xype=-", 0);
v_print("$2Willkommen!", 2);
i_getKey();
v_print(str_replace("Eingabe", "ga", ""), 3);

while(1);
}

extern void intr1();
extern void intr2();
extern void intr3();
extern void intr4();
extern void intr5();
extern void intr6();
extern void intr7();
extern void intr8();
extern void intr9();
extern void intr10();
extern void intr11();
extern void intr12();
extern void intr13();
extern void intr14();
extern void intr15();
extern void intr16();
extern void intr47();

void remap_irq(void) {
outb(0x20, 0x11);
outb(0xA0, 0x11);
outb(0x21, 0x20);
outb(0xA1, 0x28);
outb(0x21, 0x04);
outb(0xA1, 0x02);
outb(0x21, 0x01);
outb(0xA1, 0x01);
outb(0x21, 0x0);
outb(0xA1, 0x0);
}

void install_interrupts() {
remap_irq();

idt_set_gate(1, (unsigned)intr1, 0x08, 0x8E);
idt_set_gate(2, (unsigned)intr2, 0x08, 0x8E);
idt_set_gate(3, (unsigned)intr3, 0x08, 0x8E);
idt_set_gate(4, (unsigned)intr4, 0x08, 0x8E);
idt_set_gate(5, (unsigned)intr5, 0x08, 0x8E);
idt_set_gate(6, (unsigned)intr6, 0x08, 0x8E);
idt_set_gate(7, (unsigned)intr7, 0x08, 0x8E);
idt_set_gate(8, (unsigned)intr8, 0x08, 0x8E);
idt_set_gate(9, (unsigned)intr9, 0x08, 0x8E);
idt_set_gate(10, (unsigned)intr10, 0x08, 0x8E);
idt_set_gate(11, (unsigned)intr11, 0x08, 0x8E);
idt_set_gate(12, (unsigned)intr12, 0x08, 0x8E);
idt_set_gate(13, (unsigned)intr13, 0x08, 0x8E);
idt_set_gate(14, (unsigned)intr14, 0x08, 0x8E);
idt_set_gate(15, (unsigned)intr15, 0x08, 0x8E);
idt_set_gate(16, (unsigned)intr16, 0x08, 0x8E);
idt_set_gate(47, (unsigned)intr47,0x08, 0x8E);
}

struct registers {
unsigned int gs, fs, es, ds; // segmentregister
unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
unsigned int int_num, err_code; // müssen von den Asm funktionen draufgepusht werden
unsigned int eip, cs, eflags, useresp, ss; //ACHTE AUF DIE REIHENFOLGE!!!
};

void *interrupt_routines;

void install_handler(int interrupt, void (*handler) (struct registers *regs)) {
interrupt_routines[interrupt] = handler;
}

void interrupt_handler(struct registers *reg) {
void (*handler)();

handler = interrupt_routines[reg->int_num];
if (handler) {
handler(reg);
}

if(reg->int_num >= 40) {
outb(0xA0, 0x20);
}
outb(0x20, 0x20);
}

void idt_set_gate(uint16_t num, uint32_t base, uint16_t sel, uint8_t attr) {
IDT[num].offset_low = (base & 0xFFFF);
IDT[num].offset_high = (base >> 16) & 0xFFFF;
IDT[num].selector = sel;
IDT[num].zero = 0;
IDT[num].attribute = attr;

struct {
unsigned int limit;
unsigned int base;
}  __attribute__((packed)) idt_ptr = {
.limit  = 256*8 - 1,
.base  = (unsigned int)IDT,

};

asm("lidt %0" : : "m" (idt_ptr));
}

#include "hString.h"
#include "hVideo.h"
#include "hInput.h"

Übrigen Fehler:
C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `install_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: error: invalid use of void expression

C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `interrupt_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: error: void value not ignored as it o
ught to be
20
Lowlevel-Coding / Re: IDT funktioniert nicht
« am: 22. August 2009, 18:03 »
C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `install_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:90: error: invalid use of void expression

C:\Users\Pk3\Desktop\C_Kernel\kernel.c: In function `interrupt_handler':
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: warning: dereferencing `void *' point
er
C:\Users\Pk3\Desktop\C_Kernel\kernel.c:96: error: void value not ignored as it o
ught to be
C:\Users\Pk3\Desktop\C_Kernel\kernel.o(.text+0x18):kernel.c: undefined reference
 to `intr_dispatcher'

Vorhin musste ich "handler" definieren, jetzt gehts auch ohne,
also jetzt hab ichs weggelassen.

89 void install_handler(int interrupt, void (*handler) (struct registers *regs)) {
90 Interrupt_routines[interrupt] = handler;
91 }
92
93 void interrupt_handler(struct registers *reg) {
94 void (*handler)();
95
96 handler = Interrupt_routines[reg->int_num];
97 if (handler) {
98 handler(reg);
99 }
100
101 if(reg->int_num >= 40) {
102 outb(0xA0, 0x20);
103 }
104 outb(0x20, 0x20);
105 }

@taljeth Ja mach ich ja, nur das hab ich übersehen, thx^^
Seiten: [1] 2 3

Einloggen