Autor Thema: Paging und Multitasking  (Gelesen 9530 mal)

BurningWave

  • Beiträge: 14
    • Profil anzeigen
    • JB Technologies
Gespeichert
« Antwort #20 am: 17. March 2012, 17:21 »
Das zweite Problem mit den Page Faults konnte ich endlich lösen :)

Doch zum ersten Problem: Es kann ja keine Lösung sein, den kompletten Kernel für User-Tasks writeable zu mappen (in diesem Fall wäre Paging komplett sinnlos). Wenn ich nun nur bestimmte Stellen für User-Tasks sichtbar machen möchte, ergibt sich das Problem, wie ich den Adressraum der Funktion des jeweiligen Tasks bekomme. Ein Funktionszeiger auf die Funktion sagt mir, wo diese anfängt, aber wie bekomme ich deren Länge?

Ich habe noch eine Frage: Ein return innerhalb eines Tasks lässt den Instruction Pointer doch irgendwo ins Nirvana springen. Wie kann man dieses Problem handhaben?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 17. March 2012, 17:30 »
Irgendwo sitzt bei dir noch ein großes Missverständnis.

Ring-3-Code braucht gar keinen Zugriff auf den Kernel, Ring-0-Code braucht ihn. Du hast Ring-0-Code, der mit dem PD des Tasks läuft, also musst du in diesem PD alle Pages gemappt haben, die dieser Ring-0-Code benutzt. Du musst das User-Bit für diese Pages aber nicht gesetzt haben, weil es ja schließlich Ring-0-Code ist, der auch auf Kernelpages zugreifen darf.

Ein Task sollte sich nicht durch return, sondern mit einem Syscall beenden. Wenn es das nicht tut, gibt es halt eine Exception und der Kernel entsorgt den Task...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

BurningWave

  • Beiträge: 14
    • Profil anzeigen
    • JB Technologies
Gespeichert
« Antwort #22 am: 17. March 2012, 17:37 »
Ring-3-Code braucht gar keinen Zugriff auf den Kernel, Ring-0-Code braucht ihn. Du hast Ring-0-Code, der mit dem PD des Tasks läuft, also musst du in diesem PD alle Pages gemappt haben, die dieser Ring-0-Code benutzt. Du musst das User-Bit für diese Pages aber nicht gesetzt haben, weil es ja schließlich Ring-0-Code ist, der auch auf Kernelpages zugreifen darf.

Genau das ist das Problem. Im PD des Tasks ist der komplette Kernel ohne User-Flag gemappt. Jetzt brauche ich den Speicherbereich der Task-Funktion, um in diesem Bereich das User-Bit zu setzen.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 17. March 2012, 17:52 »
Ach so, du hast den Userspace-Task in den Kernel einkompiliert? Dann würde ich erstmal das ändern.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

BurningWave

  • Beiträge: 14
    • Profil anzeigen
    • JB Technologies
Gespeichert
« Antwort #24 am: 18. March 2012, 16:21 »
Es funktioniert :) :)

Ich musste nur noch das PD des Tasks mit dem User-Flag und writeable mappen, sonst funktioniert es nicht. Bis man darauf kommt...
Auf jeden Fall vielen Dank für eure Hilfe.

BurningWave

  • Beiträge: 14
    • Profil anzeigen
    • JB Technologies
Gespeichert
« Antwort #25 am: 13. April 2012, 18:17 »
So mein kleines OS ist nach langer Arbeit endlich in einen ansehnlichen Zustand gekommen:

http://www.jbtechnologies.de/projects/programms/badmem-os.html

Danke nochmal für eure Hilfe.

 

Einloggen