Hi
Ich beschäftige mich seit einigen Tagen mit der API meines Kernels. Leider bekomme ich mit jeder Lösung 1000 neue Probleme und alles ist irgendwie extrem aufwändig.
Meine bisherige Lösung, bzw. Lösungsansatz
Ein Prozess ruft eine C-Funktion auf - bsp.: APITEST("hello world");
APITEST selber ist aber in assembly realisiert - in APITEST werden nun die Argumente, welche sich ja auf dem Stack befinden, wiederum an eine neue Stackadresse kopiert (Als Argument der 0xFF-ISR), um dann int 0xFF aufzurufen.
Die "0xFF-ISR" erwartet die Argumente auf dem Stack, und ist ebenfalls in asm geschrieben, nur die Funktions-Nummer kommt per eax
Von dieser ISR geht es nun weiter: Die Argumente werden wieder an eine neue Position im Stack kopiert, und dann die eax - entsprechende C-Funktion aufgerufen.
kurz: C -----> ASM --int0xFF--> ASM -----> C
Dabei gibt es nun ein Probleme - der String "hello world" befindet sich im virtuellen Speicher des Prozesses, die Funktion zum ausgeben des Strings benötigt aber den virtuellen Speicher des Kernels (gut, das geht vielleicht auch ohne Kernelspeicher, aber spätestens bei Dateiarbeiten muss ich mit dem Speicher des Kernels arbeiten)
Lösung: ich wechsle auf das PD des Kernels und mappe die Page, auf der sich der String befindet.
Problem: Was ist, wenn mehrere Prozesse das gleiche vor haben - ich kann also nicht die Page an der selben virtuellen Adresse mappen, wie sie im Prozess liegt - dadurch muss ich also alle Pointer die ich bekomme umrechnen.
Meine Frage nun:
Wie realisiere ich eine API am besten, die ich sowohl von asm, als auch C aus gut ansprechen kann, und wie regle ich das mit den Speicherräumen?