Ok, irgendwie wollte das einfach nicht klappen, und ich hab (ähnlich wie in der Tutorial-Reihe) jetzt einfach mal nur eine ELF-Datei geparst, die halt direkt in den Speicher kommt. So kann das natürlich nicht bleiben, aber ich habe mich diesmal dafür entschieden, zu versuchen, in den Kontext des zu startenden Programmes zu wechseln.
Was müsste ich denn alles beachten, wenn ich das so mache? Ich muss vermutlich erstmal den Kernel mappen, sonst wird das ganze in einem Desaster enden. Müssen seine Pages da beschreibbar sein? Und wenn ich dann auch das multiboot-modul mappe, wie kann ich sicher sein, dass es da nicht sich selbst in die Quere kommt, wenn es irgendwo da liegt, wo ein Teil von ihm hinkopiert werden soll?
Wie lösen das eigentlich andere OS, z.B. tyndur? Irgendwie müssen die ja auch ihren init-Prozess starten.
/edit: Ich hatte gerade eine Idee, wie ich das kopieren in einen anderen Kontext besser und schneller machen könnte:
sub copy_to_context (page_directory as uinteger ptr, p_start as uinteger, v_dest as uinteger, size as uinteger)
dim bytes_left as uinteger = size
dim size_for_this_page as uinteger
dim p_addr as uinteger = p_start
dim p_v_addr as uinteger
dim v_addr as uinteger = v_dest
while (bytes_left > 0)
p_v_addr = get_p_addr(page_directory, v_addr, 1)
size_for_this_page = ((v_addr+4096) and &hFFF) - v_addr
memcpy(p_v_addr, p_addr, size_for_this_page)
bytes_left -= size_for_this_page
p_addr += size_for_this_page
v_addr += size_for_this_page
wend
end sub
Anstatt jetzt immer zu prüfen, ob ich eine Page-Grenze überschreite, rechne ich jetzt aus, wieviele Bytes es bis zur Page-Grenze sind und lasse meine memcpy-funktion die alle in einem Rutsch kopieren, dann gehts mit der nächsten Page weiter usw.
/edit2:
Noch eine kleine Frage zum Paging: Ich muss ja in jedem Kontext den Kernel (int-handler usw.) gemappt haben. logischerweise schreibgeschützt, damit mir kein Task da reinpfuscht. Wenn jetzt ein Interrupt aufgerufen wird, sollte ich dann gleich in den Kontext des kernels wechseln, damit ich dann auch auf Kernel-spezifische Dinge schreibend zugreifen kann?