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

Seiten: 1 ... 3 4 [5] 6
81
OS-Design / Re: FreeBasic: Software Multitasking
« am: 15. May 2009, 07:44 »
Hm, ich hab das Multitasking-Zeug mal neu geschrieben, nach einem Tut das ich auf google code gefunden habe. Der Kernel sorgt dafür, das zwei Tasks vorbereitet werden, erlaubt IRQs und geht in eine Endlosschleife.

Das Problem ist: Sobald der erste Task aktiviert wird, kriege ich einen GPF.

Screenshot: http://darkinsanity.freehoster.ch/FROST_V0.2.0a.PNG
Den Code dazu gibts hier: http://darkinsanity.freehoster.ch/FROST_V0.2.0a_unstable.zip

Ein paar Auszüge:

type TaskType
    ID as USHORT                                 '// the ID of the task
    stack as UINTEGER                            '// the stack of the task
    eip as UINTEGER
    status as BYTE                               '// the status of the task (blocked, ready, active...)
end type

dim shared Tasks(100) as TaskType

function Multitasking_scheduler (stack as UINTEGER) as UINTEGER
    Tasks(currentPID).stack = stack

    currentPID += 1
    if currentPID > AllTasks then currentPID = 1

    return Tasks(currentPID).stack
end function



sub Multitasking_Switch naked
    dim tempstack as UINTEGER
    asm
        pusha
        push ds
        push es
        push fs
        push gs
       
        mov eax, &h10
        mov ds, eax
        mov es, eax
        mov fs, eax
        mov gs, eax
       
        mov eax, esp
        mov [tempstack], eax
    end asm
   
    tempstack = Multitasking_scheduler(tempstack)
   
    asm
        mov eax, [tempstack]
        mov esp, eax
        mov al, &h20
        out &h20, al
       
        pop gs
        pop fs
        pop es
        pop ds
        popa
       
        iret
    end asm
end sub

sub Task_Create (ID as USHORT, address as any ptr)
    if Tasks(ID).status <> TASK_EMPTY then return  '// place not free
   
    dim stack as UINTEGER
    dim kernelstack as UINTEGER
   
    asm cli                                        '// we donŽt want to be interrupted
   
    stack = cast(UINTEGER, malloc(4096) + 4096)    '// allocate space for 4kb stack
    print "Allocated Stack: ";
    print stack
   
    asm
        mov eax, esp                               '// get the stackpointer in eax
        mov [kernelstack], eax                     '// save the kernelstack-pointer
       
        mov eax, [stack]                           '// load the new stack into eax
        mov esp, eax                               '// get the new stack to esp
       
        mov eax, &h202
        push eax
        mov eax, &h08
        push eax
        push [address]
       
        mov eax, &h0
        push eax
        push eax
        push eax
        push eax
        push eax
        push eax
        push eax
        push eax
       
        mov eax, &h10
        push eax
        push eax
        push eax
        push eax
    end asm
   
    Tasks(ID).status = TASK_READY
    Tasks(ID).stack = stack
    Tasks(ID).eip = cast(UINTEGER, address)
   
    AllTasks += 1
   
    asm sti
end sub
82
OS-Design / FreeBasic: Software Multitasking
« am: 14. May 2009, 18:27 »
@ehenkes: Hab deine Tuts gelesen. Baust du das mit dem Multitasking auch ein?

Weil, naja, also irgendwie verstehe ich das alles noch nicht.
Ich habe auch das Tutorial von James Molloy gelesen, aber ich habe da noch ein paar Fragen:
Wie funktioniert das genau, das er den richtigen Wert in eip hat?
Warum verlässt er die Routine mit "jmp *%%ecx" ? Müsste das nicht den Stack zerstören? Warum springt er nicht mir IRET zurück?
Wo sichert er die ganzen Register?
Warum überprüft er, ob in eip 0x12345 steht?

