user programm beenden
-
hi,
ich lade ein user-programm in die adresse 0x4000. irgendwann will ich das programm aber auch beenden und die adresse 0x4000 freigeben
wie macht man das eigentlich?
mov ah, 4ch int 21h kann ich ja nicht benutzen, weil's ja fuer dos ist!
-
Am einfachsten waere es, wenn du entweder dem Programm ne Return-Adresse auf den Stack legst oder aber eben einen eigenen Interrupt definierst, der dann wieder in deinen Kernel springt. Freigeben musst du nicht wirklich was, es wird halt einfach das alte Programm an 0x4000 ueberschrieben, wenn du ein neues laedst.
Ich gehe hier natuerlich vom Real Mode aus. Wenn du im Protected Mode arbeitest und da auch mit Ring0/3-Unterscheidung, dann kommst du um einen Interrupt oder Syscall-Mechanismus nicht herum, da sonst kein Wechsel in den privilegierten Modus erfolgen kann. Aber auch hier koenntest du im User-Adress-Bereich irgendeine Page mit dem Ruecksprung-Syscall einblenden und dann die Adresse fuer die Syscall-Instruktion auf den Stack legen, bevor das Programm gestartet wird, sodass man auch hier einfach mit ret beenden koennte.
-
na, da kann ich ja auch gleich am ende des programmes via jmp 0x1000:0x0000 zurueckgehen
-
Das ist weniger elegant als die Stack-Lösung, weil die main()-Funktion des Programms bei der Stack-Lösung eine ganz normale Fkt. sein kann, die am Ende halt 'ret' macht. Und es ist weniger elegant als die Interrupt-Lösung, weil es nur in Ring 0 funktioniert - echte Userprogramme laufen in Ring 3.
-
Du kannst Dir dies in PrettyOS anschauen.