Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
realizaciya_mnogozadachnosti_v_windows_vista.doc
Скачиваний:
21
Добавлен:
28.03.2015
Размер:
138.75 Кб
Скачать

3.2. Реализация процессов и потоков в WindowsVista

Рассмотрим, как в WindowsVistaсоздается процесс (и начальный поток). Процесс создается тогда, когда другой процесс делает вызовCreateProcess интерфейса Win32. Этот вызов запускает процедуру (пользовательского режима) изkernel.dll, которая создает процесс3:

1. Преобразуется имя исполняемого файла (заданное в виде параметра) из маршрута Win32 в маршрут NT. Если исполняемый файл имеет только имя (без маршрута в виде каталогов), то поиск его ведется в тех каталогах, которые перечислены в качестве каталогов по умолчанию (они включают и те, которые содержатся в переменной окруженияPATH– но не только их).

2. Собираются все параметры создания процесса и передаются (вместе с полным маршрутом к исполняемой программе) собственному интерфейсу NtCreateUserProcess. (ЭтотAPIбыл добавлен вWindowsVistaдля того, чтобы подробности создания процесса можно было реализовывать в режиме ядра, позволяя использовать процессы как границы безопасности. Предыдущие собственныеAPIпо-прежнему существуют, но вызовомCreateProcess они больше не используются.)

3. Работая в режиме ядра, NtCreateUserProcess обрабатывает параметры, а затем открывает образ программы и создает объект сегмента, который может использоваться для отображения программы на виртуальное адресное пространство нового процесса.

4. Диспетчер процессов выделяет и инициализирует объект процесса (структуру данных ядра, представляющую процесс, как для ядра, так и для исполнительного уровня).

5. Диспетчер памяти создает адресное пространство для нового процесса, выделяя и инициализируя каталоги страниц и дескрипторы виртуальных адресов, описывающие режим ядра (и в том числе специфичные для процесса области, такие как элемент каталога страниц self-map, который дает каждому процессу доступ в режиме ядра к физическим страницам всей таблицы страниц при помощи виртуальных адресов ядра).

6. Для нового процесса создается таблица описателей, в которую дублируются все те описатели вызвавшей стороны, для которых разрешается наследование.

7. Выполняется отображение совместно используемой страницы пользователя, а диспетчер памяти инициализирует структуры данных рабочего набора (используемые для того, чтобы принимать решение, какие страницы убирать из процесса при недостатке физической памяти). Представленные объектом сегмента части образа исполняемого файла отображаются на адресное пространство пользовательского режима нового процесса.

8. Исполнительный уровень создает и инициализирует блок ProcessEnvironmentBlock(РЕВ) пользовательского режима, который используется как пользовательским режимом, так и ядром для поддержания информации о состоянии процесса.

9. В новом процессе выделяется виртуальная память, которая используется для передачи параметров (в том числе строк окружения и командной строки).

10. Из специальной таблицы описателей (которую поддерживает ядро для эффективного выделения локально-уникальных идентификаторов для процессов и потоков) выделяется идентификатор процесса.

11. Выделяется и инициализируется объект потока. Выделяется стек пользовательского режима и блок ThreadEnvironmentBlock(ТЕВ). Инициализируется записьCONTEXT, которая содержит начальные значения регистров процессора для потока (в том числе указатели команд и стека).

12. Объект процесса добавляется в глобальный список процессов. В таблице описателей вызвавшей стороны выделяется место под описатели для объектов процесса и потока. Для начального потока выделяется идентификатор (из таблицы идентификаторов).

13. NtCreateUserProcess возвращается в пользовательский режим с созданным новым процессом, содержащим единственный поток, который готовк работе, но находится в состоянии приостановки.

14. Если интерфейс NTAPIдает сбой, то код Win32 проверяет, не принадлежит ли данный процесс к другой подсистеме (например,WOW64). Или, возможно, данная программа помечена для выполнения под управлением отладчика. Эти специальные случаи обрабатываются специальным кодом пользовательского режима вCreateProcess.

15. Если NtCreateUserProcess отработал успешно, то процессы Win32 нужно зарегистрировать в процессеcsrss.exe подсистемы Win32.Kernel32.dll посылает сообщение вcsrss, которое сообщает ему о новом процессе (а также передает описатели процесса и потока, чтобы он мог себя сдублировать). Процесс и потоки вносятся в таблицы подсистемы (чтобы там имелся полный список всех процессов и потоков Win32). Затем подсистема показывает курсор (указатель с песочными часами), чтобы сообщить пользователю о том, что в данный момент что-то происходит, но курсор все же можно использовать. Когда процесс делает свой первый вызов графического интерфейса пользователя (обычно это делается для создания окна), то курсор исчезает (если нет других вызовов) – тайм-аут у него 2 с.

16. Если процесс ограничен (как имеющий низкие права InternetExplorer), то маркер модифицируется для ограничения доступа к объектам из нового процесса.

17. Если приложение было помечено как подлежащее исправлению (shimmed) для совместимой работы в текущей версииWindows, то применяются указанныеисправления (shims). Исправления обычно заключают в оболочку вызовы библиотек, чтобы модифицировать их поведение – например, вернуть сфальсифицированный номер версии или отложить освобождение памяти.

18. И наконец, вызов NtResumeThread для отмены приостановки потока и возвращения вызвавшей стороне структуры, содержащей идентификаторы и описатели для только что созданных процесса и потока.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]