Ich habe kürzlich angefangen, Assembler zu lernen, und habe etwas über Linkerskripte und andere grundlegende Details der Hardware-Programmierung gelernt. Ich unterrichte mich auch selbst in Computerarchitektur, und irgendwann fürchtete ich, dass mein Bild vom Speichermodell die ganze Zeit falsch gewesen sein könnte.
Nach meinem derzeitigen Kenntnisstand befinden sich der gesamte Code und die gesamten Daten im nichtflüchtigen Speicher, unmittelbar nachdem wir die Binärdatei auf einen Prozessor "gebrannt" haben - der flüchtige RAM enthält beim Zurücksetzen nichts. Wenn das Programm mit der Ausführung beginnt, geschieht dies ab der Adresse 0x0000, die fast immer (AFAIK) die niedrigste Adresse in Flash ist. Anweisungen werden also auf dem Bus zwischen Flash und CPU-Kern zwischengespeichert, und dort findet die eigentliche Ausführung statt. Wenn wir jedoch davon sprechen, dass die CPU Daten aus dem Speicher abruft oder speichert, sprechen wir normalerweise von RAM. Mir ist bewusst, dass wir auch Daten aus dem Programmspeicher lesen / schreiben können (ich habe dies bei AVRs gesehen). aber ist es nicht so häufig? Liegt es daran, dass RAM schneller als ROM ist, dass wir Daten dort speichern möchten?
Die akzeptierte Antwort auf diese Frage besagt, dass die meisten Codeteile im RAM ausgeführt werden.
Bedeutet dies, dass der Start-Runtime-Code (der selbst von Flash ausgeführt wird) alle Programm-Opcodes von Flash in den Arbeitsspeicher kopieren muss und die Adressen in Flash irgendwie so zuordnet, dass sie auf den Arbeitsspeicher verweisen, sodass die CPU von dort Opcodes abruft? Entspricht es dem Vorgang, bei dem die .data-Abschnitte beim Start vom ROM in den RAM verschoben werden?
Ich kann mir vorstellen, dass dies in von Neumann-Architekturen einfacher ist, in denen sich Programm- und Datenspeicher einen Bus teilen. Aber in Harvard-Architekturen bedeutet dies nicht, dass der gesamte Code und die gesamten Daten zuerst die CPU-Register passieren müssen.
Wie Sie wahrscheinlich erraten können, bin ich ein bisschen zu verwirrt von dieser ganzen Angelegenheit. Ich habe immer auf einer höheren Abstraktionsebene programmiert und bin leicht mit solchen Details konfrontiert. Jede Hilfe wird geschätzt.