Статьи
Полезное
Личное
Связь
Как Windows запускает приложение |
Автор: Coldy |
02.02.2010 23:05 |
Страница 3 из 3 При инициализации первичного потока нового процесса подсистема Win32 указывает в качестве стартового адреса свою внутреннюю функцию, которая должна выполняться в пользовательском режиме, она же держит пользовательский код под контролем. Однако, ядро, при создании потока заменяет этот адрес, адресом функции, которая будет выполняться в режиме ядра, а адрес указанной функции сохраняется во внутренних структурах, для дальнейшего использования. Эта функция является стартовой функцией для всех пользовательских потоков и проводит окончательную инициализацию запущенного потока. Когда новый поток получает управление (пока еще в режиме ядра) в нем происходят настройки для инициализации подуровня Ldr – загрузчика образов, таким образом, чтобы при переходе в пользовательский режим поток начал выполнение загрузки DLL, необходимых для выполнения нового процесса. Здесь, выполнение потока прерывается и далее он ждет выполнения в пользовательском режиме. Подуровень Ldr С этого момента выполнение потока происходит уже в режиме пользователя. После того как поток попадает в функцию инициализации загрузчика здесь проводятся необходимые приготовления собственных структур – они необходимы для того чтобы сохранять данные об уже загруженных DLL, при повторном обращении, а не загружать их каждый раз заново. Если загрузчик инициализируется впервые, он анализирует внутренние структуры загруженного приложения, чтобы определить, какие DLL и функции из них необходимы для выполнения процесса, далее он заполняет необходимые таблицы внутри образа загруженного приложения, настраивая их так, чтобы обращения к этим функциям проходило напрямую для приложения. Также, проводятся некоторые другие операции по подготовке образа к выполнению – более подробно о работе загрузчика я расскажу в другой статье. По окончании первичной инициализации для всех только что загруженных библиотек вызывается их внутренние функции стартовые функции, с уведомлением о том, что они присоединены к новому процессу, а при создании новых потоков – к новому потоку. Эти уведомления позволяют загруженным DLL проводить необходимые внутренние инициализации. После того, как все необходимые операции выполнены, загруженный и проинициализированный образ, наконец, получает самостоятельное управление. Поехали! Наконец то, наша программа выполняется, и мы можем видеть результат ее деятельности. А когда программа завершается, она возвращается управления операционной системе, которая проводит все необходимые действия для освобождения занятых ресурсов при создании и работы данной программе, но это тоже тема для отдельной статьи.
|