Введение в тему 0:00 Обсуждение системы команд Intel и языка ассемблера. Напоминание о практических заданиях с недописанной операционной системой.
Задания и автоматизация 0:20 Задание: собрать и запустить недописанную операционную систему. Автоматизация заданий с помощью Stepic. Ссылка на задания будет опубликована на GitHub и вики-странице.
Роль ассемблера 1:31 Ассемблер не является основным языком, но понимание его команд полезно. Примеры использования ассемблера: переход в защищённый режим.
Архитектура Intel 1:55 Сравнение архитектуры Intel с операционной системой. Объяснение различий между архитектурой фон Неймана и гарвардской архитектурой. Описание работы процессора: выбор команды из памяти, декодирование, выполнение вычислений, загрузка результата в память.
Оптимизация и кэш 5:03 Важность кэша для ускорения работы процессора. Механизм загрузки кэша и его эффективность. Проблемы с кэшем при плохо оптимизированных программах.
Многоуровневый кэш 6:03 Введение трехуровневого кэша. Тиринг: многоуровневая организация доступа к памяти. Различные типы памяти: оперативная, виртуальная, дисковая, удалённая.
Многоядерные процессоры 7:25 Организация кэша и памяти вокруг нескольких ядер. Неравномерный доступ к кэшу между ядрами. Роль компиляторов в учёте особенностей кэша.
Архитектура Core 8:21 После Pentium появилась архитектура Core, которая стала настолько сложной, что предсказать исполнение команд стало невозможно. Процессор стал включать блок, который «заглядывает вперёд», частично декодируя команды из памяти и кэша. Разные части процессора выполняют различные типы операций, связанные с разными наборами инструкций.
Организация процессора 10:15 Процессор имеет структуру, похожую на операционную систему: поток команд, исполнительные узлы, диспетчеризация и тайминг памяти. Внутри процессора с набором команд CISC находится RISC-процессор с микрокодом для диспетчеризации сложных инструкций.
Пример с жёсткими дисками 12:11 Жёсткие диски имеют контроллер, который переупорядочивает запросы на чтение, чтобы оптимизировать работу устройства. Оптимизация на уровне операционной системы неэффективна, так как она не знает физической природы диска. Аналогично, интерфейс процессора гарантирует атомарное исполнение команд, но внутреннее исполнение остаётся скрытым.
Определение архитектуры 15:08 Архитектура включает набор типов данных, команд и регистров процессора. В архитектуре x86 регистры имеют иерархию: от восьмиразрядных до тридцатидвухразрядных. Регистры делятся на общие, связанные с адресацией и специальные, например, регистр флагов.
Порядок байт в Intel 21:06 В Intel используется обратный порядок байт: младший байт находится в начале адреса. При работе с числами в памяти важно учитывать этот порядок. При копировании чисел в регистры порядок байт сохраняется, что важно для корректной работы с данными.
Указатели и их классы 22:46 Указатели делятся на ближние и дальние. Ближний указатель размером в слово обозначает смещение от известной базы. Смещение может быть положительным, отрицательным или нулевым.
Работа в реальном режиме 23:33 В реальном режиме адресное пространство линейное и совпадает с физической памятью. Адреса растут сверху вниз. Для ближних указателей база может быть любой, например, ноль.
Арифметика указателей 24:31 Пример: `*p = &x` означает, что `x` находится в том же сегменте, что и `p`. Указатели хранят смещения от базы. Пример с `pp = &p` иллюстрирует арифметику указателей.
Фар-указатели 27:10 Фар-указатели состоят из двух половинок, хранящихся в разных регистрах. Регистр данных DS хранит адрес начала сегмента, сдвинутый влево и умноженный на 16. Реальный адрес вычисляется путём добавления смещения к адресу начала сегмента.
Сегменты памяти 29:03 Обычно программа имеет минимум три сегмента: данных, кода и стека. Аппаратная архитектура не требует разделения сегментов, но это желательно для оптимизации. В DOS были стратегии линковки, при которых все сегменты указывали на одно и то же место в памяти.
Проблемы с адресами 31:47 Адреса переменных и функций могут совпадать из-за одинаковых смещений, но разных сегментов. Это может привести к ошибкам при работе с адресами. Идея разделения кода и данных считается здравой.
Защищённый режим и сегменты памяти 33:15 В защищённом режиме память разделена на сегменты с разными уровнями привилегий. Сегменты имеют конкретные границы и атрибуты, такие как уровень привилегий.
Физическое и логическое адресные пространства 33:59 Физическое адресное пространство соответствует реальной памяти компьютера. Логическое адресное пространство используется программами для работы с виртуальными адресами.
Роль операционной системы 34:35 Операционная система создаёт иллюзию полноправного владения компьютером для каждого процесса. Это позволяет одновременно выполнять множество процессов.
Селектор и сегментация памяти 35:23 Селектор содержит информацию о начале и конце сегмента в физической памяти. Сегменты могут быть разного размера и иметь атрибуты, такие как уровень привилегий.
Виртуальная память и пейджинг 41:57 Виртуальная память основана на страничной организации памяти пейджинге. Операционная система управляет выделением памяти, используя дополнительную память на диске.
Взаимодействие указателей и страниц 43:24 Указатели в программе не связаны с физическими страницами памяти. Один и тот же указатель может обращаться к разным физическим страницам в течение жизни программы.
Структура виртуального адреса 45:22 Виртуальный адрес состоит из смещения внутри страницы, номера страницы в каталоге страниц и других полей. Операционная система определяет реальное расположение страницы в памяти или на диске.
Роль операционной системы в управлении памятью 47:19 Операционная система отвечает за таблицы трансляции адресов и управление памятью. Процессы используют виртуальные адреса, но реальное расположение данных определяется ОС.
Переход в защищённый режим 47:38 Процессор переходит из реального режима в защищённый после загрузки операционной системы. Загрузчик создаёт глобальную таблицу дескрипторов GDT и загружает регистр GDTR. После переключения в защищённый режим операционная система использует только GDT для доступа к памяти.
Создание процесса и его память 49:26 Операционная система создаёт локальную таблицу дескрипторов для каждого процесса. Контекст процесса инициализируется с указанием на записи в его таблице дескрипторов. Процесс имеет доступ только к памяти, указанной в его таблице дескрипторов.
Пейджинг и адресное пространство 50:37 Пейджинг позволяет процессу видеть больше памяти, чем доступно физически. Адресное пространство процесса определяется набором его мемори-дескрипторов в таблицах LDT и GDT. Страницы внутри адресного пространства мапятся на физическую память.
Ограничения доступа к памяти 52:41 Процесс может читать, но не записывать в сегменты GDT и LDT. Для изменения мемори-лоя процесса необходимо взаимодействие с операционной системой. Выделение памяти возможно через специальные операции, например, BRK.
Синтаксис ассемблера 54:15 Существуют два типа синтаксиса: Intel и другой, который используется по умолчанию в GCC. Ассемблер переводит текст в машинные коды, используя регистры общего назначения и регистры флагов. Команды ассемблера начинаются с точки и не известны процессору.
Ограничения архитектуры Intel 57:30 Архитектура Intel не позволяет обращаться к памяти дважды в одной команде из-за ограничений шины памяти. Секции исполняемого файла в Linux: текст — код, дейта — данные.
Отладка с GCC 58:28 GCC поддерживает флажки для отладки, включая максимальный уровень отладочной информации и минимальный уровень оптимизации. Для корректной работы отладчика в GDB необходимо использовать ключи -g3 и -O0.