Niedawno zacząłem uczyć się asemblera i poznałem skrypty linkera oraz inne szczegóły niskiego poziomu programowania sprzętowego. Uczę się również architektury komputerowej i gdzieś po linii zacząłem się obawiać, że moje zdjęcie modelu pamięci może być przez cały czas błędne.
Zgodnie z tym, co rozumiem obecnie, cały kod i dane znajdują się w nieulotnej pamięci tuż po „wypaleniu” pliku binarnego na procesorze - pamięć RAM, która jest niestabilna, nie zawiera niczego po zresetowaniu. Kiedy program zaczyna „wykonywać”, robi to z adresu 0x0000, który prawie zawsze (AFAIK) jest najniższym adresem we Flashu. Instrukcje są więc zaczepiane na szynie łączącej Flash z rdzeniem procesora i tam właśnie odbywa się faktyczne wykonanie. Jednak, gdy mówimy o odzyskiwaniu lub przechowywaniu danych z pamięci przez procesor, zwykle mówimy o pamięci RAM - mam świadomość, że możemy również odczytywać / zapisywać dane z pamięci programu (widziałem to na AVR) ale czy to nie jest tak powszechne? Czy dlatego, że RAM jest szybszy niż ROM, wolimy tam przechowywać dane?
Akceptowana odpowiedź na to pytanie mówi, że większość fragmentów kodu jest wykonywana poza pamięcią RAM.
Czy to oznacza, że kod uruchomieniowy uruchamiania (który sam wykonuje się z Flasha) musi skopiować wszystkie kody programu z Flasha do RAM i w jakiś sposób mapuje adresy we Flashu, aby wskazywały na RAM, aby CPU pobierał stamtąd stamtąd? Czy jest podobny do procesu, w którym przenosimy sekcje .data z ROM do RAM podczas uruchamiania?
Mogę sobie wyobrazić, że jest to prostsze w architekturach von Neumanna, w których pamięć programu i danych współużytkuje magistralę, ale w architekturach Harvarda czy to nie znaczy, że cały kod i dane muszą najpierw przejść przez rejestry procesora?
Jak zapewne można się domyślić, jestem trochę zbyt zdezorientowany całą tą sprawą. Zawsze programując na wyższym poziomie abstrakcji, łatwo mnie niepokoją takie szczegóły. Każda pomoc jest mile widziana.