나는 최근에 어셈블리 학습을 시작했고 링커 스크립트와 하드웨어 프로그래밍의 다른 저수준 세부 사항에 대해 알게되었습니다. 나는 또한 나 자신에게 컴퓨터 아키텍처를 가르치고 있고 선을 따라 어딘가에 메모리 모델에 대한 나의 그림이 잘못되었을지도 모른다는 두려움이 생겼다.
내가 현재 이해하는 것에 따르면, 모든 코드와 데이터는 바이너리를 프로세서에 '굽기'한 직후 비 휘발성 메모리에 상주합니다. 휘발성 RAM에는 재설정시 아무것도 포함되지 않습니다. 프로그램이 '실행'을 시작하면 0x0000 주소에서 시작합니다.이 주소는 거의 항상 플래시에서 가장 낮은 주소 (AFAIK)입니다. 따라서 플래시를 CPU 코어에 연결하는 버스에 명령이 래치되며 실제 실행이 이루어지는 곳입니다. 그러나 CPU가 메모리에서 데이터를 검색하거나 저장하는 것에 대해 이야기 할 때 일반적으로 RAM에 대해 이야기합니다. 프로그램 메모리에서도 데이터를 읽고 쓸 수 있음을 알고 있습니다 (AVR 에서이 작업을 보았습니다) 그러나 그것은 평범하지 않습니까? RAM이 ROM보다 빠르기 때문에 데이터를 저장하는 것을 선호합니까?
에 허용 대답 이 질문은 대부분의 코드 조각 RAM 밖으로 실행할 수 있다고 말한다.
이것은 시작 런타임 코드 (자체적으로 Flash에서 실행 됨)가 모든 프로그램 opcode를 Flash에서 RAM으로 복사해야하고 CPU가 거기에서 opcode를 가져 오도록 Flash의 주소를 RAM을 가리 키도록 매핑해야합니까? 시작시 .data 섹션을 ROM에서 RAM으로 이동하는 프로세스와 비슷합니까?
프로그램과 데이터 메모리가 버스를 공유하는 폰 노이만 아키텍처에서는 이것이 더 단순하다고 생각할 수 있지만 하버드 아키텍처에서는 모든 코드와 데이터가 먼저 CPU 레지스터를 통과해야한다는 의미는 아닙니까?
당신이 아마 짐작할 수 있듯이, 나는이 전체 사업에 약간 혼란 스럽습니다. 항상 더 높은 추상화 수준으로 프로그래밍했기 때문에 이러한 세부 사항에 쉽게 어려움을 겪습니다. 도움을 주시면 감사하겠습니다.