Основной вопрос относительно основанного на ROM исполняемого файла

У меня есть основное сомнение относительно исполняемого файла, сохраненного в ROM.

Поскольку я знаю, что исполняемый файл с текстом и атрибутами RO хранится в ROM. Вопрос состоит в том, как ROM для Постоянной памяти, что происходит, если существует ситуация, где код должен записать в память?

Я не могу вызвать в воображении любой пример для цитирования здесь (вероятно, я незнаком с такой ситуацией, или я пропускаю основной материал ;) но любой свет по этой теме может значительно помочь мне понять!:)

В последний раз прочь - 1. Там какая-либо такая ситуация? 2. В таком случае копирует код от ROM до RAM, ответ?

Ответ с некоторым примером может значительно помочь..

Заранее большое спасибо!

/MS

7
задан Clifford 5 July 2010 в 19:23
поделиться

4 ответа

Постоянная память доступна только для чтения из-за аппаратных ограничений. Программа может находиться в EEPROM , флэш-памяти, защищенной от записи, на компакт-диске или в любом другом месте, где оборудование физически запрещает запись. Если программное обеспечение записывает в ПЗУ, оборудование не может изменить сохраненные данные, поэтому ничего не происходит.

Таким образом, если программа в ПЗУ хочет записать в память, она записывает в RAM . Это единственный вариант. Если программа запускается из ПЗУ и хочет изменить себя , она не может, потому что не может записывать в ПЗУ. Но да, программа может запускаться из ОЗУ.

На самом деле запуск из ПЗУ случается редко, за исключением самых маленьких встроенных систем. Операционные системы копируют исполняемый код из ПЗУ в ОЗУ перед его запуском. Иногда код сжимается в ПЗУ, и перед запуском его необходимо распаковать в ОЗУ. Если оперативная память заполнена, операционная система использует подкачку для управления ею. Причина, по которой запуск из ПЗУ происходит так редко, заключается в том, что ПЗУ медленнее, чем ОЗУ, и иногда перед запуском необходимо изменить код загрузчиком .

Обратите внимание: если у вас есть код, который сам себя изменяет, вам действительно нужно знать свою систему. Многие системы используют предотвращение выполнения данных (DEP). Исполняемый код находится в областях ОЗУ для чтения и выполнения. Данные поступают в области чтения + записи. Таким образом, в этих системах код никогда не может измениться в оперативной памяти.

8
ответ дан 6 December 2019 в 14:00
поделиться

Обычно в ПЗУ хранятся только программный код, константы и данные инициализации. Отдельная область памяти в ОЗУ используется для стека, кучи и т. Д.

3
ответ дан 6 December 2019 в 14:00
поделиться

Есть несколько законных причин, по которым вы захотите изменить раздел кода во время выполнения. Сам компилятор не будет генерировать код, который этого требует.

У вашего компоновщика будет возможность сгенерировать файл MAP. Это сообщит вам, где находятся все объекты памяти .

Компоновщик выбирает место для размещения на основе сценария компоновщика (который вы можете настроить для организации памяти по своему усмотрению). Обычно код микроконтроллера на основе флэш-памяти и постоянные данные помещаются в ПЗУ. В ПЗУ также помещаются данные инициализации для ненулевых инициализированных статических данных, которые копируются в ОЗУ перед вызовом main (). Нулевые инициализированные статические данные просто обнуляются перед main ().

Можно организовать компоновщик, чтобы найти часть или весь код в ПЗУ и заставить код запуска во время выполнения копировать его в ОЗУ таким же образом, как ненулевые статические данные, но код должны быть перемещаемыми или размещаться в ОЗУ в первую очередь, вы обычно не можете просто скопировать код, предназначенный для запуска из ПЗУ в ОЗУ, и ожидать, что он будет запущен, поскольку в нем могут быть абсолютные ссылки на адрес (если, возможно, ваша цель не имеет MMU и может переназначить адресное пространство). Размещение в ОЗУ на микроконтроллерах обычно выполняется для увеличения скорости выполнения, поскольку ОЗУ обычно быстрее, чем Флэш-память при использовании высоких тактовых частот, что приводит к меньшему количеству или нулевым состояниям ожидания. Его также можно использовать, когда код загружается во время выполнения из файловой системы, а не сохраняется в ПЗУ. Даже при загрузке в ОЗУ, если процессор имеет MMU, вероятно, что раздел кода в разделе ОЗУ будет помечен как доступный только для чтения.

