achesnokov писал(а):
Под базовой вы понимаете память статически выделенную в исходном коде? Статически - всмысле константный адрес. Правильно?
Нет, под базовой я понимаю память в первом меге физ. адресного пространства. Кстати статически я распределяю память тоже только в первом меге. Т.е. физ. адрес начального каталога страниц и т.п. заранее не известен.
Цитата:
Ядро с логической точки зрения тоже своего рода процесс, со своими сегментами кода, констант, данных и стека. Соответственно размер отображенной в память части ядра может быть минимальным.
Долго тебе придется добирать код и инициализированные данные ядра до 4 мег. Строение и формирование пространства ядра - это вообще отдельный вопрос. Физически код и данные ядра я не различаю (секции кода и данных ядра существуют только на уровне исходников). Свой стек у ядра существует только во время начальной инициализации - располагается под базовым адресом загрузки 8000h. Потом ядро использует стеки ядра, принадлежащие различным потокам различных процессов. Хотя конечно есть процесс (т.н. первичная задача), в котором выполняется большинство служебных потоков.
Цитата:
Причем должна быть защита от записи кодовых страниц, а также страниц константных данных.
У меня все прикладные кодовые страницы изначально имеют атрибут READONLY. Логически даже есть разделение на исполняемые и неисполняемые страницы, однако пока неисполняемыми в лучшем случае могут быть только стековые страницы (достигается за счет контроля лимита прикладного кодового сегмента в каждом процессе).
Цитата:
Что такое "локальные участки", какое их назначение? Собственно память в примере и разделена как раз на 2 части: прикладную и последние 4М виртуального адресного пространства - область ядра.
Деление на прикладное пространство и пространство ядра отличается от деления на локальную память и глобальную память. Локальная память - это память, принадлежащая конкретному процессу. Локальная память используется не только в прикладном пространстве, но и в пространстве ядра. Локальная память ядра по-разному отображается в одни и те же участки пространства ядра. Сама таблица страниц частично тоже является локальной. В том числе каталог страниц является локальной страницей, т.к. его содержимое может различаться в разных процессах, хотя обычно он имеет один и тот же вирт. адрес в каждом процессе.
Цитата:
Что касается выделения физической памяти. Самый простой концепт - битовая маска, скорее всего, будет медленно работать. Да и память занимать будет. Список свободных блоков, возможно вариант лучше. У James Molloy был описан подобный вариант... Есть куча классических механизмов, последний из которых, кажется Slub Allocation.... Было бы много что интересно обсудить...
Стек свободных страниц требует больше памяти, хотя у стека значительно проще забирать неиспользуемую им память, чем у битовой маски. Основная проблема битовой маски - это поиск свободной страницы. Slab - это немного другое - позволяет быстро и экономично выделять маленькие участки определенных размеров для повторного использования.
Цитата:
Стековый резерв - судя по всему пространство зарезервированное под увеличение стека, если его не хватит. Правильно?
Ну, да. Причем обычно это происходит автоматически, если в системе достаточно памяти.
Цитата:
Где размещается heap программы? В какой секции? Возможно ли выделение дополнительной памяти процессу, после загрузки в память? Куда это делается?
Естественно, возможно. Приложение может выделять память в секции rma, хотя опять-таки это автоматически будет делать установленный по умолчанию системный обработчик, пока достаточно памяти. Также приложение может выделять память в любом свободном участке, но только в ручном режиме, т.к. обращение к свободным участкам по умолчанию приводит к завершению процесса.