Mit Zeiger über Segmentgrenze arbeiten



  • Danke erstmal, werde es gleich morgen ausprobieren.
    GRUSS
    INGO



  • Cefour schrieb:

    Caste einfach:

    zeiger = (char *)0x71201ff8 ;
    müste eigentlich klappen

    Zumindest kannst du damit die Compilerwarnung umgehen. Der SegFault bleibt - und deutet darauf hin, daß Windows dir den Zugriff auf diese Adresse verweigert.
    (woher hast du diesen Wert überhaupt?)



  • ingo_46 schrieb:

    Hier die Details:
    Compiler : gcc (ansi-c)
    Prozessor : Sparc_5V
    Betriebsystem : Solaris 2.6



  • CStoll schrieb:

    Der SegFault bleibt - und deutet darauf hin, daß Windows dir den Zugriff auf diese Adresse verweigert.

    ich glaube nicht dass windows ihm auf der sun-box weiterhelfen kann 😉
    ingo: offensichtlich verbietet dir das os den zugriff auf die adresse. da musste dich mal mit den speicherschutzmechanismen von solaris auseinandersetzen. bestimmt gibt's da apis um den schutz auszuschalten. natürlich musste dein programm dann als 'root' ausführen...



  • Hallo alle,
    stimmt, so einfach ist es dann doch nicht!!! Mit der Caste habe ich aber die Compilerwarnung weg bekommen. Somit bin ich schon mal einen Schritt weiter!
    Danke an Cefour.

    Wie gesagt wenn es Windows wäre, dann hätte ich mir Turbo C besorgt und mit Far-Zeiger und Intput/Output gearbeitet. Leider bin ich aber an Solaris 2.6 gebunden.

    net: Deine Bemerkung hat mich auf die Idee geracht nicht im Breich C nach einer Lösung zu suchen sondern unter Solaris. Beim "Gogglen" bin ich dann auf die "Developers Guides" von Sun gestossen. So langsam kommt Licht un das Dunkel. Denn es gibt einen Kernel-Driver für Memory. Die Adressen der Zeiger liegen in einem virtuellen Speicher, der mit der physischen Adresse des Programms im Memory nichts zu tun hat. Auf diese Weise kann man 100MB Daten mit 64MB Hauptspeicher verwalten.

    Nun suche ich erstmal auf dieser Schiene wieter. Sollte Interesse bestehen, so kann ich ja mal posten wie es weiter geht. Bis dahin....

    MUNTER BLEIBEN
    GRUSS
    INGO



  • Ich meine wenn ich auf Adressen Innerhalb von Windows arbeite, dann könnte man das z.B so machen

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	HWND hWnd = (HWND) 0x0003003E;
    	SetWindowText(hWnd,"HALLO");
    	system("pause");
    	return 0;
    }
    

    Die Adresse des HWND HABE ICH mit SPY++ bekommen und mit diesem Code kann ich den StartButton Windows XP verändern.

    Mann sollte nur wissen was an der Adresse für ein TYP von Variable ist ...



  • Cefour schrieb:

    Ich meine wenn ich auf Adressen Innerhalb von Windows arbeite, dann könnte man das z.B so machen

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	HWND hWnd = (HWND) 0x0003003E;
    	SetWindowText(hWnd,"HALLO");
    	system("pause");
    	return 0;
    }
    

    Die Adresse des HWND HABE ICH mit SPY++ bekommen und mit diesem Code kann ich den StartButton Windows XP verändern.

    Mann sollte nur wissen was an der Adresse für ein TYP von Variable ist ...

    das hat ja nun wirklich *gar nichts* mit ingos frage zu tun...



  • Also wenn du nicht gerade DOS verwendest kannst dein unternehmen knicken, da moderne Betriebssysteme im Protected Mode laufen. Da kannst dann nicht einfach auf ne x beliebige Adresse zugreifen.
    Das wäre ja voll der Bug dann könnte ja andere Programme den Hauptspeicher nach daten von anderen Programmen absuchen!!.

    So langsam kommt Licht un das Dunkel. Denn es gibt einen Kernel-Driver für Memory. Die Adressen der Zeiger liegen in einem virtuellen Speicher, der mit der physischen Adresse des Programms im Memory nichts zu tun hat. Auf diese Weise kann man 100MB Daten mit 64MB Hauptspeicher verwalten.

    Ein beweis dafür das Solaris im protected mode läuft du kannst nicht auf die physische addresse zugreifen!!



  • Hallo tobZel,

    Dein Beitrag leuchtet mir ein, hat aber meiner Meinung nach einen Denkfehler. Alle Operationen die die Peripherie betreffen (Uhr,Drucker,Disk....usw) laufen irgendwann an einer Hardware-Adresse auf. Somit muss es einen Weg geben auf die physische Memoryadresse zuzugreifen! Der Befehl EEPROM liest unter Solaris direkt die Werte des NVRAM aus und zeigt diese am Bildschirm an. Das ist das beste Beispiel, das es einen Weg geben muss!

    OK! Da gibt es ja die Kernel Driver und die Driver Module, wirst Du jetzt denken und ich sage dazu RICHTIG! Der Zeiger war ein Versuch!! Weil ich unter Windows mit Turbo C schon mal solche "Klimmzüge" gemacht habe dachte ich er führt auch hier zum Ziel!!

    Also formuliere ich die Frage neu:
    Wie kann man unter Solaris 2.6 mit gcc im ansi-c Modus Daten an eine Hardwareadresse (Memory, I/O-Port) senden oder Daten von dort empfangen?

    Ich bin zwar hier im Forum sowas wie der Benjamin, weil ich erst seit zwei Tagen daran teilnehme, deshalb klingt das vieleicht überheblich was ich jetzt poste - soll es aber nicht:
    Ich werde das Unternehmen auf keinen Fall Knicken!! Jedenfalls nicht solange ich nicht alle Wege probiert habe!!!

    GUSS
    INGO



  • Hallo Ingo,

    ich weiss jetzt zwar nicht direkt wie unter Solaris ein Direct-Memory Zugriff auf eine physikalische Speicheradresse funktioniert, aber Du könntest folgenden Weg probieren:

    Es gibt ein Tool namens "truss" (Ist default auf Solaris installiert) mit welchem Du die SysCalls die eine Applikation aufruft mitschneidest. Wenn Du also die Applikation "eeprom" welche direkt auf die H/W zugreift mittels truss startest und dich etwas in den Output einliest, dann siehst Du mittels welcher SysCalls dies geschieht.

    Grüsse, Egon



  • Du hast bei einem modernen UNIXoiden (aber auch Windows) keine andere Möglichkeit als

    a) Über Syscalls auf Treiber zuzugreifen
    b) Selbst einen Kernel-Treiber zu schreiben, denn nur der Kernel darf an die Hardware und den physikalischen Speicher

    Insoweit hat tobZel, was ein normales Userspace-Programm betrifft vollkommen recht.


Anmelden zum Antworten