Подтвердить что ты не робот

Как работают прерывания в многоядерных/многоканальных машинах?

Недавно я начал погружаться в низкоуровневое программирование ОС. Я (очень медленно) в настоящее время работает через две старые книги, XINU и Build Your Own 32 Bit OS, а также некоторые ресурсы, предложенные прекрасными людьми из моего предыдущего вопроса, Как сделать начать работу в разработке операционной системы.

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

Например, скажем, DMA хочет сообщить, что операция чтения файла завершена. Какой процессор/ядро ​​признает, что было подано прерывание? Это процессор/ядро, которое инициировало чтение файла? Не зависит ли он от того, какой процессор/ядро ​​до него дойдет?

4b9b3361

Ответ 1

Заглядывая в IoConnectInterrupt, вы можете найти ProcessorEnableMask, который выберет процессор, который разрешил запустить Процедура прерывания (ISR).
Исходя из этой информации, я могу предположить, что где-то на низком уровне (см.
сообщение Адама) можно указать, где маршрутизировать прерывание.

Операция с файлом боковой заметки действительно не связана с прерываниями и/или dma напрямую. Работа с файлами - это концепция файловой системы, которая переводится на что-то низкое, зависит от того, на какой шине вы располагаете файловой системой, это может быть IDE или SATA-диск, или это может быть даже хранилище usb, в этом случае сектор чтения будет переведен на 3 логических операции через шину usb, там будет прерываться, обслуживаемый драйвером хост-контроллера usb, но он действительно не связан с исходной операцией чтения файла, которая, вероятно, была разделена на меньшую транзакцию любым способом.

Ответ 3

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