Verwirrung: Wikibooks 2³²



  • Lauter Informatiker hier 😃

    Um die Verwirrung um den 32 Bit Adressbus noch mehr zu verstärken: Wenn man sich das Datenblatt vom 80386 anschaut, findet man "nur" 30 Adressleitungen, also "nur" 30 Bit... 🙂 Wie macht er denn das bloss mit 32 Bit? 😃



  • abc.w schrieb:

    findet man "nur" 30 Adressleitungen, also "nur" 30 Bit... 🙂 Wie macht er denn das bloss mit 32 Bit? 😃

    windows-auslagerungsdatei.



  • leider muss ich nochmals einhaken weil es doch nicht ganz klar ist. eine adressierung hat ja immer 1 byte und deswegen gehen mir diese 4 bytes, was ja 32 bit's sind, einfach nicht aus dem kopf.

    Nachtfalke@night schrieb:

    2^32 Byte deshalb, weil jede Adresse genau ein Byte bezeichnet. Und dass wir mit 32-Bit 2^32 Adressen bauen können, hast du im ersten Posting ja schon erkannt. Jede `Möglichkeit' adressiert ein Byte.

    und genau das verstehe ich nicht. wenn eine adresse aus 1 byte besteht, wären das ja nur 2^8, also 256 unterschiedliche adressen. und: "Jede `Möglichkeit' adressiert ein Byte" versteh ich nicht. jede möglichkeit besteht aber immer aus 4 bytes. wo setze ich falsch an? 😃 ah, jetzt vielleicht: diese möglichkeiten haben garnichts mit der adresse ansich zu tun, sondern der dezimale wert der aus den möglichkeiten entsteht, ist die adresse und das wiederum 1 byte? 🕶 🙄 hm

    Nachtfalke@night schrieb:

    ...aber ein Lesevorgang auf einem 32 Bit System findet tatsächlich immer über 4 Byte auf einmal statt.

    aber was wenn ich ein char aus dem speicher lese? dann benötige ich ja nur 1 byte. wie kann der prozessor hier dann 4 bytes lesen?

    Nachtfalke@night schrieb:

    Ein long int ist meines Wissens auf einem 32 Bit System auch nur 32 Bit, d.h. nicht mehr als ein normales int.

    okay sorry, ich meinte eigentlich ein double. wie sieht es hier aus, das wären 8 bytes. danke schonmal 🙂



  • treppe schrieb:

    leider muss ich nochmals einhaken weil es doch nicht ganz klar ist. eine adressierung hat ja immer 1 byte und deswegen gehen mir diese 4 bytes, was ja 32 bit's sind, einfach nicht aus dem kopf.

    Du musst mal zwischen der Adresse und dem, was adressiert wird, unterscheiden. Eine Anschrift ist ja auch kein Haus, sondern nur 4 Zeilen Text. Also: Der Speicher ist in 2^32 adressierbare Einheiten aufgeteilt. Um so eine Adresse anzugeben, brauchst du 4 Byte. Das, was du damit adressierst, sind aber einzelne Bytes.

    Nachtfalke@night schrieb:

    ...aber ein Lesevorgang auf einem 32 Bit System findet tatsächlich immer über 4 Byte auf einmal statt.

    aber was wenn ich ein char aus dem speicher lese? dann benötige ich ja nur 1 byte. wie kann der prozessor hier dann 4 bytes lesen?

    Er liest 4 Bytes und wirft davon 3 weg, schätze ich.



  • treppe schrieb:

    Nachtfalke@night schrieb:

    ...aber ein Lesevorgang auf einem 32 Bit System findet tatsächlich immer über 4 Byte auf einmal statt.

    aber was wenn ich ein char aus dem speicher lese? dann benötige ich ja nur 1 byte. wie kann der prozessor hier dann 4 bytes lesen?

    Er liest 4 Bytes und und wirft danach 3 Bytes irgendwie weg, z.B. indem er sie auf 0 setzt oder einfach ignoriert.

    treppe schrieb:

    Nachtfalke@night schrieb:

    Ein long int ist meines Wissens auf einem 32 Bit System auch nur 32 Bit, d.h. nicht mehr als ein normales int.

    okay sorry, ich meinte eigentlich ein double. wie sieht es hier aus, das wären 8 bytes. danke schonmal 🙂

    Wenn pro Speicherzugriff nur 4 Bytes gelesen werden können, müssen zwei Speicherzugriffe stattfinden, um einen double zu lesen.

    Diese ganzen Speicherzugriffe (wie viele, ob aus dem Cache oder aus dem RAM, virtueller Adressraum, etc.) sind normalerweise völlig transparent. Die CPU hat nur eine Speicheradresse, die aus 32 Bit besteht, und bekommt "irgendwoher" die Bytes, die unter dieser Speicheradresse erreichbar sind. Wo die Bytes herkommen, ist der Hardware ziemlich freigestellt, die müssen nichtmal im RAM existieren.

    Aber ich würde dir auch raten: Kauf dir ein Buch über Rechnerarchitektur oder leih dir eins aus aus der Uni-Bibliothek.



  • oh man, dass kann doch nicht sein oder? also: ganz einfach gesagt, jede adresse hat 4 bytes. nun kann man mit einem 32 bit prozessor 2^32 mögliche (4.294.967.296) adressen benutzen. und jetzt kommts: da im RAM jeweils immer genau 1 byte adressiert wird, spricht man von 4.294.967.296 byte. egal ob eine adresse aus 1,2,4 oder gar 8 bytes besteht. hab ichs jetzt endlich?

    dies bedeutet, eine adresse ist dann in binärer form bei 32 bit z.B.:
    00110100 00110100 00110100 00110100

    und wenn man von adressieren spricht, meint man das im speicher eine 1 byte zelle mit einem wert hinterlegt wird, welcher die obige adresse aus 4 bytes bestehend, enthält. ja? 😮 🙂



  • das "oh man, dass kann doch nicht sein oder?" bezieht sich natürlich auf mich selber, weil das ganze doch völlig simpel ist und ich jetzt 4 seiten dazu brauche um mir sowas zu erklären 🤡



  • falls ich es jetzt verstanden habe und es somit simmt, habe ich noch eine kleine frage. gehe ich richtig der annahme, das adressen nirgends existieren, sondern dass alle zellen eines speichermodule inkremental angesprochen werden können? nehmen wir als beispiel einen computer mit 2 speicherbänken, welche mit 2x256MB ram belegt sind. also total 512mb arbeitsspeicher sind verfügbar.

    das würde also heissen, jeder riegel hat 268435456 zellen, sprich bytes. total wären dies dann 536870912 zellen/bytes. nun nehmen wir an, ich möchte die zelle 321829011 mit dem buchstaben 'A' über einen zeiger belegen. jetzt teile ich dem prozessor die adresse der speicherstelle, über den zeiger mit adresse 321829011 mit. was fällt auf? 321829011 ist die adresse aber zugleich logischerweise auch die zelle. und was fällt noch auf? der wert 321829011 ist über dem möglichen eines unserer riegel im beispiel, es müsste sich also um den riegel in der bank nr. 2 handeln. jetzt kann also der buchstabe 'A' welcher als int wert in binärer form mit einem byte vorliegt, in die zelle 321829011 geschrieben werden.

    so, und wenn das ganze nun nicht mit einem byte geschieht, sondern mit sagen wir 8 bytes an daten (z.B. ein string bzw. char array), wird folgendes belegt:

    321829011
    321829012
    321829013
    321829014
    321829015
    321829016
    321829017
    321829018

    hm aber moment. jetzt fällt mir gerade ein, dass neben dem wert einer variable ja auch die adresse im speicher hinterlegt wird. bei einem zeiger wird seine eigene adresse hinterlegt und die, auf die er zeigt. also kann der anfang oben garnicht stimmen. das würde vielmehr bedeuten das in einer zelle die adresse steht und in den darauf folgenden die werte. bei A B C sind das vier zellen. eine für die adresse selber und dann die 3 bytes für A B C. 😕 😕

    i'm so sorry!



  • abc.w schrieb:

    Lauter Informatiker hier

    nana, nicht gleich beleidigend werden.

    abc.w schrieb:

    Um die Verwirrung um den 32 Bit Adressbus noch mehr zu verstärken: Wenn man sich das Datenblatt vom 80386 anschaut, findet man "nur" 30 Adressleitungen, also "nur" 30 Bit... 🙂 Wie macht er denn das bloss mit 32 Bit?

    stimmt das? ich dachte, die x86'er wurden von 32 auf 36 adressleitungen aufgemotzt. die älteren modelle 286/386 hatten weniger, 16 der 286'er und 24 der 386'er SX, der DX hatte doch bereits 32 adressleitungen, oder nicht?
    🙂



  • treppe schrieb:

    und genau das verstehe ich nicht. wenn eine adresse aus 1 byte besteht, wären das ja nur 2^8, also 256 unterschiedliche adressen.

    Dein Problem ist, du verwechselts hier die Begriffe. Eine Adresse ist nur eine Zahl. Mit 32 Bits kannst du Zahlen im Bereich 0 und 2^32-1 darstellen. Wie Computer Zahlen 0 <= x <= 2^32-1 speichern, ist an der Stelle egal. Also, wenn du du sagen kannst:

    Memory Controller, gibt mir Inhalt von Adresse x, und diese Zahl x kannst du mit 32 Bits darstellen, dann kannst du 2^32 Mal sagen,
    Memory Controller, gibt mir Inhalt von Adresse 0
    Memory Controller, gibt mir Inhalt von Adresse 1
    Memory Controller, gibt mir Inhalt von Adresse 2
    ...
    Memory Controller, gibt mir Inhalt von Adresse 2^32-1

    Hab gerade für dich gezeichnet: http://www.informatik.uni-freiburg.de/~yanezp/addr2.png

    Links sind nur Zahlen, 2^32 Zahlem um genau zu sein. Sie sind sowohl in ihrer Dezimaldarstellung als auch in ihrer Binärdarstellung.

    Rechts ist die Abbildung eines Adressraums. Jedes Byte hat 8 Bits, dort habe ich 2^32 Bytes gezeichnet (eben 4 GB). Wie du siehst, ich kann mit 32 Wortkombinationen aus 0 und 1 2^32 Zahlen darstellen, bzw. Speicheradressen ansprechen oder besser gesagt addresieren. Wenn ich eine Adresse im Speicher ablegen will, dann benötige ich 4 Bytes. Siehst du da den Unterschied?



  • noch eins (ich wiess ich bin hart): adressleitungen bedeutet, dass (bei 32bit z.b.) 32 pins(?) vorhanden sind, welche eigentlich als 32 bits gesehen werden können? durch diese 32 adressleitungen (also 32 bits) werden dann physikalisch die einzelnen bit zustände durchgejagt und das gerät am ende des bus erhält dann physikalisch den 32 bit binärcode? somit bei einer adressleitungen natürlich die adresse in physikalischer binärform. 😕

    wenn dies hin kommt, stimmt sicher auch folgendes: demnach gibt es also auch eine andere (namens?) leitung, wahrscheinlich die datenleitung, welche auch 32 bits hat. dort liest und schreibt dann der prozessor in physikalischer form die bit zustände. dies erklärt dann auch unser hier besprochenes 4 byte / lesevorgang. somit weiss ich dann auch wo man das lesen/schreiben auf physikalischer ebene (also wirklich da, wo es um anfassbaren strom geht)nachvollziehen kann.



  • treppe schrieb:

    nun kann man mit einem 32 bit prozessor 2^32 mögliche (4.294.967.296) adressen benutzen.

    richtig.

    treppe schrieb:

    und jetzt kommts: da im RAM jeweils immer genau 1 byte adressiert wird, spricht man von 4.294.967.296 byte. egal ob eine adresse aus 1,2,4 oder gar 8 bytes besteht. hab ichs jetzt endlich?

    fast. bei den x86'ern ist es so, aber auf 'ner anderen architektur könnten unter einer adresse auch 2, 3 oder 4 bytes sein. die adresse selbst ist nur eine fortlaufende nummer, sagt aber nichts darüber aus was adressiert wird.

    treppe schrieb:

    und wenn man von adressieren spricht, meint man das im speicher eine 1 byte zelle mit einem wert hinterlegt wird, welcher die obige adresse aus 4 bytes bestehend, enthält. ja?

    nein, im speicher an adresse x steht irgendwas und nicht die adresse selber. die adresse muss auch nirgends hinterlegt sein. stell dir eine strasse ohne hausnummern vor. zu haus 15 gelangst du, wenn beim ersten haus anfängst zu zählen, das ist haus #0, das nächste ist #1 usw. wenn du dich irgendwann gut in der strasse auskennst, dann brauchste nicht mehr zählen, sondern hast dir gemerkt, wo welches haus ist. wenn du 'nem computer sagst: 'hole mir was von adresse 913513', dann 'weiss' er auch sofort, wo er's finden kann.
    🙂



  • @supertux: zunächst einmal vielen lieben dank für deine bemühung. tolles bild! 🕶 . klar ist mir das ganze ja schon ich sehe es ja auch so wie du es dort auf dem bild darstellst. was mich zu anfang verwirrt hat, waren schlussendlich die 4 bytes einer adresse. und du selber schreibst ja nun:

    Wenn ich eine Adresse im Speicher ablegen will, dann benötige ich 4 Bytes.

    mit ablegen meinst du jetzt als wert oder? dann sind das natürlich 4 bytes. aber ist es denn nun so, dass adressen garnie im speicher als wert vorhanden sind? sprich kommt es inetwa so hin wie in meinem posting vor +fricky geschrieben? also eine variable hat keine im speicher hinterlegte adresse, sondern nur den wert welcher an den zellen verteilt ist und die zellen sind die adressen? bei einem pointer nichts anderes, nur das der pointer als wert eben eine adresse in 4 bytes gespeichert hat, auf den er zeigt.



  • treppe schrieb:

    mit ablegen meinst du jetzt als wert oder? dann sind das natürlich 4 bytes. aber ist es denn nun so, dass adressen garnie im speicher als wert vorhanden sind? sprich kommt es inetwa so hin wie in meinem posting vor +fricky geschrieben?

    es widerspricht frickys Poist nicht. Du kannst Adressen im Speicher speichern, wenn du willst, musst du aber nicht. Darum geht es. Deine Verwirrung entsteht, weil du denkst/dachtest, dass die Adressen selber im Speicher angelegt/gespeichert werden. Aber Adressen selber sind nur eine Zahl, ein Name, mehr nicht. Deine Hausnummer ist auch nur eine Nummer, du kannst sie aber niederschreiben und dir vor der Tür ein Schildchen mit der Nummer stellen. Du kannst du auch zum Nachbarn gehen und dort ein Schild hängen: das Haus #10 ist das da gegenüber.

    Der Memory Controller selber weiß, wo jede Adresse sich befindet. Der Programmier, der sich eine Adresse für die Zukunft merken muss, wird sie auch als eine Computerzahl darstellen und diese Darstellung speichern. In diesem Fall benötigst du eben 32 Bits für ihre Darstellung, also 4 Bytes.



  • hui, jetzt wirds durcheinander 🤡. aber ich merke, scheinbar verstehe ich es nun da mein obiger text genau das beschreibt was +fricky nun sagte. wenn jetzt z.B. folgendes definiert wird:

    int i = 1;
    

    wird im speicher 1 byte hinterlegt, weil es 00000001 sein müsste. oder aber doch 4 bytes, weil es ein integer ist, dann 00000000 00000000 00000000 00000001. korrekt? dann machen wir jetzt folgendes:

    int i = 2343289400;
    int *p_i = &i;
    

    jetzt hat p_i die adresse von i. sagen wir die adresse ist 1. nun möchten wir den wert von p_i. der wert ist also an adresse 1. da der prozessor (nein, der compiler oder?), nun weiss, dass an der adresse auf welche p_i zeigt, ein 32 bit integer wert ist, wird die adresse 1, 2, 3 und 4 ausgelesen und zusammengehängt ergibt das sagen wir: 01100111 01100111 01100111 01100111, also unser wert von 2343289400. kommt das hin? der compiler muss also wissen das der wert von 2343289400 an 4 zellen abgelegt wurde, da es sich um einen 32 bit integer wert handelte.

    wenn man nun ein char im speicher ablegt, welcher 0 bis 255 als integer im speicher hinterlegt, also 1 byte, dann müsste da nun nur eine zelle mit 8 bits belegt werden. beim zugriff auf diesen wert weiss der compiler wahrscheinlich, es handelte sich um einen char, also lese auch nur eine adresse aus, bzw. lese 4 zellen aus, behandle aber nur die erste zelle. korrekt?



  • @supertux: ja jetzt ist das thema endlich klar. thanks a lot!



  • Zum Wohle der Allgemeinheit schlage ich vor, diesen Thread zu löschen. Wenn den ein anderer Anfänger findet, würde er mit Sicherheit daran zerbrechen!



  • Safety First Gopher schrieb:

    Zum Wohle der Allgemeinheit schlage ich vor, diesen Thread zu löschen. Wenn den ein anderer Anfänger findet, würde er mit Sicherheit daran zerbrechen!

    ja, wäre gut.



  • warum sprechen eigentlich viele programmierer von "eine variable selbst hat eine adresse und der wert hinter der variable hat eine adresse" wenn dem doch nicht so ist? jetzt ist klar das nicht eine variable eine adresse hat, sondern nur der wert, der hinter einer variable verborgen ist, eine bzw. mehrere adressen hat. 😕



  • Wer sagt das? Eine Variable ist höchstens eine Adresse.


Anmelden zum Antworten