3
ответ дан 6 December 2019 в 14:00
поделиться

Микроконтроллеры с гарвардской архитектурой

Многие небольшие микроконтроллеры (Microchip PIC, Atmel AVR, Intel 8051, Cypress PSoC и т.д.) имеют гарвардскую архитектуру. Они могут выполнять код только из памяти программ (флэш-памяти или ПЗУ). Можно скопировать любой байт из памяти программ в оперативную память. Однако (2) копирование исполняемых инструкций из ПЗУ в ОЗУ не является решением проблемы - в этих маленьких микроконтроллерах программный счетчик всегда ссылается на какой-то адрес в памяти программ. Невозможно выполнить код в ОЗУ.

Копирование данных из ПЗУ в ОЗУ - довольно распространенное явление. При первой подаче питания типичное микропрограммное приложение обнуляет всю оперативную память, а затем копирует начальные значения неконстантных глобальных и статических переменных из ПЗУ в оперативную память непосредственно перед запуском main(). Всякий раз, когда приложению нужно вывести фиксированную строку через последовательный порт, оно считывает эту строку из ПЗУ.

В ранних версиях этих микроконтроллеров внешний "программатор устройств", подключенный к микроконтроллеру, - единственный способ изменить программу. В нормальном режиме работы устройство нигде не было близко к "программатору устройств". Если программе, работающей на микроконтроллере, требовалось записать в ПЗУ память программ -- извините, очень жаль... это было невозможно. Многие встроенные системы имели энергонезависимую память EEPROM, в которую можно было записывать код - но это было только для хранения значений данных. Микроконтроллер мог выполнять код только в программном ПЗУ, но не в EEPROM или RAM. Люди сделали множество замечательных вещей с этими микроконтроллерами, включая интерпретаторы BASIC и интерпретаторы байткода Forth. Так что, по-видимому, (1) коду никогда не нужно записываться в память программы.

В некоторых последних "самопрограммирующихся" микроконтроллерах (от Atmel, Microchip, Cypress и др.), на микросхеме имеется специальное оборудование, которое позволяет программному обеспечению, работающему на микроконтроллере, стирать и перепрограммировать блоки собственной флэш-памяти программ. Некоторые приложения используют эту функцию "самопрограммирования" для чтения и записи данных в "дополнительные" блоки флэш-памяти - данные, которые никогда не выполняются, поэтому они не считаются самомодифицирующимся кодом - но это не делает ничего такого, чего нельзя было бы сделать с большим EEPROM. До сих пор я видел только два вида программ, работающих на микроконтроллерах с гарвардской архитектурой, которые записывают новые исполняемые программы в свою собственную программную флэш-память: загрузчики и компиляторы Форта.

Когда запускается загрузчик Arduino (bootstrap loader) и обнаруживает, что доступен новый образ прошивки приложения, он загружает новую прошивку приложения (в оперативную память) и записывает ее во Flash. В следующий раз, когда вы включите систему, она будет работать с новой блестящей прошивкой версии 16.98, а не со старой неуклюжей прошивкой версии 16.97. (Блоки Flash, содержащие сам загрузчик, конечно, остаются неизменными). Это было бы невозможно без функции "самопрограммирования" - записи в память программ.

Некоторые реализации Forth работают на небольшом микроконтроллере, компилируя новый исполняемый код и используя функцию "самопрограммирования" для сохранения его в программной Flash-памяти - процесс, несколько похожий на компиляцию "точно в срок" в JVM. (Все другие языки, похоже, требуют компилятора, слишком большого и сложного для работы на маленьком микроконтроллере, и поэтому цикл редактирования-компиляции-загрузки-выполнения занимает гораздо больше времени).

1
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: