Что происходит со всем компьютером, когда вы запускаете код?
Во-первых, давайте возьмем программу на языке C в качестве примера.
Первый шаг запуска кода C/C++:
-
Скомпилировать, оптимизировать (.c->.s, .asm)
Когда программа C/C++ выбрана для запуска, программа будет скомпилирована и оптимизирована после предварительной обработки.
компилироватьПроцесс проектирования соответствующих знаний принципов компиляции, лексического анализа, синтаксического анализа, семантического анализа, генерации промежуточного кода, оптимизации кода. Преобразует язык высокого уровня в эквивалентный промежуточный код и последний код ассемблера.
оптимизацияЕсли да, то это в основном оптимизация промежуточного кода, а также некоторые оптимизации, связанные с аппаратной структурой машины, например, как в полной мере использовать регистры машины и количество обращений к памяти для улучшения оперативность исполнения и др.
-
Сборка (.s, .asm->.obj, .o, .a, .ko)
Процесс сборки — это процесс перевода кода на языке ассемблера в целевые машинные инструкции, и после сборки получается соответствующий целевой код (набор машинных инструкций). Объектные файлы состоят из сегментов. Обычно в объектном файле есть как минимум два раздела:
-
Сегмент кода: этот сегмент содержит в основном программные инструкции. Этот сегмент обычно доступен для чтения и выполнения, но обычно недоступен для записи.
-
Сегмент данных: в основном хранит различные глобальные переменные или статические данные, используемые в программе. Общие сегменты данных доступны для чтения, записи и выполнения.
-
-
ссылка (.obj, .o, .a, .ko->.exe, .elf, .axf)
Объектный файл, сгенерированный ассемблером, не может быть выполнен немедленно.Возможно, функция в исходном коде применяет функцию в другом файле кода и т. д., поэтому его необходимо слинковать.Основная работа компоновщика заключается в связывании связанных Связывание, то есть соединение символа, указанного в одном файле, с определением символа в другом файле, так что все эти объектные файлы становятся единым целым, которое может быть загружено и выполнено операционной системой, что есть исполняемая программа.
Что делает операционная система?
Затем, если вы хотите запустить исполняемую программу (которая была скомпилирована и связана)
-
До первого запуска файл лежал на диске, а на данный момент он просто сохранился на диске в виде набора бинарных файлов.
Программа может работать только в том случае, если она входит в память, но для входа в память она должна подчиняться планированию процессов ОС.В это время задействована операционная система.Управление процессомТеперь (подробности см. в расписании процесса os)
Затем, поскольку память настолько велика, невозможно напрямую выделить память для каждой программы.В это время используется операционная система.управление памятьюбудут использоваться связанные методы, такие как виртуальная память и т. д., и виртуальная память, каждый процесс имеет независимое логическое адресное пространство, а память разделена на несколько блоков одинакового размера, называемыхСтраница(Страница) Каждая страница представляет собой непрерывный адрес. Для процесса логически кажется много места в памяти, среди которыхЧасть соответствует блоку в физической памяти (называется страничным фреймом, обычно страница и страничный фрейм имеют одинаковый размер)., и некоторые аналоги, которые не загружаются в память на диск.
-
Затем операционная система запрограммируетнагрузка, то есть для создания структуры процесса у него будет свой набор виртуальных адресов, таблиц страниц и других структур.
Но загрузчик не загружает код в физическую память, а использует таблицу страниц для записи местоположения кода на жестком диске, и загружает его в память только тогда, когда он действительно работает.
Наконец, загрузчик найдет адрес входа программы и при выполнении прочитает первую инструкцию по адресу входа.
-
готов к запуску
Хотя программа все еще находится на жестком диске, операционная система установила процесс, который имеет собственный набор высокоуровневых структур данных, таких как виртуальные адреса и таблицы страниц.
Операционная система планирует процесс, и когда наступает очередь процесса, он начинает выполнение с точки входа, возвращенной загрузчиком.
ЦП извлекает инструкции из записи программы, но это виртуальный адрес, который необходимо преобразовать в физический адрес. Итак, как его преобразовать? ЦП проверит таблицу страниц, но эта таблица страниц по-прежнему указывает на адрес на жестком диске, поэтому ЦП выполнит обработчик прерывания ошибки страницы.
Наконец, ЦП загрузит код с жесткого диска в память, а затем, конечно же, ЦП должен изменить таблицу страниц, чтобы отразить, что данные поступили в память.
-
ЦП будет непрерывно читать и записывать данные.Когда наступит квант времени, процесс будет приостановлен, что означает, что процесс на самом деле не монополизирует ЦП, а потому, что процесс переключается очень быстро.С человеческой точки зрения, это предполагается, что программа выполняется одновременно с Same. В конце процесса данные в памяти будут очищены и перезаписаны.
Почему операционная система делает это?
Почему операционная система беспокоится о отображении памяти и виртуальной памяти? Это не потому, что ресурсы ограничены, память так велика и существует так много программ. Чтобы заставить больше программ работать и эффективно использовать память и ЦП, используйте только этот метод.
Что делает аппаратная система?
Возьмем в качестве примера компьютерную архитектуру фон Неймана:
- Калькулятор: выполнять арифметические и логические операции
- Память: хранить данные и программы
- Контроллер: управляющая программа, данные, результаты обработки операций
- Устройство ввода: переводит инструкции на машинный язык, понятный машине.
- Устройство вывода: преобразует инструкции в удобочитаемый контент.
И архитектура нашего современного компьютера: память, арифметическая логика (калькулятор), блок управления (контроллер) и конечно устройства ввода-вывода.
Возьмите кусок машинного языка в качестве примера: ax^2+bx+c процесс выполнения программы (программный код стал машинным языком)
- Программа отправляется на компьютер устройством ввода-вывода
- ПК+1, получить первый адрес программы
- программа запускается
- Инструкция выборки: ПК->MAR->банк памяти->MDR->IR (регистр инструкций)
- Инструкция анализа: извлеките код операции из регистра инструкций, отправьте его в блок управления CU для анализа и получите значение инструкции.
- Выполнить инструкцию: вынуть адресный код в IR -> MAR -> банк памяти -> MDR -> ACC
- ПК+1=ПК, получить новый адрес
- Инструкция выборки: ПК->MAR->банк памяти->MDR->IR (регистр инструкций)
- Инструкция анализа: извлеките код операции из регистра инструкций, отправьте его в блок управления CU для анализа и получите значение инструкции.
- Выполнить инструкцию: вынуть адресный код в IR -> MAR -> банк памяти -> MDR -> X
... конечный результат программа завершена