Как работают прерывания в многоядерных / многоядерных машинах? - PullRequest
21 голосов
/ 19 ноября 2008

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

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

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

Ответы [ 3 ]

6 голосов
/ 19 ноября 2008

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

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

5 голосов
/ 11 декабря 2008

эта статья http://www.alexonlinux.com/smp-affinity-and-proper-interrupt-handling-in-linux объясняет, как прерывания в машинах smp обрабатываются linux

2 голосов
/ 19 ноября 2008

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

...