OSDev

для всех
Текущее время: 01 май 2024, 08:49

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 12 дек 2010, 19:42 

Зарегистрирован: 21 ноя 2010, 17:28
Сообщения: 7
Здравствуйте!
Я сейчас изучаю внутренние механизмы Windows, и возник вопрос:
Вот к примеру, для того чтобы программа могла "общаться" с ядром существует библиотеки Winapi, которые в свою очередь связаны с kernel32.dll и win32k.sys и которые "общаются" с ядром через прерывание 2Eh. Мне не понятен обратный механизм: каким образом в программу передаются WM_, BM_ и прочие сообщения?
А также, я предполагаю что в системе существуют некие дескрипторные таблицы в которых содержатся некие индексы процессов, по которым и происходит поиск нужного процесса для передачи ему сообщения?
Да, и ещё, вот после передачи сообщения через 2Eh, куда оно попадает в ядре? Возможно существует что то типо конвейера команд?

Буду рад любой помощи по этим вопросам, спасибо!

PS.: 2Eh = sysenter в >win2k кажется )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 дек 2010, 20:27 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Подробно отвечать лениво, а если вкратце, то с сообщениями примерно так:

1) Программа создаёт своё главное окно, у которого имеется оконная функция.
2) Далее программа крутится в бесконечном цикле "получить сообщение -- обработать сообщение". Пока сообщений нет, никакой обработки, понятное дело, не выполняется.
3) Система при наступлении определённых событий (например, кликании мышой по окну, нажатии на клаву и т.п.) создаёт соответствующие сообщения и помещает их в очередь.
4) Когда программа вызывает функцию "получить сообщение", система выдаёт первое из ожидающих сообщений.
5) Программа, получив сообщение, начинает его обрабатывать. Как именно это делается, решает она сама, но обычно сообщение через систему передаётся оконной функции.

Как видите, программа сама получает сообщения от системы. Кстати, кернел32.длл -- это одна из библиотек ВинАПИ; ядро Винды позволяет создавать программы без этой и всех прочих ДЛЛ (другое дело, что такие программы будут не Вындовз-программами в обычном смысле, поскольку будут опираться только на официально не документированный Вындовз Нативе АПИ, а не на Вин32 АПИ).

Как именно система разбирается с процессами, потоками, окнами и т.д. -- это её внутреннее дело, официально не документированное. Таблицы (массивы) не годятся, поскольку у них фиксированные размеры, так что, вероятней всего, используются списки или деревья (хотя не исключено, что применяются списки массивов фиксированного размера: заполнен один -- память выделяется под ещё один, и т.д.).

Команда ИНТ 2Е, как и любой другой ИНТ, вызывает программное прерывание, и управление получает соответствующий обработчик, входящий в состав ядра системы. Он и разруливает вызов: разбирается, что это за функция, и вызывает соответствующую подпрограмму ядра. Пока идёт обработка запроса, никакой код пользователя на том же процессоре не выполняются (работает только код системы), поэтому и в очереди нужды нет. Если компьютер многопроцессорный (а таковыми являются все многоядерные -- они ж, по сути, самые обычные многопроцессорные, просто несколько процессоров физически реализованы на одном кристалле кремния), одновременно может обрабатываться несколько вызовов функций АПИ, но в каждый момент времени на каждом процессоре может обрабатываться только один запрос.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB