Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| reverseenengineering:память [2025/06/23 23:55] – создано Lex | reverseenengineering:память [2025/07/17 02:20] (текущий) – [12. Заключение] Lex | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== Память ====== | + | ====== |
| + | |||
| + | ===== Введение ===== | ||
| + | Центральный процессор (ЦП) выполняет команды, | ||
| + | |||
| + | Понимание того, как устроена память на уровне процессора, | ||
| + | * Оптимизации кода и производительности | ||
| + | * Реверс-инжиниринга и анализа уязвимостей | ||
| + | * Проектирования программ под низкоуровневые архитектуры | ||
| + | |||
| + | ===== Общая модель памяти ===== | ||
| + | |||
| + | С точки зрения ЦП, память можно разделить на следующие уровни: | ||
| + | |||
| + | * **Регистры** — самая быстрая и ближайшая память к ядру процессора | ||
| + | * **Кэш-память** (Cache): L1, L2, L3 | ||
| + | * **Оперативная память (RAM)** — основное хранилище данных | ||
| + | * **Внешняя память (диск, SSD)** — долговременное хранилище | ||
| + | |||
| + | Каждый уровень иерархии работает быстрее, | ||
| + | |||
| + | ===== 1. Регистры ===== | ||
| + | |||
| + | ^ Регистр ^ Назначение ^ | ||
| + | | `EAX`, `RAX` | аккумулятор (результаты вычислений) | | ||
| + | | `EBX`, `RBX` | база (часто используется в указателях) | | ||
| + | | `ECX`, `RCX` | счётчик (используется в циклах, | ||
| + | | `EDX`, `RDX` | данные (вторичные значения) | | ||
| + | | `ESI`, `RSI`, `EDI`, `RDI` | источники и приёмники для операций | | ||
| + | | `ESP`, `RSP` | указатель стека | | ||
| + | | `EBP`, `RBP` | базовый указатель стека | | ||
| + | | `RIP` | указатель команд (только в x64) | | ||
| + | | Флаги (`EFLAGS`, `RFLAGS`) | хранят флаги результата: | ||
| + | |||
| + | **Регистры — это микросхемы внутри самого ядра ЦП**, они обеспечивают мгновенный доступ к данным. | ||
| + | |||
| + | ===== 2. Кэш-память ===== | ||
| + | |||
| + | Кэш — это быстрая SRAM-память, | ||
| + | |||
| + | ^ Уровень ^ Расположение ^ Примерный размер ^ Задержка (циклы ЦП) ^ | ||
| + | | L1 | Внутри ядра | 32–128 КБ | 3–4 | | ||
| + | | L2 | Внутри/ | ||
| + | | L3 | Общая на несколько ядер | 2–64 МБ | 30–60 | | ||
| + | |||
| + | ==== Политика кэширования ==== | ||
| + | * **Write-back** — запись в кэш, RAM обновляется позже | ||
| + | * **Write-through** — запись сразу и в кэш, и в RAM | ||
| + | * **Cache line** — минимальная единица данных (обычно 64 байта) | ||
| + | |||
| + | ==== Ассоциативность кэша ==== | ||
| + | * **Direct-mapped** — каждая строка памяти попадает в один слот | ||
| + | * **Set-associative** — строки могут размещаться в любом из N слотов | ||
| + | * **Fully-associative** — строки могут размещаться где угодно | ||
| + | |||
| + | ===== 3. Оперативная память (RAM) ===== | ||
| + | |||
| + | RAM (DRAM) используется как основное рабочее пространство программ. | ||
| + | |||
| + | ==== Основные характеристики: | ||
| + | * **Адресуемость**: | ||
| + | * **Время доступа**: | ||
| + | * **Скорость передачи**: | ||
| + | |||
| + | ==== Виртуальная память ==== | ||
| + | ОС предоставляет каждой программе собственное **виртуальное адресное пространство**, | ||
| + | |||
| + | ^ Компонент ^ Описание ^ | ||
| + | | Page (страница) | Блок виртуальной памяти, | ||
| + | | Page Table | Таблица соответствий виртуальных и физических страниц | | ||
| + | | TLB (Translation Lookaside Buffer) | Кэш отображений виртуальных адресов в физические | | ||
| + | |||
| + | ==== Сегментация и страничная организация ==== | ||
| + | * **Сегментация** — логическая разбивка памяти на сегменты (использовалась в x86) | ||
| + | * **Страничная организация** — основа MMU (Memory Management Unit) в современных системах | ||
| + | |||
| + | ===== 4. Внешняя память ===== | ||
| + | |||
| + | Если данных слишком много для RAM, ОС может использовать **файл подкачки** или **pagefile**, | ||
| + | |||
| + | ^ Тип ^ Назначение ^ | ||
| + | | Swap/ | ||
| + | | MMAP файлов | Отображение файла в память | | ||
| + | | Memory-mapped I/O | Обмен данными с периферией через память | | ||
| + | |||
| + | ===== 5. Доступ к памяти ===== | ||
| + | |||
| + | ==== Адресация ==== | ||
| + | * **Линейная**: | ||
| + | * **Сегментированная**: | ||
| + | * **Физическая**: | ||
| + | |||
| + | ==== Типы доступа: | ||
| + | * **Чтение (read)** — перенос данных из памяти в регистр | ||
| + | * **Запись (write)** — перенос из регистра в память | ||
| + | * **Исполнение (execute)** — чтение инструкций из памяти | ||
| + | |||
| + | ===== 6. Работа с памятью в ассемблере ===== | ||
| + | |||
| + | ==== Пример ==== | ||
| + | |||
| + | < | ||
| + | mov eax, [ebp+8] | ||
| + | mov [esp+4], eax ; запись в стек | ||
| + | call memcpy | ||
| + | </ | ||
| + | |||
| + | ==== Операции ==== | ||
| + | * `mov`, `push`, `pop` — базовые операции чтения/ | ||
| + | * `lea` — получение адреса (без чтения) | ||
| + | * `stos`, `lods`, `scas` — строковые операции | ||
| + | |||
| + | ===== 7. Безопасность и память ===== | ||
| + | |||
| + | ==== Уязвимости: | ||
| + | * **Buffer Overflow** — выход за границы буфера | ||
| + | * **Use-after-free** — доступ к освобождённой памяти | ||
| + | * **Race conditions** — состояние гонки при совместном доступе | ||
| + | |||
| + | ==== Защита: | ||
| + | * **DEP / NX bit** — запрет на выполнение кода в данных | ||
| + | * **ASLR** — рандомизация адресов | ||
| + | * **Stack canaries** — защитные значения в стеке | ||
| + | * **SMEP/ | ||
| + | |||
| + | |||
| + | ===== 8. NUMA (Non-Uniform Memory Access) ===== | ||
| + | |||
| + | NUMA — это архитектура многопроцессорных систем, | ||
| + | |||
| + | ^ Характеристика ^ Описание ^ | ||
| + | | Узел NUMA (NUMA node) | Набор: ЦП + локальная память | | ||
| + | | Локальный доступ | Быстрый доступ к памяти своего узла | | ||
| + | | Удалённый доступ | Доступ к памяти другого узла через межсоединение (Interconnect) | | ||
| + | | Примеры | AMD EPYC, Intel Xeon, серверные платформы | | ||
| + | |||
| + | ==== Зачем важно: ==== | ||
| + | * Локальный доступ быстрее | ||
| + | * Неправильное распределение памяти (например, | ||
| + | * Используются **политики NUMA** (First touch, Interleaved, | ||
| + | |||
| + | ==== Отображение в Linux: ==== | ||
| + | < | ||
| + | numactl --hardware | ||
| + | </ | ||
| + | |||
| + | ==== Оптимизация ==== | ||
| + | * Использование `numactl` | ||
| + | * Привязка потоков к NUMA-узлам | ||
| + | * Разделение данных по узлам | ||
| + | |||
| + | ===== 9. Prefetching (Предзагрузка данных) ===== | ||
| + | |||
| + | Prefetching — это механизм **предугадывания** того, какие данные потребуются процессору, | ||
| + | |||
| + | ==== Типы Prefetching: | ||
| + | |||
| + | ^ Тип ^ Описание ^ | ||
| + | | Hardware prefetch | Автоматически кэширует данные при линейном доступе | | ||
| + | | Software prefetch | Используется вручную с помощью инструкций (`prefetcht0`, | ||
| + | | Stride prefetch | Улавливает шаблоны с фиксированным шагом доступа | | ||
| + | | Adjacent cache line prefetch | Загрузка соседней строки кэша вместе с основной | | ||
| + | |||
| + | ==== Пример в ассемблере: | ||
| + | < | ||
| + | prefetcht0 [esi+eax] ; загрузить строку в кэш из памяти | ||
| + | </ | ||
| + | |||
| + | ==== Роль в производительности: | ||
| + | * Уменьшает **кэш-промахи** (cache miss) | ||
| + | * Особенно полезен в **циклах**, | ||
| + | * Может ухудшать производительность, | ||
| + | |||
| + | ===== 10. Intel VT-x и память ===== | ||
| + | |||
| + | Intel VT-x — это технология виртуализации, | ||
| + | |||
| + | ==== Две стадии адресации: | ||
| + | |||
| + | ^ Этап ^ Описание ^ | ||
| + | | Guest Virtual Address (GVA) | Адрес, используемый в ВМ (например, | ||
| + | | Guest Physical Address (GPA) | Адрес внутри виртуальной машины | | ||
| + | | Host Physical Address (HPA) | Реальный адрес в памяти хоста | | ||
| + | |||
| + | ==== Extended Page Tables (EPT): ==== | ||
| + | * Позволяют гипервизору создавать **отображение GPA → HPA** | ||
| + | * Работают аналогично стандартным Page Tables | ||
| + | * **Кэшируются в TLB** и используются аппаратно | ||
| + | |||
| + | ==== Зачем важно: ==== | ||
| + | * Позволяет выполнять виртуальные ОС почти без потерь в производительности | ||
| + | * Обеспечивает изоляцию памяти между виртуальными машинами | ||
| + | * Используется в Hyper-V, KVM, VMware, VirtualBox и др. | ||
| + | |||
| + | ===== 11. MMU (Memory Management Unit) на практике ===== | ||
| + | |||
| + | MMU — аппаратный модуль, | ||
| + | |||
| + | ==== Работа на практике: | ||
| + | |||
| + | ^ Стадия ^ Действие ^ | ||
| + | | Процессор генерирует виртуальный адрес | Например, | ||
| + | | MMU ищет отображение в TLB | Если найдено — используется | | ||
| + | | Если нет — обращение к Page Table | Чтение соответствующей страницы | | ||
| + | | Проверка прав доступа | RWX-флаги, | ||
| + | | Генерация физического адреса | Передача на контроллер памяти (MC) | | ||
| + | |||
| + | ==== Компоненты: | ||
| + | |||
| + | ^ Компонент ^ Назначение ^ | ||
| + | | TLB | Кэш отображений виртуальных адресов | | ||
| + | | Page Table | Основная таблица отображений | | ||
| + | | CR3 | Регистр, | ||
| + | | PTE | Page Table Entry — описание одной страницы | | ||
| + | |||
| + | ==== Ошибки и исключения: | ||
| + | * **Page Fault (PF)** — отсутствует отображение или запрещён доступ | ||
| + | * **General Protection Fault (GPF)** — нарушение прав при доступе | ||
| + | |||
| + | ==== Связь с безопасностью: | ||
| + | * **DEP/NX** реализуется через биты в PTE | ||
| + | * **ASLR** — случайное размещение виртуальных адресов | ||
| + | * **SMEP/ | ||
| + | |||
| + | ===== 12. Заключение ===== | ||
| + | |||
| + | Память ЦП — это **многоуровневая, | ||
| + | * регистры | ||
| + | * кэш-память (L1–L3) | ||
| + | * оперативную память с виртуализацией (MMU) | ||
| + | * NUMA и оптимизацию размещения данных | ||
| + | * механизм предвыборки (prefetching) | ||
| + | * аппаратную виртуализацию адресов (Intel VT-x) | ||
| + | |||
| + | Понимание всех этих слоёв особенно важно для: | ||
| + | * написания высокопроизводительных приложений | ||
| + | * отладки и анализа кода | ||
| + | * реверс-инжиниринга и безопасности | ||
| + | |||
| + | |||
| + | |||
| + | ЦП использует сложную иерархию памяти — от регистров до кэша и RAM, включая механизмы виртуализации и защиты. Это делает возможной как высокую производительность, | ||
| + | |||
| + | |||
| + | ===== Дополнительные ресурсы ===== | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | ===== Полезные ссылки | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||