В какую память компьютера загружается программа пользователя для выполнения

Обновлено: 20.11.2024

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

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

Поскольку инструкции представляют собой просто наборы битов, их можно хранить в памяти. Регистр указателя инструкций всегда имеет адрес памяти (указывает на) следующей инструкции, которая должна быть выполнена. Чтобы блок управления мог выполнить эту инструкцию, она копируется в регистр инструкций.

Ситуация следующая:

Последовательность инструкций хранится в памяти.

Адрес памяти, где находится первая инструкция, копируется в программный счетчик.

ЦП отправляет адрес счетчика команд в память по адресной шине.

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

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

ЦП выполняет инструкцию в регистре инструкций.

Шаги 3, 4 и 5 называются файлом . Обратите внимание, что шаги 3–7 составляют цикл, файл . Это показано графически на рисунке 8.4.1.

Инструкция wfi («ожидание прерывания») переводит ЦП в состояние ожидания, в котором он остается до тех пор, пока устройство ввода-вывода не отправит ЦП сигнал прерывания. Мы очень кратко рассмотрим прерывания в главе 17, но подробности выходят за рамки этой книги. Пока достаточно понять, что инструкция wfi останавливает цикл выполнения программы.

На самом деле ARM получает две инструкции одновременно. Но это деталь реализации, помогающая ускорить выполнение программы. Логический поток программы соответствует циклу выполнения инструкции, показанному на рис. 8.4.1.

В связи с этим возникает несколько вопросов:

Как поместить инструкции в память? Инструкции для программы хранятся в файле на запоминающем устройстве; например, диск, память устройства или SD-карта. Компьютерная система управляется операционной системой. Когда вы указываете операционной системе, что хотите выполнить программу, например, нажимая ее значок на сенсорном экране, операционная система находит область памяти, достаточно большую для хранения инструкций в программе, и затем копирует их из файл в память. Содержимое файла остается неизменным.

An используется для создания .

Исходный файл написан на языке программирования, например C++. Это очень похоже на создание файла с помощью текстового процессора. Основное отличие состоит в том, что редактор основан на простых символах, а текстовый процессор форматирует текст. Вы видите все символы, которые вы вводите в редакторе, но текстовый процессор включает в себя множество скрытых кодов форматирования, которые определяют такие вещи, как абзацы, полужирный шрифт и т. д.

А или используется для создания .

Компилятор или ассемблер переводит язык программирования в исходном файле в битовые шаблоны, которые может использовать ЦП (машинный язык). Содержимое исходного файла остается неизменным.

A используется для создания .

Большинство программ состоят из нескольких объектных файлов. Например, установка GNU/Linux включает множество объектных файлов, содержащих машинные инструкции для выполнения общих задач. Это уже написанные и скомпилированные программы. Связанные задачи обычно группируются в один файл, называемый библиотекой.

Везде, где это возможно, вы должны использовать короткие программы из этих библиотек для выполнения вычислений, необходимых вашей программе, а не писать ее самостоятельно. Программа компоновщика объединит машинный код из этих нескольких объектных файлов в один исполняемый файл.

Возможно, вы использовали интегрированную среду разработки (IDE), например Microsoft Visual Studio® или Eclipse™, которая объединяет все эти три программы в один пакет, где каждый из промежуточных шагов выполняется автоматически. Вы используете программу-редактор для создания исходного файла, а затем даете команду запуска в IDE. IDE скомпилирует программу в ваши исходные файлы, свяжет полученные объектные файлы с необходимыми библиотеками, загрузит полученный исполняемый файл в память, затем запустит вашу программу.Как правило, промежуточные объектные файлы, полученные в результате компиляции каждого исходного файла, автоматически удаляются с диска.

В этой книге мы будем явно выполнять каждый из этих шагов отдельно, чтобы мы могли изучить роль каждой программы — редактора, ассемблера, компоновщика — используемой при подготовке прикладной программы.

Хотя технически память — это любая форма электронного хранилища, чаще всего она используется для идентификации быстрых временных форм хранения. Если бы центральный процессор вашего компьютера должен был постоянно обращаться к жесткому диску для извлечения всех необходимых ему данных, он работал бы очень медленно. Когда информация хранится в памяти, ЦП может получить к ней гораздо более быстрый доступ. Большинство форм памяти предназначены для временного хранения данных.

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

Все компоненты вашего компьютера, такие как ЦП, жесткий диск и операционная система, работают вместе как одна команда, и память является одной из наиболее важных частей этой команды. С момента включения компьютера до момента его выключения ваш ЦП постоянно использует память. Давайте рассмотрим типичный сценарий:

  • Вы включаете компьютер.
  • Компьютер загружает данные из постоянной памяти (ПЗУ) и выполняет самотестирование при включении питания (POST), чтобы убедиться, что все основные компоненты работают правильно. В рамках этого теста контроллер памяти проверяет все адреса памяти с помощью операции быстрого чтения/записи, чтобы убедиться в отсутствии ошибок в микросхемах памяти. Чтение/запись означает, что данные записываются в бит, а затем считываются из этого бита.
  • Компьютер загружает базовую систему ввода-вывода (BIOS) из ПЗУ. BIOS предоставляет самую основную информацию об устройствах хранения, последовательности загрузки, безопасности, функции Plug and Play (автоматическое распознавание устройств) и некоторых других элементах.
  • Компьютер загружает операционную систему (ОС) с жесткого диска в оперативную память системы. Как правило, критически важные части операционной системы хранятся в оперативной памяти, пока компьютер включен. Это позволяет ЦП иметь немедленный доступ к операционной системе, что повышает производительность и функциональность всей системы.
  • Когда вы открываете приложение, оно загружается в ОЗУ. Для экономии использования оперативной памяти многие приложения сначала загружают только основные части программы, а затем загружают другие части по мере необходимости.
  • После загрузки приложения все файлы, открытые для использования в этом приложении, загружаются в ОЗУ.
  • Когда вы сохраняете файл и закрываете приложение, файл записывается на указанное устройство хранения, а затем он и приложение удаляются из ОЗУ.

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

Один распространенный вопрос о настольных компьютерах, который возникает все время, звучит так: "Зачем компьютеру нужно так много систем памяти?"

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

  • Сегмент данных
  • Стопка
  • Кодовый сегмент

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

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

Будьте осторожны с использованием терминологии. ПЗУ — это физическая память, которая может хранить данные или программный код, но не может быть записана. Сегменты только для чтения — это участки памяти, в которых MMU настроен на предотвращение записи.

6 ответов 6

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

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

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

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

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

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

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

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

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

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

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

Загрузка операционной системы

Когда пользователь запускает программу, операционная система (ОС) сначала переносит биты программного обеспечения программы с ее постоянного места (жесткий диск, компакт-диск и т. д.) в основную память компьютера. ЦП не может выполнять программу непосредственно с жесткого диска, потому что диск слишком медленный, чтобы не отставать от ЦП. Основная память достаточно быстра (с добавлением кеша), чтобы не отставать от процессора. Таким образом, ОС сначала находит нужную программу на жестком диске, загружает биты программы в оперативную память, а затем начинает скармливать процессору биты из оперативной памяти.

Этот процесс загрузки отлично подходит для прикладных программ, но как загружается сама ОС? При первом включении компьютера основная память не содержит допустимых битов. Сама операционная система должна быть загружена с жесткого диска в основную память. Это похоже на уловку-22! Решение — последовательная последовательность все больших и больших программ загрузки, которые загружают ОС.

Программа запуска

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

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

Загрузочная программа

Биты из загрузочного сектора жесткого диска образуют большую программу, содержащую достаточно инструкций для загрузки остальной части операционной системы. Как только крошечная стартовая программа, описанная выше, загрузится в загрузочный сектор, она немедленно переведет ЦП на эту новую программу. Программа загрузки обычно специфична для операционной системы, поскольку она запускает определенную операционную систему, хотя некоторые операционные системы предоставляют программу загрузки, называемую «загрузчиком», которая позволяет пользователю выбирать из ряда операционных систем, доступных на жестком диске компьютера. водить машину. Примером загрузчика является программа LILO, доступная в операционной системе Linux.

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

Читайте также: