Gần đây tôi đã bắt đầu học lắp ráp và biết về các tập lệnh liên kết và các chi tiết cấp thấp khác về lập trình phần cứng. Tôi cũng đang tự dạy kiến trúc máy tính và ở đâu đó dọc theo con đường tôi đã lo sợ rằng hình ảnh của tôi về mô hình bộ nhớ có thể đã sai hoàn toàn.
Theo những gì tôi hiểu hiện tại, tất cả mã và dữ liệu nằm trên bộ nhớ không bay hơi ngay sau khi chúng tôi 'ghi' nhị phân vào bộ xử lý - RAM không ổn định không chứa gì khi thiết lập lại. Khi chương trình bắt đầu 'thực thi', nó sẽ thực hiện từ địa chỉ 0x0000 gần như luôn luôn (AFAIK), địa chỉ thấp nhất trong Flash. Vì vậy, các hướng dẫn được chốt trên xe buýt kết nối Flash với lõi CPU và đó là nơi diễn ra thực tế thực tế. Tuy nhiên, khi chúng ta nói về việc truy xuất CPU hoặc lưu trữ dữ liệu từ bộ nhớ, chúng ta thường nói về RAM - Tôi biết rằng chúng ta cũng có thể đọc / ghi dữ liệu từ bộ nhớ chương trình (Tôi đã thấy điều này được thực hiện trên các AVR) Nhưng nó không phải là phổ biến? Có phải vì RAM nhanh hơn ROM mà chúng tôi muốn lưu trữ dữ liệu ở đó?
Câu trả lời được chấp nhận cho câu hỏi này nói rằng hầu hết các đoạn mã thực thi hết RAM.
Điều này có nghĩa là mã thời gian chạy khởi động (tự thực thi từ Flash) phải sao chép tất cả các mã chương trình từ Flash sang RAM và bằng cách nào đó ánh xạ các địa chỉ trong Flash để trỏ đến RAM để CPU tìm nạp mã từ đó? Nó có giống với quá trình chúng ta di chuyển các phần .data từ ROM sang RAM khi khởi động không?
Tôi có thể tưởng tượng điều này đơn giản hơn trong các kiến trúc von Neumann nơi các bộ nhớ chương trình và dữ liệu chia sẻ một chiếc xe buýt nhưng trong các kiến trúc Harvard không có nghĩa là tất cả các mã và dữ liệu phải đi qua các thanh ghi CPU trước?
Như bạn có thể đoán, tôi hơi bối rối bởi toàn bộ doanh nghiệp này. Luôn luôn được lập trình ở mức độ trừu tượng cao hơn, tôi dễ gặp rắc rối với những chi tiết như vậy. Bất kỳ trợ giúp được đánh giá cao.