Ergebnis 1 bis 5 von 5
  1. #1
    Mitglied
    Registriert seit
    Jul 2007
    Beiträge
    249

    Standard Computer Funktionsweise

    Hallo, ich verstehe diesen Text nicht ganz. Könnte mir jemand Helfen?

    Bei b) verstehe ich nichts. Warum müssten die Adressen im Virteullen Adr.raum von Prog A in C gleich sein. Und Warum ist bei Prog C, C-Graphik keine Kopie wenn es im eigenem Adr.raum laut Bild ist.
    Bei c) verstehe ich nur nicht, wie der virtuelle Speicher fragmentiert werden würde.


    edit: unteren Code nochmal besser geschrieben
    Hier hätte ich noch zwei Unklarheiten aber eher nicht so wichtig wie das Obere:

    Code:
    (gdb) list
    1	char *c="AAAAAAAA";
    2	char d[]="BBBBBBBB";
    3	
    4	int main() {
    5		printf(c, d);
    6	}
    (gdb) disass main
    Dump of assembler code for function main:
       0x080483e4 <+0>:	push   %ebp
       0x080483e5 <+1>:	mov    %esp,%ebp
       0x080483e7 <+3>:	and    $0xfffffff0,%esp
       0x080483ea <+6>:	sub    $0x10,%esp
       0x080483ed <+9>:	mov    0x804a014,%eax
       0x080483f2 <+14>:	movl   $0x804a018,0x4(%esp)
       0x080483fa <+22>:	mov    %eax,(%esp)
       0x080483fd <+25>:	call   0x804831c <printf@plt>
       0x08048402 <+30>:	leave  
       0x08048403 <+31>:	ret    
    End of assembler dump.
    (gdb) print c
    $1 = 0x80484d0 "AAAAAAAA"
    (gdb) print d
    $2 = "BBBBBBBB"
    (gdb) x/s 0x804a014
    0x804a014 <c>:	 "Є\004\bBBBBBBBB"
    (gdb) x/s 0x804a018
    0x804a018 <d>:	 "BBBBBBBB"
    Verstehe es nicht ganz, die Parameter die der Funktion printf übergeben werden zeigen auf den read/write Bereich vom Datensegment (0x804a014) aber in printf würde er sogar die Richtige nehmen (0x80484d0) vom read only Bereich (hab hier ohne die Ausgabe von printf, damits wenniger Assembler Code ist)... Hier komm ich auf keine sinnvolle Theorie, könnte mir jemand erklären was da abläuft und warum wird bei "print c" die Adresse noch mit ausgegeben.

    Wenn *a="A..." disassembliert wird kommt einmal mov $0x8,%eax; mov %eax, -0x4(%ebp); raus und einmal $0x8,-0x4(%ebp); obwohl beide Codes identisch sind, bis auf den Parameter von printf (einmal a und einmal &a). Wie kann so etwas zustande kommen? Warum macht er überhaupt den Umweg über %eax oder geht mov Constante nach Adr nicht? Dann wär aber mov und movl Wohl doch nicht das selbe? Hab das mehrmals gegoogled.
    Geändert von yayabinks (30. 09. 2011 um 21:15 Uhr)

  2. #2
    Mitglied

    (Threadstarter)


    Registriert seit
    Jul 2007
    Beiträge
    249

    Standard Re: Computer Funktionsweise

    Hab die erste unwichtige Frage raus gefunden. Mein Fehler war das ich *a mit a[] gleich gestellt (habs in Prg1 so gesagt bekommen, das *a="" das selbe wie a[]="" wäre). Also bei c wird eben die Adr von der Pointer-Variable übergeben! Wenn ich dann im GDB x/x 0x804a014 eingebe dann bekomm ich 0x80484d0 raus (die Adr von "A...").
    Bei print c wird die Adr noch dazu geschrieben weil es ein Pointer ist.

    Hätte niemand eine Ahnung zu meiner ersten Frage?
    Geändert von yayabinks (30. 09. 2011 um 20:43 Uhr)

  3. #3
    Mitglied Avatar von lupo1977
    Registriert seit
    Feb 2006
    Ort
    Hier & Jetzt
    Beiträge
    1.151

    Standard Re: Computer Funktionsweise

    Hätte niemand eine Ahnung zu meiner ersten Frage?
    Was ist denn nun konkret Deine Frage? Bitte mal etwas strukturierter vorgehen. Ich kann Dir im Moment nämlich nicht folgen. Möglicherweise geht es nicht nur mir so

  4. #4
    Mitglied

    (Threadstarter)


    Registriert seit
    Jul 2007
    Beiträge
    249

    Standard Re: Computer Funktionsweise

    Die Frage zu b) hat sich erledigt, waren nur Fehlende vorkenntnisse.

    Aber wüsste jemand wie der virtuelle Speicher fragmentiert werden kann? Das einzigste das mir einfällt ist, wenn es so wie in b) gemacht wird, dann ist Platz zwischen Prog. A und "C-Graphik". Könnte das so gemeint sein? Über google konnte ich garnichts dazu finden.

  5. #5
    Virtual Áigái

    ex-Moderator

    Avatar von TheSplit
    Registriert seit
    Apr 2001
    Beiträge
    2.567

    Standard Re: Computer Funktionsweise

    Ich kann nur "my best guess" geben, aber theoretisch scheint das "Code sharing" darauf begründet zu sein das Daten und Funktionien nicht kollidieren bzw. überschrieben werden und Daten (Funktionen, Werte..) gemeinsam bzw. geteilt von verschiedenen Programmen genutzt werden können um Overhead, durch das mehrfache Laden von Codeblöcken und zuweisen von Datenwerten, zu vermeiden.

    Daraus resultiert das du, im Falle einer Kollision dafür sorgen mußt das freier Addressspeicher genutzt wird und eine Funktion die andere bzw. andere Daten im Speicher nicht überschreibt. Es muss also ein freier Speicherblock im Addressraum gefunden werden der keine Daten enthält und genug Umfang bietet oder die Daten und Funktionen so organisiert (fragmentiert) werden das diese (also alles was schon geladen ist) mit dem Programmspeicher aufrückt und dementsprechend Platz für das Folgeprogramm bietet. Dafür vermutlich steht auch die Faustregel mit dem virtuellen Adressraum zu arbeiten da dieser wahrscheinlich mit wächst oder schrumpft, im Gegensatz zu harten Addresswerten. (Memory Mapping?)

    Aber wie gesagt, "best guess"

  6.  
     
     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •