Thema: Computer Funktionsweise
-
30. 09. 2011, 01:44 #1Mitglied
- Registriert seit
- Jul 2007
- Beiträge
- 249
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:
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.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"
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)
-
30. 09. 2011, 20:36 #2Mitglied
(Threadstarter)
- Registriert seit
- Jul 2007
- Beiträge
- 249
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)
-
01. 10. 2011, 00:12 #3
Re: Computer Funktionsweise
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 soHätte niemand eine Ahnung zu meiner ersten Frage?
-
04. 10. 2011, 14:23 #4Mitglied
(Threadstarter)
- Registriert seit
- Jul 2007
- Beiträge
- 249
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.
-
11. 10. 2011, 18:22 #5
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"
-


Zitieren
mehr lesen...







Mechwarrior Online: Closed Beta...
Heute, 12:36 in gulli:news