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

Seiten: [1] 2
1
Lowlevel-Coding / Re: Erkennen ob ein Programm beendet wurde.
« am: 22. February 2010, 10:33 »
Hmm ja ich ich muss es wohl eh so machen dass ich das auch in die queue reinschreibe!
2
Lowlevel-Coding / Re: Erkennen ob ein Programm beendet wurde.
« am: 22. February 2010, 10:02 »
Danke für deine Antwort aber mein Betriebssystem verwendet keine syscalls!
Und... wie funktioniert dein Betriebssystem dann? :|

Es geht so dass ich einen Speicherbereich habe auf den alle Programme (inkl Kernel) zugreifen können in diesem Speicherbereich befindet sich eine Queue in dieser kommt alles rein was ein Programm will textausgabe texteingabe floppyzugriff usw der Kernel verarbeitet diese anfragen und stellt diese dann dem Programm eben in diesem Speicherbereich wieder zur Verfügung.
3
Lowlevel-Coding / Re: Erkennen ob ein Programm beendet wurde.
« am: 22. February 2010, 09:18 »
Hi ChristianF!
Danke für deine Antwort aber mein Betriebssystem verwendet keine syscalls!
4
Lowlevel-Coding / Erkennen ob ein Programm beendet wurde.
« am: 22. February 2010, 08:51 »
Hi Lowlevel-Community!

Mein Multitasking funktioniert so eigentlich einwandfrei! Ich kann die Programme starten die ich will. Jetzt stellt sich aber nur eine Frage! Wie erkenne ich ob ein Programm terminiert ist? Ich hab schon überlegt ob ich das irgendwie mit dem Stack lösen kann z.B. mein Stack ist (14*unsigned long) Bytes groß wenn ich das Programm starte. Da hab ich mir gedacht überprüfe ich doch einfach bei jedem mal wenn ich wieder im Kernel bin ist mein Stack (14*unsigned long) Bytes groß? Wenn ja hau ich das Programm aus dem Speicher. Ist dieser Gedanke zielführend oder gibt es da eine bessere/elegantere/sichere Lösung? Wie habt ihr das gemacht? meine Programme sehen zz. folgendermaßen aus:
#include <stdio.h>

void main() {
    printf("OS1 Testprogramm\n\n");
    while(1){}
}

Ich möchte aber dass es so funktioniert:
#include <stdio.h>

void main() {
    printf("OS1 Testprogramm\n\n");
    return;
}

Danke!
5
Lowlevel-Coding / Re: GRUB VESA wie aktivieren?
« am: 16. February 2010, 16:04 »
Ich hab jetzt die Stage 2 ausprobiert von http://www.ninj4.net/kinetic/ jetzt passiert was ganz komisches was ich überhaupt noch nie erlebt habe: Jetzt schreibt er mir nach booting from floppy... lauter GRUB auf den Bildschirm also lauter GRUB GRUB GRUB GRUB GRUB GRUB GRUB hintereinander :-(

6
Lowlevel-Coding / Re: GRUB VESA wie aktivieren?
« am: 15. February 2010, 22:10 »
Uiui ich glaube da hat was mit dem Patchen doch nicht so hingehaun wenn ich Bit 11 setze sagt mir Grub folgendes:
  Booting 'os1'

kernel /kernel

Error 10: Unsupported Multiboot features requested

Press any key to continue...
Aber ich verstehe das nicht das Patch-Script ist ohne Probleme durchgelaufen. Auch der Kompiliervorgang von Grub wurde erfolgreich beendet. Woran kann das liegen?

Danke!
7
Lowlevel-Coding / Re: GRUB VESA wie aktivieren?
« am: 15. February 2010, 19:15 »
Hi!

Ich weiß nicht irgendwie bring ich das nicht hin der gepatchte Grub bootet zwar, aber irgendwie schaltet er nicht in den VESA mode. Ich baue den Multibootheader wie folgt zusammen:
.align 4
.int 0x1badb002
.int 0x6
.int -0x1BADB008
.int 0x0
.int 0x0
.int 0x0
.int 0x0
.int 0x0
.int 0x1
.int 640
.int 480
.int 8

aber in meiner MultibootInfo ist alles was mit dem VESA zu tun hat null:
    printf("%x\n", mbInfo->vbe_control_info);
    printf("%x\n", mbInfo->vbe_mode_info);
    printf("%x\n", mbInfo->vbe_mode);
    printf("%x\n", mbInfo->vbe_interface_seg);
    printf("%x\n", mbInfo->vbe_interface_off);
    printf("%x\n", mbInfo->vbe_interface_len);
