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

Seiten: [1]
1
OS-Design / Ordentliche ms genaue Sleep Funktion (Delay)
« am: 13. March 2014, 19:23 »
Hallo liebe Community,

ich habe mir schon einige Beispiele an Sleep Funktionen angeschaut und einiges getestet.
Von asm("nop"); Schleifen bis hin zu komplizierten Timer.

Bisher an mich nichts richtig zufrieden gestellt, aber ich bin im Moment an diesem Modell hängen geblieben:
void sleep(uint32_t ms)
{
    SLEEP_ACTIV_STATE = 1;
    uint64_t cur = tick_counter;
while((cur+ms) >= tick_counter);
SLEEP_ACTIV_STATE = 0;
return;
}

Am Timer 1, der eigentlich das Multitasking steuert steht folgendes:
if (cpu->intr == 0x20) {  //TIMER
        TIMER_ITR();
new_cpu = schedule(cpu);
tss[1] = (uint32_t) (new_cpu + 1);
new_cpu = cpu; 
}

TIMER_ITR():
void TIMER_ITR(void)
{
tick_counter += 10;
}

Wie man sieht ist diese Sleep-Funktion nur 10ms "genau". Sprich der Timer wird jede 10ms ausgelöst. (100Hz) Ich benötige allerdings für das Multitasking eine niedrige Frequenz, vielleicht 10Hz, also jede 100ms. Dann würde meine Sleepfunktion allerdings um 100ms ungenau gehen.

Das Ziel ist es aber meine Task mit 10Hz zu wechseln und meine Sleepfunktion auch nur 1ms warten zu lassen.
Ist den mein jetziges Model dafür überhaupt geeignet? Sollte ich etwas ganz anderes Verfolgen?

Wie habt ihr dieses Funktion gelöst?

Seltsam ist bei meiner Varriante von Sleep-Funktion auch, dass vor dem Multitasking (aber schon aktivem Timer IRQ) meine Sleep-Funktion die Zeit abwartet und es danach weiter im Kernel geht. Sobald das Multitasking aktiv ist, sprich auch Task laufen & ich dann z.B. mein Floppy-Laufwerk ansteuer und die Sleepfunktion aufgerufen wird kommt er nicht mehr aus der while Schleife herraus.

Ich freue mich auf eure Idee, Vorschläge und Anregungen...
L.G.
2
Lowlevel-Coding / Bandlaufwerk (Floppy-Streamer)
« am: 14. January 2014, 20:45 »
Hallo,

ich möchte gerne Daten für ein altes Bandlaufwerk auslesen und natürlich das Bandlaufwerk danach ansteuern. Die Frage ist nur wie?

Ich finde sogut wie keine Dokumentation dafür! Die alten Bandlaufwerke nennen sich ja auch Floppy-Streamer, somit vermute ich, dass ich es irgendwie über den FDC auslesen kann bzw. steuern kann. Hat jemand Daten dazu?

L.G.
3
OS-Design / Qemu = ok, echt Hardware = Auaa... ;(
« am: 12. January 2014, 17:30 »
Hallo,

nachdem ich einige Treiber programmiert habe und mich aktuell mit dem Thema Paging rumschlage wirft mich der Kernel beim Betrieb auf echter Hardware wieder um einiges zurück.

Mein Kernel hat den Grundaufbau des Tutorial stark beibehalten, jedefalls wenn es um Sachen wie GTD, IVT, Task & Schudule geht.

Und hier liegt auch das Problem! Mein Kernel läuft wunderbar auf Qemu. Manschmal bleibt er beim PMM stehen aber liegt wohl am Qemu, denn bei neustart läuft er weiter. Auf ECHTER Hardware (getestet mit 3 underschiedlichen PC's) passiert folgendes:
- Bootloader wird geladen (GRUB4DOS)
- Grub läd den Kernel
- Kernel läuft
- Erster Task wird gestartet => CPU restet!

=> Vermutlich Triple Fault

Jetzt habe ich alle möglich "hlt" gesetzt, mit print Fehler ausgegeben,etc.
Am Anfang dachte ich, es hat etwas mit der IVT zutun und dem Hardware-Interrupt Timer. Dann vermutete ich den Fehler in den Software Interrupts, da ohne Task der Kernel weiterläuft und testweise mir bei jedem Timer-Interrupt "TIMER!" auf dem Bildschirm schreibt!

Also auszuschließen ist:
- Debug mit Exeption, da sofort CPU-Reset
- Fehler in der IVT
- Fehlerfunktion Software-Interrupts
- fehlerhafte Behandlung von Hardware-Interrupts
- Da bleibt nur noch der Schedule!

Und siehe da der Kernel läuft ohne Schedule (& ohne Task!) ganz normal. Da der orginal Schedule des Tutorial nicht viele Parameter verändern und auch alles korrekt zu sein scheit, liegt es vielleicht an der Datei int_stub.S die in ASM geschrieben ist.
Allerdings konnte ich dort kein Fehler feststellen und er bricht auch nicht ab. ERST wenn der Zustand wiederhergestellt wird, beim Befehl "iret" <<<=== Es funktioniert aber ohne Task (&Schedule)!

Meine letzte Vermutung ist, dass im Befehl init_gdt() irgendwas schief läuft & deswegen für Task irgendwas an Segmenten falsch gesetzt ist. Durch die GDT steig ich allerdings nicht wirklich durch. Und meine ist auch noch orginal getreu wie im Tutorial und läuft unter Qemu ja auch super, aber unter echter Hardware leider nicht!

Hat jemand eine Idee wie das Problem zu lösen oder zumindest Erklärbar wäre?
4
OS-Design / Paging - Segen oder Fluch?
« am: 04. January 2014, 23:56 »
Hallo alle zusammen,

also mein größtes Problem liegt im Moment wieder am Thema Paging. Ich bin stark dem Tutorial nach gegang. Als das Thema Paging kam habe ich es immer wieder aufgeschoben, da ich es einfach nicht richtig verstehe. Ich habe also die ersten 4MB mit UserFlag gesetzt und es ruhen laßen.
Mittlerweile habe ich meinen KB-, RS232- Treiber fertig und meine SYSCALLS ausgebaut und arbeit mit Programme als Module. Es funktioniert mit einem laufendem Programm auch erstmal, mit mehren wird es problematisch.

Nun möchte ich meinen Floppy Treiber schreiben, dafür benötige ich DMA und ein funktionierendes Paging. Da ich aber mit den Ding gar net klar komme hier ein paar Verstädnisfrage sowie Fragen zum Code:

- Was genau ist ein Page Directory und was eine Page Table ?

- Vor lauter Poiter, was macht vmm_create_context () genau?

- Muss ich nach erstmaligen mappen den KernelBereich später wieder mappen?

- Was müsste vmm_allco () machen? Details?

- In die Struktur task füge ich context hin zu, führe ich nun auch nach interupt-wechsel context nach c3 (wie im Tut. Erklärt) bleibt der Kernel oder das Programm stehen. Es passiert einfach nichts mehr. Wieso?

- Hat jemand vll. ein Blockbild zum Paging um es sich besser vorstellen zu können?

- Braucht jeder Task sein eigenes Paging?

- Brauch ich wirklich Paping oder kann man die Speicherverwaltung auch einfach gestalten?

Ich hoffe ihr könnt mir in einigen Punkten weiterhelfen. Ich dreh sonst mit Paging durch, denn ich komm einfach nicht dazu jedem Task seinen eigenen Speicher zu geben.
Seiten: [1]

Einloggen