Составители:
Рубрика:
зервировать и закрепить указанную область памяти. Часто программисты вызы-
вают функцию VirtualAlloc() сначала с флагом MEM_RESERVE
для резервиро-
вания большой области памяти, а затем несколько раз подряд – с флагом
MEM_COMMIT
для поэтапного закрепления отдельных фрагментов.
Флаг fdwProtect определяет, каким образом использовать определенную стра-
ницу или диапазон страниц. Для резервируемой памяти этот флаг должен иметь
значение PAGE_NOACCESS.
При закреплении памяти устанавливается флаг
PAGE_READONLY
или PAGE_READWRITE. Другие программы не могут читать
информацию из адресного пространства вашего процесса, поэтому режим доступа
только для чтения обеспечивает защиту от ошибок в вашей программе, которые
могут привести к случайному повреждению важной информации. Уровни защиты
применимы к отдельным страницам. Различные страницы в одной области памяти
могут иметь разные значения флага защиты. Например, вы можете применить
флаг PAGE_READONLY
ко всему блоку, а затем временно изменять уровень за-
щиты отдельных страниц, разрешая доступ к ним для записи. Защитить от записи
только часть страницы невозможно, поскольку флаги устанавливаются для целых
страниц. В табл. 3.1 приведены возможные значения, которые может принимать
флаг fdwProtect.
Таблица 3.1
Значение флага Выполняемое действие
PAGE_READONLY Допускается только чтение
PAGE_READWRITE Допускается чтение и запись
PAGE_EXECUTE Допускается только исполнение
PAGE_EXECUTE_READ Допускается исполнение и чтение
PAGE_EXECUTE_READWRITE Допускается исполнение, чтение и запись
PAGE_GUARD
Дополнительный флаг защиты. При первом
обращении к странице флаг сбрасывается и возни-
кает исключение STATUS_GUARD_PAGE. Данный
флаг используется для контроля размеров стека с
возможностью его динамического расширения
PAGE_NOCACHE
Запрещает кэширование страниц. Может быть
полезен при разработке драйверов – различных
устройств (например, данные в видеобуфер долж-
ны переписываться сразу, без кэширования)
Функция VirtualAlloc() не может зарезервировать более 1 Гб памяти, по-
скольку процесс контролирует только нижнюю половину своего адресного
пространства объемом 2 Гб. В действительности объем контролируемой па-
мяти еще меньше из-за свободных областей (по 64 Кб каждая) на границах
адресного пространства процесса. Кроме того, функция VirtualAlloc() резер-
вирует память фрагментами по 64 Кб, а закрепляет ее фрагментами объемом
в одну страницу. При резервировании памяти функция VirtualAlloc() округ-
ляет аргумент lpvAddress до ближайшего значения, кратного 64 Кб. При за-
креплении памяти функция VirtualAlloc осуществляет одно из двух действий.
47
зервировать и закрепить указанную область памяти. Часто программисты вызы-
вают функцию VirtualAlloc() сначала с флагом MEM_RESERVE для резервиро-
вания большой области памяти, а затем несколько раз подряд – с флагом
MEM_COMMIT для поэтапного закрепления отдельных фрагментов.
Флаг fdwProtect определяет, каким образом использовать определенную стра-
ницу или диапазон страниц. Для резервируемой памяти этот флаг должен иметь
значение PAGE_NOACCESS. При закреплении памяти устанавливается флаг
PAGE_READONLY или PAGE_READWRITE. Другие программы не могут читать
информацию из адресного пространства вашего процесса, поэтому режим доступа
только для чтения обеспечивает защиту от ошибок в вашей программе, которые
могут привести к случайному повреждению важной информации. Уровни защиты
применимы к отдельным страницам. Различные страницы в одной области памяти
могут иметь разные значения флага защиты. Например, вы можете применить
флаг PAGE_READONLY ко всему блоку, а затем временно изменять уровень за-
щиты отдельных страниц, разрешая доступ к ним для записи. Защитить от записи
только часть страницы невозможно, поскольку флаги устанавливаются для целых
страниц. В табл. 3.1 приведены возможные значения, которые может принимать
флаг fdwProtect.
Таблица 3.1
Значение флага Выполняемое действие
PAGE_READONLY Допускается только чтение
PAGE_READWRITE Допускается чтение и запись
PAGE_EXECUTE Допускается только исполнение
PAGE_EXECUTE_READ Допускается исполнение и чтение
PAGE_EXECUTE_READWRITE Допускается исполнение, чтение и запись
Дополнительный флаг защиты. При первом
обращении к странице флаг сбрасывается и возни-
PAGE_GUARD кает исключение STATUS_GUARD_PAGE. Данный
флаг используется для контроля размеров стека с
возможностью его динамического расширения
Запрещает кэширование страниц. Может быть
полезен при разработке драйверов – различных
PAGE_NOCACHE
устройств (например, данные в видеобуфер долж-
ны переписываться сразу, без кэширования)
Функция VirtualAlloc() не может зарезервировать более 1 Гб памяти, по-
скольку процесс контролирует только нижнюю половину своего адресного
пространства объемом 2 Гб. В действительности объем контролируемой па-
мяти еще меньше из-за свободных областей (по 64 Кб каждая) на границах
адресного пространства процесса. Кроме того, функция VirtualAlloc() резер-
вирует память фрагментами по 64 Кб, а закрепляет ее фрагментами объемом
в одну страницу. При резервировании памяти функция VirtualAlloc() округ-
ляет аргумент lpvAddress до ближайшего значения, кратного 64 Кб. При за-
креплении памяти функция VirtualAlloc осуществляет одно из двух действий.
47
Страницы
- « первая
- ‹ предыдущая
- …
- 45
- 46
- 47
- 48
- 49
- …
- следующая ›
- последняя »
