I Введение (на примерах ассемблерных программ)
История вычислительной техники. Архитектура фон Неймана. Основные компоненты компьютера. Машинная команда, типы операндов, адресность ЭВМ, такт работы. Представление машинной команды, ассемблерная инструкция. Упрощенная схема выполнения инструкции (команды).
Архитектура IA-32: основные регистры, форматы команд. Выполнение простейших ассемблерных инструкций: пересылка данных и арифметические операции. Формат команды.
Ассемблер nasm. Организация ассемблерной программы, секции кода и данных.
Виртуальные машины.
Арифметические операции и регистр флагов. Условная и безусловная передача управления. Коды условий.
Проблемы организации вызова функций. Аппаратная поддержка стека. Отображение вызова функции языка Си в язык ассемблера.
II Взаимосвязь языка Си, языка ассемблера и особенностей архитектуры IA-32
Различные группы команд в архитектуре IA-32. Команды «быстрой» арифметики. Побитовые логические инструкции. Инструкции сдвига и вращения. Реализация арифметических операций над 64-разрядными целыми в архитектуре IA-32.
Связь между кодами условий и арифметическими флагами. Операции над данными типа _Bool. Условная передача данных, причины расширения набора команд. Реализация управляющих операторов языка Си, goto-форма программы.
Особенности реализации операторов цикла на языке ассемблера. Организация цикла с помощью специализированных машинных команд.
Различные способы отображения оператора switch в язык ассемблера: последовательность if-else, таблица переходов, дерево выбора.
Отображение операторов разыменования указателя и взятия адреса из языка Си в язык ассемблера. Одномерные массивы и указатели. Адресная арифметика.
Массивы: одномерные, многомерные, многоуровневые. Расположение в памяти, способы работы с отдельными элементами. Особенности работы компилятора с массивами: примеры простых оптимизаций: примеры машинно-независимой и машинно-зависимой оптимизации.
Структуры, расположение в памяти, доступ к отдельным полям. Выравнивание полей. Объединения. Битовые поля.
Соглашение о вызове функций cdecl, организация рекурсии.
Инициализация окружения Си-программы. Функции _start и main. Выравнивание фреймов в стеке. Организация вызова функций стандартной библиотеки языка Си из ассемблерного кода.
Оптимизация вызова функции и ABI: вызов функций без указателя фрейма, соглашения stdcall и fastcall. Возвращаемое значение в соглашении cdecl, возврат структур из функции в компиляторе. Функции с переменным числом параметров.
Развитие семейства процессоров x86. Ключевые отличия архитектуры x86-64 от IA-32: изменения в формате команд, модель памяти, соглашение вызова функции.
Эксплуатация ошибок. Перехват управления, выполнение произвольного кода, шелл-код. Методы защиты от эксплуатации ошибок на этапах компиляции и выполнения. Защита от эксплуатации ошибок работы с памятью на уровне архитектуры системы команд.
Поддержка динамической памяти в Си-программе. Организация динамической памяти: неявные и явные списки, граничные теги. Неявное управление динамической памятью: сборка мусора, алгоритм пометок (Mark-and-Sweep).
Представление чисел с плавающей точкой. Стандарт IEEE 754. Операции над числами с плавающей точкой. Округление чисел.
Сопроцессор FPU x87. Аппаратный стек регистров. Распределение регистров стековой машины, число Ершова. Числа с плавающей точкой в языке Си: типы, доступ к результатам сравнения чисел, передача в качестве параметров функции, возвращаемое значение.
Векторные команды. Классификация параллельных вычислительных систем по Флинну.
III Система программирования языка Си и ее связь с архитектурой ЭВМ
Система программирования языка Си. Программные инструменты, используемые при разработке Си-программ. Схема работы ассемблера. Статическая компоновка программы. Схема работы компоновщика: разрешение символов и перемещение кода. Типы объектных файлов (модулей). Формат ELF . Статические библиотеки.
Обработка компоновщиком нескольких символов с одинаковыми именами: сильные и слабые символы. Загрузка исполняемого файла в память.
Динамическая компоновка. Позиционно независимый код. Динамические и разделяемые библиотеки, особенности организации и загрузки.
IV Архитектура ЭВМ
Организация аппаратного обеспечения компьютера. Логические вентили.
Разновидности полупроводниковых устройств: процессоры общего назначения и контроллеры, FPGA, ASIC. Средства разработки чипов и технологические процессы.
Эмпирические законы компьютерной техники: закон Мура, закон Гроша, закон Белла. Различные классы вычислительных устройств и предъявляемые к ним технические требования.
Устройство оперативной памяти. Статическая и динамическая память. Расслоение памяти. Энергонезависимая память.
Шины, их характеристики. Примеры шин: фронтальная шина, PCI, USB, SATA, …
Синхронизация при обращении к памяти в многоядерном компьютере, атомарные операции, захват шины данных.
Устройство НЖМД: организация, емкость, временные характеристики доступа. Организация ввода/вывода через пространство портов и через память. Опрос устройств и прерывания.
Тенденции в развитии запоминающих устройств. Твердотельные диски. Память с изменением фазового состояния. Принципиальные ограничения в развитии вычислительной техники: проблемы «стены памяти» (Memory Wall) и «стены энерговыделения» (Power Wall). Локальность в программах. Иерархическая организация памяти, кэширование.
Кэш-память: способы организации. Кэш прямого отображения. N-канальный ассоциативный кэш. Полностью ассоциативный кэш. Метрики производительности кэша. Способы оценки производительности компьютеров и программ. Аппаратные средства измерения времени. Синтетический тест: оценка производительности памяти современного компьютера.
Микроархитектура процессора. Проблемы конвейерной организации. Суперскалярная и VLIW архитектуры. CISC и RISC архитектуры. Архитектура RISC-V, ее ключевые особенности. Микрокод.
Режимы работы современного процессора архитектуры Intel64/AMD64. Начальная загрузка компьютера: BIOS, ACPI, UEFI. Многозадачная работа компьютера: требования к аппаратуре. Аппарат защиты памяти. Пользовательский и привилегированный режимы работы ЦПУ. Системные вызовы.