Autor Thema: Kommunikation zwischen Kernel und Programm  (Gelesen 5978 mal)

stafe

  • Beiträge: 35
    • Profil anzeigen
    • http://www.staticos.at.tf
Gespeichert
« 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
mfG Stafe

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 06. July 2006, 16:06 »
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?
*post*

stafe

  • Beiträge: 35
    • Profil anzeigen
    • http://www.staticos.at.tf
Gespeichert
« Antwort #2 am: 06. July 2006, 16:25 »
Es wird die falsche Adresse übergeben ... ja hab immer mit unsigned gearbeitet ...  Nein die Adresse ist im KernelSpace und UserSpace unterschiedlich ...
mfG Stafe

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #3 am: 06. July 2006, 16:40 »
könnte es nicht sein, das des an den relocations liegt?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 09. July 2006, 19:10 »
Zitat von: stafe
__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...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

stafe

  • Beiträge: 35
    • Profil anzeigen
    • http://www.staticos.at.tf
Gespeichert
« Antwort #5 am: 10. July 2006, 12:33 »
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 ??
mfG Stafe

 

Einloggen