Составители:
Аргумент fdwAllocationType может принимать значение MEM_RESERVE или
MEM_COMMIT либо оба значения одновременно. Для резервирования определенного
интервала адресов функция VirtualAlloc создает новый VAD, который отмечает исполь-
зуемую область. Однако эта функция не выделяет физическую память, из-за чего невоз-
можно использовать зарезервированные адреса. При попытке чтения или записи в заре-
зервированные страницы возникает ошибка доступа к памяти. С другой стороны,
никакая другая команда выделения памяти не может использовать ранее зарезервиро-
ванные адреса. Например, функции GlobalAlloc и malloc не могут разместить новые объ-
екты в области, которая пересекается с зарезервированным адресным пространством.
Попытка заставить функцию VirtualAlloc зарезервировать все доступное адресное про-
странство (1 Гб) приведет к конфликту: последующие операции выделения памяти не
будут выполняться, даже если указанная функция не задействовала никакой физической
памяти.
Память не может быть закреплена, если она не зарезервирована. Комбинация фла-
гов MEM_RESERVE и MEM_COMMIT позволяет одновременно зарезервировать и за-
крепить указанную область памяти. Часто программисты вызывают функцию VirtualAl-
loc сначала с флагом MEM_RESERVE для резервирования большой области памяти, а
затем несколько раз подряд с флагом MEM_COMMIT
для поэтапного закрепления от-
дельных фрагментов.
Флаг fdwProtect определяет, каким образом использовать определенную страницу
или диапазон страниц. Для резервируемой памяти этот флаг должен иметь значение
PAGE_NOACCESS.
При закреплении памяти устанавливается флаг PAGE_READONLY
или PAGE_READWRITE. Другие программы не могут читать информацию из адресного
пространства вашего процесса, поэтому режим доступа только для чтения обеспечивает
защиту от ошибок в вашей программе, которые могут привести к случайному поврежде-
нию важной информации. Уровни защиты применимы к отдельным страницам. Различ-
ные страницы в одной области памяти могут иметь разные значения флага защиты. На-
пример, вы можете применить флаг PAGE_READONLY ко всему блоку, а затем
временно изменять уровень защиты отдельных страниц, разрешая доступ к ним для за-
писи. Защитить от записи только часть страницы невозможно, поскольку флаги устанав-
ливаются для целых страниц. В таблице 4.1. приведены возможные значения, которые
может принимать флаг fdwProtect.
Таблица 4.1
Значение флага Выполняемое действие
PAGE_READONLY Допускается только чтение
PAGE_READWRITE Допускается чтение и запись
PAGE_EXECUTE Допускается только исполнение
PAGE_EXECUTE_READ Допускается исполнение и чтение
PAGE_EXECUTE_READWRITE Допускается исполнение чтение и запись
PAGE_GUARD Дополнительный флаг защиты, который комбини-
руется с другими флагами. При первом обращении
к странице этот флаг сбрасывается и возникает ис-
ключение STATUS_GUARD_PAGE. Этот флаг ис-
пользуется для контроля размеров стека с возмож-
ностью его динамического расширения.
PAGE_NOCACHE Запрещает кэширование страниц. Может быть поле-
зен при разработке драйверов устройств (например,
данные в видеобуфер должны переписываться сра-
зу, без кэширования)
112
Аргумент fdwAllocationType может принимать значение MEM_RESERVE или
MEM_COMMIT либо оба значения одновременно. Для резервирования определенного
интервала адресов функция VirtualAlloc создает новый VAD, который отмечает исполь-
зуемую область. Однако эта функция не выделяет физическую память, из-за чего невоз-
можно использовать зарезервированные адреса. При попытке чтения или записи в заре-
зервированные страницы возникает ошибка доступа к памяти. С другой стороны,
никакая другая команда выделения памяти не может использовать ранее зарезервиро-
ванные адреса. Например, функции GlobalAlloc и malloc не могут разместить новые объ-
екты в области, которая пересекается с зарезервированным адресным пространством.
Попытка заставить функцию VirtualAlloc зарезервировать все доступное адресное про-
странство (1 Гб) приведет к конфликту: последующие операции выделения памяти не
будут выполняться, даже если указанная функция не задействовала никакой физической
памяти.
Память не может быть закреплена, если она не зарезервирована. Комбинация фла-
гов MEM_RESERVE и MEM_COMMIT позволяет одновременно зарезервировать и за-
крепить указанную область памяти. Часто программисты вызывают функцию VirtualAl-
loc сначала с флагом MEM_RESERVE для резервирования большой области памяти, а
затем несколько раз подряд с флагом MEM_COMMIT для поэтапного закрепления от-
дельных фрагментов.
Флаг fdwProtect определяет, каким образом использовать определенную страницу
или диапазон страниц. Для резервируемой памяти этот флаг должен иметь значение
PAGE_NOACCESS. При закреплении памяти устанавливается флаг PAGE_READONLY
или PAGE_READWRITE. Другие программы не могут читать информацию из адресного
пространства вашего процесса, поэтому режим доступа только для чтения обеспечивает
защиту от ошибок в вашей программе, которые могут привести к случайному поврежде-
нию важной информации. Уровни защиты применимы к отдельным страницам. Различ-
ные страницы в одной области памяти могут иметь разные значения флага защиты. На-
пример, вы можете применить флаг PAGE_READONLY ко всему блоку, а затем
временно изменять уровень защиты отдельных страниц, разрешая доступ к ним для за-
писи. Защитить от записи только часть страницы невозможно, поскольку флаги устанав-
ливаются для целых страниц. В таблице 4.1. приведены возможные значения, которые
может принимать флаг fdwProtect.
Таблица 4.1
Значение флага Выполняемое действие
PAGE_READONLY Допускается только чтение
PAGE_READWRITE Допускается чтение и запись
PAGE_EXECUTE Допускается только исполнение
PAGE_EXECUTE_READ Допускается исполнение и чтение
PAGE_EXECUTE_READWRITE Допускается исполнение чтение и запись
PAGE_GUARD Дополнительный флаг защиты, который комбини-
руется с другими флагами. При первом обращении
к странице этот флаг сбрасывается и возникает ис-
ключение STATUS_GUARD_PAGE. Этот флаг ис-
пользуется для контроля размеров стека с возмож-
ностью его динамического расширения.
PAGE_NOCACHE Запрещает кэширование страниц. Может быть поле-
зен при разработке драйверов устройств (например,
данные в видеобуфер должны переписываться сра-
зу, без кэширования)
112
Страницы
- « первая
- ‹ предыдущая
- …
- 108
- 109
- 110
- 111
- 112
- …
- следующая ›
- последняя »