Bei meinem Kernel gibt es da auch noch ein Problem. Der Kernel läuft nach dem laden der Register des zweiten Tasks nicht mehr weiter. Falls jemand sich das mal anschauen will: http://rapidshare.com/files/232940400/FROST_V0.2.0a_unstable.zip
Sorry wenn ich dämliche Fehler gemacht habe, das ist mein erster Versuch. Ich hab noch kein TSS drin, da ich das ganze momentan sowieso nur innerhalb des Kernels teste.

Ehrlich gesagt hab ich so meine Probleme damit, fertigen Code zu verstehen. Und, naja, die OS-Projekte die ich mir bisher angesehen habe, sind nicht gerade ausführlich kommentiert. Kurz: Ich verstehe bei pedigree & co überhaupt nichts. Und das ganze ASM & C gemischte bringt mich dann komplett durcheinander.

Wenn Software-Multitasking bei meinem Kernel läuft, schreib ich ein Tutorial, mit dem jeder das zum laufen kriegt ;)
83
OS-Design / Re: Software Multitasking
« am: 09. May 2009, 19:16 »
ok, und ab welcher Version nutzt Linux Software Multitasking?
84
OS-Design / Re: Software Multitasking
« am: 08. May 2009, 14:04 »
Mal wieder ne Frage von mir:
Ich les mir gerade den source von Linux 0.01 durch. Meine Frage: Nutzt die Version des Kernels Software oder Hardware Multitasking?
85
Offtopic / Re: Hosen runter! Zeigt eure OS ;)
« am: 30. March 2009, 18:45 »
sieht vielversprechend aus :)
btw hat hier jemand einen funktionierenden floppy-treiber-code?
86
OS-Design / Re: Software Multitasking
« am: 23. March 2009, 16:17 »
danke  :-)
hm, C <ironie>meine Lieblingssprache</ironie>
ich glaub das ich das irgendwie hinkrieg ;)
87
Offtopic / Re: Hosen runter! Zeigt eure OS ;)
« am: 23. March 2009, 16:09 »
ja :-)
http://sourceforge.net/projects/frostkernel
Aber wie gesagt, ich bin noch nicht sehr weit.
88
Offtopic / Re: Hosen runter! Zeigt eure OS ;)
« am: 20. March 2009, 17:04 »
ihr seid alle schon so weit, während ich noch nichtmal multitasking am laufen hab  :cry:

aber trotzdem mal ein screenshot von meinem Microkernel (FROST V0.1.7a). Als Bootloader benutz ich GRUB 0.97.



Das mit "press any key" ist momentan nur ein Test (für die IRQ´s). Das besondere an meinem Kernel ist, das er nur in FreeBASIC geschrieben ist. (na gut, ich benutze den inline assembler ;) )
89
OS-Design / Re: Software Multitasking
« am: 20. March 2009, 12:43 »
schonmal danke für die Antworten, aber ich hab noch en paar Fragen:
Was mache ich wenn der Task das erste Mal gestartet werden soll?
Könnt ihr mir evtl. sagen wo ich Beispielcode finde?
90
OS-Design / Software Multitasking
« am: 19. March 2009, 12:15 »
Hi,
hab gestern versucht (Hardware-)Multitasking in meinen Kernel einzubauen, was in einem GPF geendet hat. Dann hab ich gelesen, das im Long-Mode Hardware-Multitasking sowieso nicht mehr geht.
Mein Problem ist, das ich KEINE Ahnung hab, wie man software-multitasking implementiert.
Software-Multitasking funktioniert (wenn ich das richtig verstanden habe) so:
Task1 wird von Timer unterbrochen
Kernel pusht Daten (Register usw.) auf den Stack von Task1
Kernel läd Stack von Task2
Kernel holt Daten vom Stack

So, wie springt jetzt aber der Kernel zurück zum Task?
Habt ihr da Tutorials, code oder so was für mich?
91
Lowlevel-Coding / Re: Exception wird nicht abgefangen
« am: 17. February 2009, 12:42 »
genau das wars!
Vielen, vielen Dank.

