Son zamanlarda montaj öğrenmeye başladım ve bağlayıcı komut dosyaları ve donanım programlamanın diğer düşük düzeyli ayrıntıları hakkında bilgi edindim. Ayrıca kendime bilgisayar mimarisi öğretiyorum ve hat boyunca bir yerde, bellek modeli resmimin baştan başa yanlış olabileceğinden korkmaya başladım.
Şu anda anladığım kadarıyla, tüm kod ve veriler, ikiliyi bir işlemciye 'yaktıktan' hemen sonra kalıcı bellekte bulunur - RAM'in geçici olması sıfırlandıktan sonra hiçbir şey içermez. Program 'yürütmeye' başladığında, bunu hemen hemen her zaman (AFAIK) Flash'taki en düşük adres olan 0x0000 adresinden yapar. Bu nedenle, Flash'ı CPU çekirdeğine bağlayan veri yoluna talimatlar yerleştirilir ve gerçek yürütme burada gerçekleşir. Ancak, CPU'nun bellekten veri alması veya depolaması hakkında konuştuğumuzda, genellikle RAM'den bahsediyoruz - program belleğinden de veri okuyabildiğimiz / yazabileceğimizin farkındayım (bunu AVR'lerde yaptım) ama o kadar yaygın değil mi? RAM, orada veri depolamayı tercih ettiğimiz ROM'dan daha hızlı olduğu için mi?
Bu soruya kabul edilen cevap , çoğu kod parçasının RAM dışında yürütüldüğünü söylüyor.
Bu, başlangıç çalışma zamanı kodunun (kendisi Flash'tan yürütülür) tüm program opcodlarını Flash'tan RAM'e kopyalaması gerektiği anlamına gelir ve bir şekilde Flash'taki adresleri RAM'e işaret edecek şekilde eşler, böylece CPU oradan opcodes alır. Başlangıçta .data bölümlerini ROM'dan RAM'e taşıdığımız sürece benzer mi?
Programın ve veri anılarının bir otobüsü paylaştığı von Neumann mimarilerinde bunun daha basit olduğunu hayal edebiliyorum, ancak Harvard mimarilerinde bu, tüm kod ve verilerin önce CPU kayıtlarından geçmesi gerektiği anlamına gelmez mi?
Tahmin edebileceğiniz gibi, tüm bu iş için biraz kafam karıştı. Her zaman daha yüksek bir soyutlama düzeyinde programladığımda, bu tür ayrıntılarla kolayca rahatsız oluyorum. Herhangi bir yardım takdir.