Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: stafe am 06. July 2006, 11:14
-
Hallo,
ich habe da folgendes Problem bei der Parameterübergabe vom Programm zum Kernel ...
Ich habe die Parameterübergabe in meinem OS über Interrupts realisiert ... das funzte bisher ganz gut wenn ich Zahlenwerte übergab
Bsp.: Programm
int main( void )
{
unsigned int zahl1 = 100;
unsigned int zahl2 = 200;
asm("movl %0, %%ebx" :: "r" (zahl1)); // Übergabeparameter
asm("movl %0, %%ecx" :: "r" (zahl2)); // Übergabeparameter
asm("movl $0x0001, %eax"); // Funktionsnummer
asm("int $0x30"); // Systeminterrupt
return 0;
}
Hier wurden die Werte fehlerfrei übergeben und ich konnte diese im Kernel weiterverarbeiten ...
Wenn ich aber jetzt beispielsweise einen String übergeben möchte funktioniert das nicht ... hier wieder ein Beispiel wie ich es realisiert hätte:
int main( void )
{
unsigned char text[] = "Test Test Test";
asm("movl %0, %%ebx" :: "r" (text)); // Übergabeparameter
asm("movl $0x0002, %eax"); // Funktionsnummer ( 2 - Textausgabe )
asm("int $0x30"); // Systeminterrupt
return 0;
}
Wenn ich hier im Kernel das EBX - Register prüfe steht dort "nichts" ...
Ich habe schon alles versucht, über den Stack,... doch nichts hat bisher funktioniert ... kann mir vieleicht jemand von euch weiterhelfen
-
Was bedeutet denn "nichts"? NULL, falsche Addresse? Hast du auch immer brav mit unsigned gearbeitet? ;)
Ist deine Architektur flach, d.h. ist Addresse XYZ für Kernel und Applikation die selbe Speicherzelle?
-
Es wird die falsche Adresse übergeben ... ja hab immer mit unsigned gearbeitet ... Nein die Adresse ist im KernelSpace und UserSpace unterschiedlich ...
-
könnte es nicht sein, das des an den relocations liegt?
-
__asm__ __volatile__("int $0x30"::"a"(0x02), "b"(text));
Ich würd volatile benutzen und desweiteren die input/ouput register liste, da gcc dir afaik nicht garantiert, dass zwischendurch die Register nicht einfach so geändert werden ;) Ansonsten relocations...
-
Jetzt hätte ich noch ne frage ... es gibt ja einen Kernel Stack und einen User Stack oder ?? Wenn ich im Userprogramm etwas auf den Stack pushe wird das dann automatisch in den User Stack geschrieben ? Oder muss ich da zuerst einen eigenen Userstack definieren ??
Ich habe vorher nocheinmal versucht Parameter zu übergeben und dabei bemerkt, dass in dem Register (in dem ich die Adresse meines Strings geschrieben habe) der aktuelle Stackpointer steht ... Das versteh ich nicht wieso steht in EBX plötzlich der aktuelle wert von ESP ??