I Введение (на примерах ассемблерных программ)
История вычислительной техники. Архитектура фон Неймана. Основные компоненты компьютера. Машинная команда, типы операндов, адресность ЭВМ, такт работы. Упрощенная схема выполнения инструкции.
Упрощенная схема компиляции Си-программы в окружении компилятор gcc, операционная система Linux, архитектура IA32.
Архитектура IA32: основные регистры, форматы команд. Представление машинной команды, ассемблерная инструкция. Декодирование и дизассемблирование.
Организация ассемблерной программы, секции кода и данных. Пример ассемблерной программы: пересылка данных, арифметические операции, регистр флагов.
Передача управления. Пример ассемблерной программы: условные и безусловные переходы.
Проблемы организации вызова функций. Аппаратная поддержка стека. Пример ассемблерной программы: отображение вызова функции языка Си в язык ассемблера.
II Взаимосвязь языка Си, языка ассемблера и особенностей архитектуры IA32
Отображение операторов разыменования указателя и взятия адреса из языка Си в язык ассемблера. Размещение различных типов переменных языка Си в памяти компьютера. Пример работы с указателями.
Реализация арифметических операций над 64-разрядными целыми в архитектуре IA32. Знаковое и беззнаковое умножение в языке Си и языке ассемблера. Обоснование реализации умножения 64-разрядных знаковых целых чисел на 32-разрядных регистрах.
Условная передача данных: goto-форма представления ветвлений и циклов. Отображение операторов цикла языка Си в язык ассемблера. Организация цикла с помощью инструкции LOOP.
Различные способы отображения оператора switch в язык ассемблера: последовательность if-else, таблица переходов, дерево выбора.
Массивы: одномерные, многомерные, многоуровневые. Расположение в памяти, способы работы с отдельными элементами. Особенности работы компилятора с массивами: примеры простых оптимизаций: примеры машинно-независимой и машинно-зависимой оптимизации.
Организация работы со структурами и объединениями языка Си на уровне языка ассемблера. Доступ к полям. Выравнивание данных. Побитовые логические инструкции. Инструкции сдвига и вращения. Битовые поля структур.
Соглашение о вызове функций cdecl. Распределение памяти во фрейме функции. Организация рекурсии. Возвращаемое значение в соглашении cdecl, возврат структур из функции в компиляторе gcc. Выравнивание фреймов в стеке. Организация вызова функций стандартной библиотеки языка Си из ассемблерного кода. Ассемблерные вставки в Си-программах. Ускорение вызова функций и возврата из них: реализация вызова функций без указателя фрейма, соглашение fastcall. Функции с переменным числом параметров. Вызов функции по указателю. Обратный вызов.
Формат инструкций архитектуры IA32. Префиксы: модификаторы размера операнда и адреса, префиксы повтора. Реализация операций над строками.
Представление чисел с плавающей точкой. Стандарт IEEE 754. Операции над числами с плавающей точкой. Округление чисел. Сопроцессор FPU x87. Аппаратный стек регистров. Обратная польская запись. Числа с плавающей точкой в языке Си: типы, доступ к результатам сравнения чисел, передача в качестве параметров функции, возвращаемое значение.
III Архитектура ЭВМ
Организация аппаратного обеспечения компьютера. Логические вентили. Закон Мура. Закон Гроша.
Устройство оперативной памяти. Статическая и динамическая память. Расслоение памяти.
Организация ввода/вывода. Шины, их характеристики, примеры шин: фронтальная шина, PCI, USB, SATA …
Пример периферийного устройства: НЖМД. Устройство, организация доступа к хранимой информации, емкость, временные характеристики доступа. Организация ввода/вывода через пространство портов и через память. Прямой доступ к памяти периферийных устройств. Твердотельные диски.
Тенденции в развитии запоминающих устройств. Локальность в программах. Иерархическая организация памяти, кэширование. Кэш-память процессора, способы ее организации: кэш прямого отображения, N-канальный ассоциативный кэш. Метрики производительности кэша.
Способы оценки производительности компьютеров и программ. Аппаратные средства измерения времени. Синтетический тест: оценка производительности памяти современного компьютера.
Конвейерная обработка команд. Приостановка и опустошение конвейера. Суперскалярная архитектура. CISC и RISC архитектуры. ARM как пример RISC архитектуры.
История развития архитектуры x86. Обратная совместимость процессоров (на примере линии A20).
Многозадачная работа компьютера: требования к аппаратуре, работа с памятью в защищенном режиме. Прерывания: программные, аппаратные, исключения. Сегментная и страничная организация памяти. Логические, линейные и физические адреса памяти. Режимы работы современного процессора архитектуры Intel64/AMD64: реальный, защищенный, «длинный», режим совместимости, режим системного управления. Процесс загрузки компьютера.
IV Система программирования языка Си и ее связь с архитектурой ЭВМ
Компиляция и интерпретация. Система программирования языка Си. Программные инструменты, используемые при разработке Си-программ. Схема работы ассемблера. Статическая компоновка программы. Схема работы компоновщика: разрешение символов и перемещение кода. Типы объектных файлов (модулей). Формат ELF.
Обработка компоновщиком нескольких символов с одинаковыми именами: сильные и слабые символы. Организация многомодульной программы, роль заголовочных файлов. Автоматизация сборки многомодульной программы: утилита make.
Статические библиотеки. Компоновка со статическими библиотеками. Загрузка исполняемого файла в память. Динамические библиотеки и динамическая компоновка. Перехват вызовов функций. Позиционно независимый код.