Danke
8
Lowlevel-Coding / GRUB VESA wie aktivieren?
« am: 15. February 2010, 12:26 »
Hi Lowlevel-Community!

Ich wollte mal mit VESA bisschen herumexperimentieren ich habe den Grub gepatcht und installiert aber wie aktiviere ich VESA nun in meinem Kernel? Ich habe kein vernünftiges Tutorial dazu gefunden vl. könnt ihr mir da ein bisschen weiterhelfen!

Danke!
9
Lowlevel-Coding / Re: Problem mit Multitasking
« am: 05. February 2010, 11:40 »
Ja auf das hätte ich als nächstes getippt ! So genau hab ich nicht geschaut :(
10
Lowlevel-Coding / Re: Problem mit Multitasking
« am: 05. February 2010, 08:22 »
Hi!

Probier mal wenn du static int current_task; am Anfang nicht auf 1 setzt sondern auf 0 was dann Passiert. Werden dann lauter Bs ausgegeben? Wenn ja probiers mal so:


void task_a(void)
{
    int yPos = 0;
    int xPos = 0;

    while (1) {
        if(posX % 2 == 0)
            print_string_at_pos("A", 0x02, xPos, yPos);
xPos++;
    }
}

void task_b(void)
{
   int yPos = 0;
   int xPos = 0;

    while (1) {
        if(posX % 2 == 1)
            print_string_at_pos("B", 0x04, xPos, yPos);
xPos++;
    }
}

Vielleicht liegts daran!
11
Softwareentwicklung / Re: 2 Fragen zu GRUB
« am: 04. February 2010, 19:50 »
Mit readelf deinKernel -l kannst es dir auch ansehen wohin er galaden wird von Grub :-)

mfg
12
Lowlevel-Coding / Re: Problem mit Multitasking
« am: 04. February 2010, 19:45 »
Hi littlefox!

Wenn ich dein Problem hätte würde ich zunächst folgendes probieren:
mal die task_a und task_b Funktion folgendermaßen abändern:
void task_a(void)
{
    int yPos = 0;
    int xPos = 0;

    while (1) {
        print_string_at_pos("A", 0x02, xPos, yPos);
xPos++;
    }
}

void task_b(void)
{
   int yPos = 0;
   int xPos = 0;
 
    while (1) {
        print_string_at_pos("B", 0x04, xPos, yPos);
xPos++;
    }
}

und dann würde ich mir in deiner Methode struct cpu_state* irq_handler(struct cpu_state *r) in dem if: if (r->intr == 0x20) mal etwas ausgeben lassen. So in etwa:
if (r->intr == 0x20) {
        printf("Scheduler Start!\n");
        new_cpu = schedule(r);
        printf("Scheduler Ende!\n");
    }

Dann würd ich mal schauen was passiert vl. Hilft dir das weiter! Wenn der Scheduler RICHTIG aufgerufen wird poste uns doch mal die Funktion print_string_at_pos vl hats da bissi was!

mfg!
13
Lowlevel-Coding / Re: PageFault!
« am: 29. January 2010, 14:54 »
Multitasking funktioniert :-)
14
Lowlevel-Coding / Re: PageFault!
« am: 26. January 2010, 20:44 »

Ich hätte da noch so 2 kleine Einwände erstens der Stack überschreibt die BIOS Data Area


Ah Danke!
An das mit der Bios Data Area habe ich gar nicht gedacht!
Das werde ich berücksichtigen!!!
15
Lowlevel-Coding / Re: PageFault!
« am: 25. January 2010, 14:52 »
Willst du es uns auch verraten? Es könnte dem nächsten helfen.

Ok gerne!

Punkt 1: Der Stack war das Problem!
Jetzt musste ich mal herausfinden WAS genau mit dem Stack nicht stimmte. Jetzt habe ich mir mal die map datei vom Linker erstellen lassen und nachgesehen wo die Adresse des Stacks liegt:
                0x0000000000000000                PROVIDE (__start_bss, .)

bss             0x0000000000000000     0x5000
 bss            0x0000000000000000     0x5000 ./bin/boot.o
                0x0000000000005000                PROVIDE (__stop_bss, .)
