Как процессор различает guish между ОЗУ и энергонезависимой памятью? - PullRequest
0 голосов
/ 26 февраля 2020

На самом базовом уровне c как процессор интерпретирует машинный язык, чтобы различать guish между ОЗУ и энергонезависимой памятью, доступной компьютеру? Как эта память извлекается / кэшируется?

Предположим, мы находимся на 8-битном компьютере с (для примера) 32 байтами ОЗУ и 256 байтами энергонезависимой памяти.

Если мы запрашиваем конкретный адрес памяти, как процессор узнает, ссылаемся ли мы на память в fla sh или на энергонезависимую память? Они просто перекрываются?

Например, если первый байт оперативной памяти - это адрес 0x00. Если первые 16 байтов оперативной памяти зарезервированы для стека, а 0x10 - это первый байт программы. Если программа загружается из 0x00 во фл sh память, что означает адрес памяти 0x11? Это второй байт программы (ссылающийся на RAM) или 17-й байт (ссылающийся на fla sh)?

Если 0x11 ссылается на RAM (что должно быть, чтобы предоставить доступ к стек) тогда как мы будем ссылаться на данные во фл sh памяти? Если я попрошу 0x00, он вернет мне первый байт в стеке, а не первый байт в памяти fla sh. Конечно, я мог бы попросить 0x10 вместо этого, так как мы знаем, что там начинается его программа. Но если произошел такой же сценарий, но программа была запущена в 0x80 на fla sh, то это сделало бы первые 128 байтов памяти fla sh недоступными (поскольку 0x00 (requested address) = 0x80 (in flash).

Другая проблема заключается в запись. Если я пишу в ОЗУ в стеке, я не хочу также записывать в fla sh. Поэтому мы знаем, что в ОЗУ должна быть хотя бы какая-то часть, которая не соответствует памяти в FL sh.

Наконец, как на самом деле кэшируются эти данные? Если я загружаю адрес памяти, который находится за пределами того, что хранится в ОЗУ, то останавливает ли ЦП выполнение инструкции и запускает некоторую процедуру для копирования этого сектора из fla? sh в оперативную память?

...