1.Внутреннее устройство Windows (гл. 1-4) :: Руссинович Марк
Страница:
181 из 350
При загрузке Windows распознает тип процессора, на котором она работает, и выбирает подходящий системный код. Этот код для NtReadFile в пользовательском режиме выглядит так:
ntdll!NtReadFile:
77f5bfa8 b8b7000000 mov eax,0xb7
77f5bfad ba0003fe7f mov edx,0x7ffe0300
77f5bfb2 ffd2 call edx
77f5bfb4 c22400 ret 0x24
Номер системного сервиса — 0xb7 (183 в десятичной форме), инструкция вызова выполняет код диспетчеризации системного сервиса, установленный ядром, который в данном примере находится по адресу 0x7ffe0300. Поскольку пример взят для Pentium M, используется sysenter.
SharedUserData!SystemCallStub: 7ffe0300 8bd4 mov edx,esp
7ffe0302 0f34 sysenter
7ffe0304 сЗ ret
Диспетчеризация 64-разрядных системных сервисов
B архитектуре x64 операционная система Windows использует инструкцию syscall, которая работает аналогично инструкции syscall на процессорах AMD Кб. Windows передает номер системного вызова в регистре EAX, первые четыре параметра в других регистрах, а остальные параметры (если они есть) в стеке:
B архитектуре IA64 для тех же целей применяется инструкция epc (Enter Privileged Mode). Первые восемь аргументов системного вызова передаются в регистрах, а остальное в стеке.
Диспетчеризация системных сервисов режима ядра
Как показано на рис. 3-14, ядро использует номер системного сервиса для поиска информации о нем в таблице диспетчеризации системных сервисов (system service dispatch table). Эта таблица похожа на описанную ранее таблицу IDT и отличается от нее тем, что каждый ее элемент содержит указатель на системный сервис, а не на процедуру обработки прерывания.
|< Пред. 179 180 181 182 183 След. >|