Ich musste nur nach den types ein "FIELD=1" einfügen, und schon hats geklappt.
Jetzt muss ich nur noch die interrupt-routinen in eine externe Datei auslagern.
92
Lowlevel-Coding / Re: Exception wird nicht abgefangen
« am: 12. February 2009, 12:36 »
so, hab meinen Kernel überarbeitet.
Er nutzt jetzt Interrupt 0x30. GDT & IDT werden am Anfang mit memset auf 0 gesetzt, der 0. Eintrag (mit nullen gefüllt) in der GDT wird beim laden berücksichtigt.
Leider geht der ganze Spaß immer noch nicht.
Kernel: http://darkinsanity.freehoster.ch/FROST_debug.zip
Logfile: http://darkinsanity.freehoster.ch/bochs_log.7z

PS: was muss ich denn für den GNU-assembler schreiben wenn ich die Segmentregister neu laden will?
93
Lowlevel-Coding / Re: Exception wird nicht abgefangen
« am: 06. February 2009, 12:47 »
Der erste Eintrag in der IDT ist ja 0, und bei der GDT wird von 1 gezählt, also sollte das doch stimmen, oder?

Die IDT wird so geladen (ich hab das auch so in nem C-Beispiel gesehn):
sub LoadIDT (size as USHORT, BaseAddr as UINTEGER)
    dim idt as IDTstructure
   
    idt.BaseAddr = BaseAddr
    idt.size = size
   
    ASM
       lidt [idt]
    END ASM
end sub

Ich hab mitlerweile eine neuere Version gebastelt (liegt leider daheim auf meinem PC, habs vergessen aufn USB-Stick zu ziehn und kanns deswegen nich hochladen) die die GDT so lädt wie auch die IDT.
Kann es vielleicht sein das ich die eckigen Klammern weglassen muss?
94
Lowlevel-Coding / Re: Exception wird nicht abgefangen
« am: 05. February 2009, 11:58 »
ok, erstmal vielen dank für die Antworten.
das mit memset werd ich mal einbauen.
IDTinit wird in der FROSTmain.bas aufgerufen (direkt nachdem der PIC umprogrammiert wurde):
print "Initializing IDT..."
IDTinit                                                 '// Loading a ground-IDT

gibt es einen Weg wie ich überprüfen kann ob die GDT korrekt ist? Hab nämlich alle Angaben usw. beim generieren des IDT-Eintrags überprüft und die scheinen gültig zu sein, daher vermute ich das die GDT der Übeltäter ist.
95
Lowlevel-Coding / Re: Exception wird nicht abgefangen
« am: 04. February 2009, 12:35 »
wie komm ich denn dann aus dem monitor wieder raus?
hier ist die komplette logfile von Bochs: http://darkinsanity.freehoster.ch/bochs.7z

