0x800000000
|
0xC0000000
|
0x00000400 00000000
|
0xC0000000
|
режима ядра
|
0xFFFFFFFF
|
0xFFFFFFFF
|
0xFFFFFFFF FFFFFFFF
|
0xFFFFFFFF
|
Таблица
13-1. Так адресное пространство процесса разбивается на разделы
Раздел для выявления нулевых
указателей (Windows 2000 и Windows 98)
Этот
раздел адресного пространства резервируется для того, чтобы программисты могли
выявлять нулевые указатели. Любая попытка чтения или записи в память по этим
адресам вызывает нарушение доступа. Довольно часто в программах, написанных на
С/С++, отсутствует скрупулезная обработки ошибок. Например, в следующем
фрагменте кода такой обработки вообще нет:
int*
pnSomeInteger = (int*) malloc(sizeof(int));
*pnSomeInteger
= 5;
При нехватке памяти malloc вернет NULL. Ho код
не учитывает эту возможность и при ошибке обратится к памяти по адресу
0x00000000 А поскольку этот раздел адресного пространства заблокирован, возникнет нарушение доступа и данный процесс завершится Эта особенность
помогает программистам находить "жучков* в своих приложениях.
В Windows 2000 программы для MS-DOS и 16-разрядной Windows
выполняются в собственных адресных пространствах; 32-разрядные приложения
повлиять на них не могут.
Раздел для кода и данных пользовательского режима (Windows
2000 и Windows 98)
В
этом разделе располагается закрытая (неразделяемая) часть адресного
пространства процесса. Ни один процесс не может получить доступ к данным
другого процесса, размещенным в этом разделе. Основной объем данных, принадлежащих процессу, хранится именно здесь (это касается всех приложений)
Поэтому приложения менее зависимы от взаимных "капризов", и вся
система функционирует устойчивее. В Windows 2000 сюда загружаются все EXE- и
DLL-модули В каждом процессе эти DLL можно загружать по разным адресам в
пределах данного раздела, но так делается крайне редко. На этот же раздел
отображаются все проецируемые в память файлы, доступные данному процессу. В
64-разрядной Windows 2000 ядро наконец получит то пространство, которое ему
нужно на самом деле.
Увеличение
раздела для кода и данных пользовательского режима до 3 Гб на процессорах x86
(только Windows 2000)
Microsoft предусмотрела в версиях Windows 2000
Advanced Server и Windows 2000 Data Center для процессоров x86 возможность
увеличения этого пространства до 3 Гб. Чтобы все процессы использовали раздел
для кода и данных пользовательского режима размером 3 Гб, а раздел для кода и
данных режима ядра — объемом 1 Гб, Вы должны добавить ключ /3GB к нужной записи
в системном файле Boot.ini. Как выглядит адресное пространство процесса в этом
случае, показано в графе "32-разрядная Windows 2000 (на x86 с ключом
/3GB)" таблицы 13-1.
Уменьшение
раздела для кода и данных пользовательского режима до 2 Гб в 64-разрядной
Windows 2000
Многие
разработчики захотят как можно быстрее перенести свои 32-разрндные приложения в
64-разрядную среду. Но в исходном коде любых программ полно таких мест, где
предполагается, что указатели являются 32-разрядными значениями. Простая
перекомпиляция исходного кода приведет к ошибочному усечению указателей и
некорректному обращению к памяти. Однако, если бы система как-то гарантировала, что память никогда не будет выделяться по адресам выше 0x00000000 7FFFFFFF, приложение работало бы нормально. И усечение 64-разрядного адреса до
32-разрядного, когда старшие 33 бита равны 0, не создало бы никаких проблем.
Так вот, система дает такую гарантию при запуске приложения в "адресной
песочнице" (address space sandbox), которая ограничивает полезное адресное
пространство процесса до нижних 2 Гб. По умолчанию, когда Вы запускаете
64-разрядное приложение, система резервирует все адресное пространство
пользовательского режима, начиная с 0x0000000 80000000, что обеспечивает
выделение памяти исключительно в нижних 2 Гб 64-разрядного адресного
пространства. Это и есть "адресная песочница". Большинству приложений
этого пространства более чем достаточно. А чтобы 64-разрядное приложение могло
адресоваться ко всему разделу пользовательского режима (объемом 4 Тб), его следует
скомпоновать с ключом /LARGEADDRESSAWARE.
Закрытый раздел размером 64 Кб (только Windows 2000)
Этот
раздел заблокирован, и любая попытка обращения к нему приводит к нарушению
доступа Microsoft резервирует этот раздел специально, чтобы упростить
внутреннюю реализацию операционной системы. Вспомните, когда Бы передаете
Windows-функции адрес блока памяти и его размер, то она (функция), прежде чсм
приступить к работе, проверяет, действителен ли данный блок. Допустим, Вы
написали код:
BYTE
bBuf[70000]; DWORD dwNumBytesWritTen; WriteProcessMemory(GetCurrentProcess(), (PVOID) 0x7FFEEE90, bBuf, sizeof(bBuf), &dwNumBytesWntten);
В
случае функций типа WriteProcessMemory область памяти, в которую предполагается
запись, проверяется кодом, работающим в режиме ядра, — только он имеет право
обращаться к памяти, выделяемой под код и данные режима ядра (в 32-разрядных
системах — по адресам выше 0x80000000). Если по этому адресу есть память, вызов
WriteProcessMemory, показанный выше, благополучно запишет данные в ту область
памяти, которая, по идее, доступна только коду, работающему в режиме ядра.
Чтобы предотвратить это и в то же время ускорить проверку таких областей
памяти, Microsoft предпочла заблокировать данный раздел, и поэтому любая
попытка чтения или записи в нем всегда вызывает нарушение доступа.
Рекомендуем скачать другие рефераты по теме: список литературы реферат, изложение дубровский.
Предыдущая страница реферата |
1
2
3
4
5
6
7
8
9
10
11 |
Следующая страница реферата