2014-10-19 6 views
-1

Я пытаюсь изучить внутренности ОС Windows. SSDT определяется как «список адресов системных вызовов»? - это SSDT также механизм обработки прерываний, который позволяет обнаруживать аппаратные события? Спасибо за ответы сейчас.Все системные вызовы требуют SSDT в Windows?

+0

Один вопрос в вопрос. Потому что вы можете только отметить один ответ правильно. –

+0

сделано, только один сейчас. –

ответ

2

Нет, SSDT - это не то, как ОС ловит аппаратные события. Если мы начнем с аппаратного обеспечения, скажем, PCI-карты для сетевого адаптера, у него будет сигнал прерывания типа, который через интерфейс PCI переходит на контроллер прерывания. На ПК это будет «APIC» (Advanced Programmable Interrupt Controller), который, в свою очередь, подключается к самому ядру процессора. Другое оборудование работает аналогичным образом, поэтому я буду использовать APIC в качестве примера ниже.

Когда ОС инициализирует APIC, он даст каждому аппарату прерывание «вектора», которое входит в таблицу векторов прерываний. Каждая запись вектора прерывания будет содержать адрес, на который процессор перескакивает, когда это прерывание активно. В x86 таблица векторов прерываний называется «Таблица дескрипторов прерываний», потому что вектор является более чем простым адресом для перехода на него - он также содержит немного дополнительной информации о том, как обрабатывать прерывание и т. Д.

Поэтому, когда наш сетевой адаптер получает пакет данных, он будет «тянуть» сигнал прерывания. Затем процессор обнаружит прерывание, и когда это произойдет, контроллер прерываний даст вектор для использования. Процессор просматривает вектор, сохраняет текущее состояние и переходит к адресу в векторе.

Внутри вектора ОС выполнит некоторую работу «admin», а затем посмотрит, какой драйвер устройства попросил сообщить об этом прерывании, поэтому ОС обнаруживает наш драйвер сетевого адаптера и вызывает его процедуру обработки прерываний. Код обработки прерываний проверяет состояние сетевого адаптера, видит, что это был «новый пакетный» тип прерывания, считывает данные из буфера и, вероятно, обновляет некоторый семафор или аналогичный, так что некоторые функции драйвера могут начать выполнять «мы получили новый пакет». Как только это будет сделано, обработчик прерываний вернется к ОС.

При возврате из кода обработки прерываний ОС будет проверять, прошел ли какой-либо «новый процесс», поэтому процесс, ожидающий появления пакетов, теперь будет «runnable», и он может переключиться на этот процесс или просто отметьте это как «запустите это в будущем».

The SSDT используется, когда приложение вызывает, скажем, CreateFile, ReadFile, WriteFile и CloseHandle, а также любые другие системные вызовы (есть довольно много из них). В принципе, есть запись в SSDT для NtCreateFile, другая для NtReadFile и т. Д. - обратите внимание, что NtCreateFile не совсем то же самое, что и CreateFile - это часть, которая происходит внутри ядра ОС.

+0

Итак, когда прерывание запущено, все ядра процессора поймают его, даже любое ядро, которое не ждет прерывания. –

+0

Процессоры не ждут прерывания (хотя CPU может быть «остановлен», если нечего делать, и в этом случае он выходит из строя, когда он получает прерывание). И только один процессор примет прерывание. Обычно APIC запрограммирован на предоставление прерывания конкретному процессору. Существуют также «Inter Processor Interrupts», которые инициируются одним процессором для «вызова» другого процессора, который используется планировщиком для запуска процессоров, которые останавливаются, но процессор может также разбудить сам по себе, когда происходит прерывание часть оборудования «отвечает за». Это сложный вопрос ... –

+0

@eryksun: Спасибо, обновлено. –

Смежные вопросы