der kritische Teil scheint der zu sein:
00377691208d[CPU0 ] interrupt(): vector = 0, INT = 1, EXT = 0
00377691208d[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x00)
00377691208d[CPU0 ] exception(0x0d): error_code=0002
00377691208d[CPU0 ] interrupt(): vector = 13, INT = 0, EXT = 1
00377691208d[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
00377691208d[CPU0 ] exception(0x0d): error_code=006a
00377691208d[CPU0 ] exception(0x08): error_code=0000
00377691208d[CPU0 ] interrupt(): vector = 8, INT = 0, EXT = 1
00377691208d[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
00377691208d[CPU0 ] exception(0x0d): error_code=0042
00377691208i[CPU0 ] CPU is in protected mode (active)
00377691208i[CPU0 ] CS.d_b = 32 bit
00377691208i[CPU0 ] SS.d_b = 32 bit
00377691208i[CPU0 ] EFER   = 0x00000000
00377691208i[CPU0 ] | RAX=0000000000000960  RBX=000000000002c3ac
00377691208i[CPU0 ] | RCX=00000000000000a0  RDX=0000000000000000
00377691208i[CPU0 ] | RSP=0000000000067e9c  RBP=0000000000067ecc
00377691208i[CPU0 ] | RSI=000000000002c9e4  RDI=000000000002c9e9
00377691208i[CPU0 ] |  R8=0000000000000000   R9=0000000000000000
00377691208i[CPU0 ] | R10=0000000000000000  R11=0000000000000000
00377691208i[CPU0 ] | R12=0000000000000000  R13=0000000000000000
00377691208i[CPU0 ] | R14=0000000000000000  R15=0000000000000000
00377691208i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af PF cf
00377691208i[CPU0 ] | SEG selector     base    limit G D
00377691208i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00377691208i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
00377691208i[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00377691208i[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00377691208i[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 000fffff 1 1
00377691208i[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00377691208i[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00377691208i[CPU0 ] |  MSR_FS_BASE:0000000000000000
00377691208i[CPU0 ] |  MSR_GS_BASE:0000000000000000
00377691208i[CPU0 ] | RIP=00000000001014c1 (00000000001014c1)
00377691208i[CPU0 ] | CR0=0x60000011 CR1=0x0 CR2=0x0000000000000000
00377691208i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00377691208i[CPU0 ] >> int 0x00 : CD00
00377691208d[CTRL ] searching for component 'cpu' in list 'bochs'
00377691208d[CTRL ] searching for component 'reset_on_triple_fault' in list 'cpu'
00377691208e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00377691208i[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called
00377691208d[SYS  ] A20: set() = 1
00377691208i[CPU0 ] cpu software reset
96
Lowlevel-Coding / Re: Exception wird nicht abgefangen
« am: 29. January 2009, 18:52 »
gut zu wissen das man das loglevel höher drehen kann  :-)
Ich benutze erst seit 2 Tagen Bochs, vorher hatte ich qemu, aber das will unter Windows (was leider mein Haupt-OS ist) auf ein Linux Verzeichnis zugreifen wenn es ein logfile schreiben soll.
Das es auch die GDT sein könnte, daran hab ich noch gar nicht gedacht...
Ich werd heute Abend mal ein bisschen an Bochs rumprobieren.
97
Lowlevel-Coding / Exception wird nicht abgefangen
« am: 29. January 2009, 12:33 »
Hi,
ich schreibe meinen Kernel in FreeBASIC. Jetzt bin ich an der Stelle, an der es sinnvoll wird interrupts nutzen zu können. Daher hab ich mir Routinen geschrieben, die eine IDT erstellen und laden. Testen wollte ich das ganze folgendermaßen:
Ich habe eine funktion als interrupt 0 in die IDT eingetragen, und der Kernel ruft danach (natürlich nachdem die IDT geladen wurde) int 0 auf. Er sollte dann eigentlich einen Text ausgeben, aber alles was er tut, ist abstürzen.
Ich hab mehrmals rumprobiert, aber ich krieg es einfach nicht hin. Ich bin kurz vorm verzweifeln.
Obwohl FreeBASIC eine ungewöhnliche Sprache für einen Kernel ist, hoffe ich das ihr mir helfen könnt.

Die letzte funktionierende Version meines Kernels gibt es auf http://frostkernel.sourceforge.net

Die Version, die Proleme macht, gibts hier (source+image): http://darkinsanity.freehoster.ch/FROST_debug.zip

Die Logfile von Bochs ist hier: http://darkinsanity.freehoster.ch/bochs.log
98
OS-Design / Re: QBasic
« am: 16. August 2008, 17:33 »
hilfe zu FreeBASIC findet man hier: http://forum.qbasic.at
aber ob du dort auch hilfe zum thema os-dev bekommst, weiß ich nicht, da sich nur wenige fb-Programmierer damit beschäftigen.
99
Offtopic / Re: OS mit GRUB auf CD
« am: 15. July 2008, 18:13 »
ok danke. im grub-handbuch hab ich auch was gefunden wie mans macht hat auch funtioniert.
100
Offtopic / Re: Aktivierungsmail
« am: 19. June 2008, 11:46 »
habs mehrmals probiert. bei GMX gings nicht, aber bei google-mail gings
Seiten: 1 ... 3 4 [5] 6

Einloggen