Hier sehe ich also dass der Stack an der physischen Adresse 0x5000 Startet ich habe also 20480Byte platz für den Stack (Da dieser ja nach unten wächst). Angelegt wird der Stack ja in der boot.S mit folgendem Code:
.section bss
.space 20480
kernelStack:
bss geht also bei 0x0 an und dann mache ich einen Space von 20480Byte also 0x0000 bis 0x5000 jetzt setze ich im Kernel, im physischen MemoryManagement, die Adressen von 0x0 bis 0x5000 als RESERVIERT (dann kann ich da keinen Speicher mehr anfordern) und schon liegen meine PageTable und das PageDir AB 0x5000 und höher somit überschreibe ich mit dem Stack meine PageDir nicht und somit funktionierts.

Ich hoffe es stimmt so!

lg
16
Lowlevel-Coding / Re: PageFault!
« am: 25. January 2010, 11:44 »
hi ich habs hinbekommen ich weiß jetzt wo es gelegen ist!
DANKE für eure Hilfe!!!
@Programm Noob eine funktionierende Version ist Online und nun schreibe ich einen ELF Loader vl ICQst mich ja mal an: 252745823 :-)
17
Lowlevel-Coding / Re: PageFault!
« am: 24. January 2010, 17:07 »
hi taljeth!

Du hast recht es hat irgendetwas mit dem STACK zu tun!
Ich habe jetzt den Stack einmal ums doppelte größer gemacht und schon bekomme ich den Fehler wieder obwohl ich mein PageDir und meine PageTable verschoben habe! Das verstehe ich aber nicht ganz.

Mein Kernel wird an die Adresse 0x100000 geladen. Mein Stack ist 8192 Bytes groß(habs jetzt wieder zurückgeändert von 16384 auf 8192) und er wird an das Ende des Kernels kopiert:
.section multiboot

.align 4
.int 0x1badb002
.int 0x2
.int -0x1BADB004

.section .text

.extern kernel_init

.global _start
_start:
mov $kernelStack, %esp

push %ebx
call kernel_init

jmp .

.section bbs
.space 8192
kernelStack:

Wenn er nun zu groß werden würde, würde er doch den Kernel überschreiben (da der Stack ja nach unten wächst) und nicht Adressen die VOR(meine PageTable liegt auf 0x3000 und mein PageDirectory auf 0x4000) dem Kernel liegen. Stimmt das oder liege ich da falsch?

hier noch mein linkerfile:
ENTRY(_start)

SECTIONS
{
    . = 0x100000;

    .text : {
        *(multiboot)
        *(.text)
    }
    .data ALIGN(4096) : {
        *(.data)
    }
    .rodata ALIGN(4096) : {
        *(.rodata)
    }
    .bss ALIGN(4096) : {
        *(.bss)
    }
kernelEnd = .;
}

18
Lowlevel-Coding / Re: PageFault!
« am: 24. January 2010, 16:07 »
Hmm.
Ich hab eigentlich sonst nirgends direkten Zugriff auf die Adressen das lass ich zz noch alles den Compiler machen den den Floppy buffer lege ich zb so an:
static const char floppyMem[floppyBufLen] __attribute__((aligned(0x8000)));
die sonstigen speicherbereiche auch alle ueber arrays. NUR die PageTables und das PageDirectory lege ich durch direkten zugriff auf den Speicher an.
19
Lowlevel-Coding / Re: PageFault!
« am: 24. January 2010, 14:59 »
Danke taljeth für deine schnellen Antworten!

Ich habe deinen RAT befolgt und habe mir mit dem BOCHS Debugger mal den Speicher genauer angesehen.

Dabei habe ich herausgefunden, dass das Paging wunderbar funktioniert, wenn ich die Adressen von 0x0000 bis 0x2FFF auf reserviert setze.(Dh. ich kann mein PageDirectory erst auf 0x3000 setzen und die erste PageTable auf 0x4000) Ich habe keine Ahnung warum das so ist kann das mit GRUB zusammenhängen?

Außerdem hab ich noch eine Frage zu den bytes die mir BOCHS anzeigt:
zum Beispiel das PageDirectory an der stelle 0x3000:
Zitat von: grub
Addr   |  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
-------+-------------------------------------------------
0x3000 | 27 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x3010 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x3020 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...

Was bedeutet da das Byte 0x27?

Danke!
20
Lowlevel-Coding / Re: PageFault!
« am: 24. January 2010, 11:38 »
Ja stimmt hab ich vergessen zu löschen!
int pageDirIndex = pageFrames % 1024;verwende ich gar nicht!
Seiten: [1] 2

Einloggen