THIS SECTION IS UNDER CONSTRUCTION
Общие понятия: memset Проблема: пересылка памяти memcpy memmove Специальным образом оптимизированные машинные команды rep movsd обработка спец образом (возможно даже больше чем размер регистров) пересылка количества памяти не кратного rep movsd movsw movsb Если регионы памяти перекрываются то надо поступать исходя из перекрывания DF - Direction Flag (показывает в какую сторону перекрывать) cld/std ds:[di] = es:[si] if DF == 0 si += N di += N if DF == 1 si -= N di -= N Реальная память (организация куч): Списки Tagged Lists
Получение памяти в pool BIOS Win32 UNIX обычная политика: мелкий блок из списков кучи, если больше размеров страницы, то используем целую страницу. Стратегии First Fit Best Fit Last Fit Списки с блоками разного размера Деление на 2 соответственно фрагментация и дефрагментация кучи. Выделение выровненного буфера как правило требуется для системных операций Виртуальная память: Для драйверов: Paged/Non-Paged pool Копирование из user space Копирование из другово процесса Локирование памяти запрещение памяти перемещаться Возможно: перемещение сбрасывание (в Page File) Свойства памяти Защита памяти свойства: read/write/execute copy-on-write Выделение виртуальной памяти аллокирование группы страниц в адрессном пространстве Отладка утечек Debug Version of MSVC RTL CDh выделена malloc/new DDh освобождена free/delete FDh используется для барьеров ABh выделена LocalAlloc CCh иногда неинициализированные переменные /GZ Специфическме варианты Окна памяти EMS PAE Маппирование файлов в память
Концептуальный RTL для памяти Физической Структуры для памяти Список Сложные стратегии Аллокировать блок память Деаллокировать блок память Переаллокировть блок памяти Стратегия выделения First fit, Best fit, Last fit особенно полезен Кучи Создать кучу Добавить блок в кучу Удалить блок из кучи callback если нет места Компактизация кучи Локирование/Анлокирование кучи в памяти (если виртуальная) Узнать размер кучи размер свободной памяти в куче размер максимального свободного блока RTL языков new простой new[] с доп структурой Общий RTL Аллокировать память с указанным выравниванием Виртуальной Выделить станицы виртуальной памяти по указанному виртуальному адрессу все равно где Удалить страницы виртуальной памяти Иногда бывает типа - установить границу выше/ниже которой память считается выделенной Залочить страницы в памяти Анлочить страницы в памяти квоты процесса на залоченную память Изменить параметры защиты страниц Чтение Запись Выполнение все тоже самое но для другого процесса Аллокировать разделяемую память (будет шариться между процессами) то же но именованную Когда физическое пространство меньше виртуального или память находиться сбоку - например EMS. Аллокировать блок Деаллокировать блок Помаппить блок в адрессное пространство Узнать помапплен ли блок Ядра (Paged, Non-paged, kernel/user space) квоты процесса на залоченную память аллокировать физическую память и помапить ее идущую подряд аллокировать физическую память в специальном регионе например нижние 16M или 4G из за ISA/PCI устройств аллокировать paged/non-paged память идущую подряд аллокировать некэшируемую память аллокировать память немедленно и успешно (для ISR итд) копировать из/в пользовательское адрессное пространство Пользовательский RTL для памяти Зануление региона памяти memset Прописывание региона памяти определенным шаблоном memchr Сравнение двух регионов памяти memcmp Копирование региона памяти memcpy memmove нужна эффективность на примере REP MOVSD x86 проблема - перекрывающиеся регионы __restrict