Как программа загружается в ПЗУ? - PullRequest
1 голос
/ 18 января 2012

Когда вы запускаете программу в Windows, она загружается в память компьютера, организованную как:

  • Сегмент данных
  • Стек
  • Сегмент кода

Сегмент данных может содержать данные, которые предназначены только для чтения или имеют права на чтение и запись.

Например:

char *c = "Hello World";

Строка Hello World называется сохраненной втолько для чтения раздел памяти.Хранится ли он в физической памяти, которую иногда называют ОЗУ, или он хранится в ПЗУ, которое доступно только для чтения?Как это может быть написано, если это только для чтения?

Ответы [ 6 ]

2 голосов
/ 19 января 2012

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

Простые встроенные приложения помещают исполняемые и доступные только для чтения разделы данных во Flash и выполняются из Flash.Переменные для чтения / записи помещаются в ОЗУ.Давайте рассмотрим эту модель для вашего примера фрагмента кода:

  char * c = "Hello World!";

В приведенном выше операторе переменная c находится в ОЗУ, поскольку по умолчанию для переменных задан доступ на чтение и запись.Если вы указали, что переменная является константой, она будет жить в ПЗУ {На самом деле она будет представлять местоположение в ПЗУ.}: Введите здесь код

char * const c = "Hello World!"; // A constant pointer that lives in ROM.

Компилятор немного обрабатывает текст "Hello World!"более сложный.Фактический текст находится в ПЗУ, либо в исполняемой области, либо в области данных;зависит от переводчика.Многие компиляторы выделяют память в ОЗУ и копируют литерал в ОЗУ, а переменная c указывает на копию в ОЗУ.Это потому, что литерал не был указан как константа.

Чтобы избежать копирования литерала в ОЗУ, объявите переменную, указывающую на постоянные данные:

const char * c = "Hello World"; // A pointer to constant data.

Приведенное выше определение все еще позволяет указателю указывать на разные вещи во время выполнения.Если вы хотите сослаться на один экземпляр текстового литерала во всей программе, объявите постоянный указатель на постоянные данные:

const * char * const c = "Hello World!"; // A constant pointer to constant data

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

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

2 голосов
/ 19 января 2012

ПК имеет только одну область памяти, которая действительно называется ПЗУ, и именно там хранится BIOS.Все Windows и программы, загруженные в Windows, будут в ОЗУ.

Управление памятью процессора x86 может помечать блоки памяти как доступные только для чтения, но компоновщик и ОС должны работать вместе, чтобы включить это.Это происходит после загрузки программы в память.

2 голосов
/ 18 января 2012

Хранится в оперативной памяти.Операционная система в сотрудничестве с самим процессором способна защищать области памяти, поэтому любая попытка записи в них из кода пользователя вызывает исключение.

1 голос
/ 19 января 2012

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

  • На аппаратном уровне вы имеете в виду ПЗУ.Как только он записан в / создан, его физические свойства не позволяют изменять его значение.
  • На программном уровне ОС (или другой уровень выше, чем пространство программы пользователя) предотвращает сохранение значенийв оперативной памяти от изменения.

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

Примечание: Вышеприведенное объяснение является чрезвычайно упрощенным, но оно делаетдать общее представление.

1 голос
/ 18 января 2012

Он хранится в ОЗУ.

Указатели на символы, которые инициализируются строкой, как в вашем примере, доступны только для чтения.Вы можете привести константную переменную, чтобы вы могли "записать" в нее , но поведение вашей программы не будет предсказуемым.

Операционные системы защищены только для чтения в областях ОЗУ.1007 *

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

0 голосов
/ 18 января 2012

Хранится в оперативной памяти.]:>

...