LINUX.ORG.RU

sti и cli


0

1

Они разрешают/запрещают прерывания на отдельном ядре или на всём процессоре?
Если на всём процессоре, то как разрешить/запретить на одном ядре?

Ответ на: комментарий от Indaril_Shpritz

Скорее всего, на одном виртуальном ядре. По идее, ОС видит каждое логическое ядро как отдельное во всех смыслах, т. к. у каждого из логических ядер свой набор регистров и свой контроллер прерываний.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

у каждого из логических ядер ... свой контроллер прерываний.

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

Indaril_Shpritz
() автор топика
Ответ на: комментарий от intelfx

Мне тут ничего непонятно :)
межпроцессорные прерывания бывают между ядрами одного процессора?

$ cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3       
  0:         42          0          0          0   IO-APIC-edge      timer
  1:          2          2          2          3   IO-APIC-edge      i8042
  8:          0          0          1          0   IO-APIC-edge      rtc0
  9:          0          0          0          0   IO-APIC-fasteoi   acpi
 14:     356290     356236     356306     356262   IO-APIC-edge      ata_piix
 15:          0          0          0          0   IO-APIC-edge      ata_piix
 16:       5789       5841       5984       5918   IO-APIC-fasteoi   uhci_hcd:usb1, pata_jmicron
 18:     220433     220482     220381     220362   IO-APIC-fasteoi   uhci_hcd:usb3, uhci_hcd:usb6, ehci_hcd:usb7, i801_smbus, eth2
 19:      35401      35340      35242      35361   IO-APIC-fasteoi   ahci, uhci_hcd:usb5, ata_piix, eth1
 20:         66         72         70         69   IO-APIC-fasteoi 
 21:          5          7          6         11   IO-APIC-fasteoi   uhci_hcd:usb2
 23:          0          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb4, ehci_hcd:usb8
 44:          0          0          0          0   PCI-MSI-edge      eth0
 45:        203        211        197        199   PCI-MSI-edge      snd_hda_intel
 46:         52         50         53         57   PCI-MSI-edge      snd_hda_intel
NMI:       3854       4282       4187       4031   Non-maskable interrupts
LOC:    1812668    2053130    1897050    1857490   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
PMI:       3854       4282       4187       4031   Performance monitoring interrupts
IWI:     109750     126729     136152     123802   IRQ work interrupts
RTR:          0          0          0          0   APIC ICR read retries
RES:    4655654    4777611    4657158    4731088   Rescheduling interrupts
CAL:     179037     186332     169139     184769   Function call interrupts
TLB:     551725     460278     289670     914706   TLB shootdowns
TRM:          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0   Threshold APIC interrupts
MCE:          0          0          0          0   Machine check exceptions
MCP:         80         80         80         80   Machine check polls
ERR:          0
MIS:          0
Indaril_Shpritz
() автор топика
Ответ на: комментарий от Indaril_Shpritz

О. А у тебя APIC работает в другом режиме и распределяет прерывания равномерно между ядрами. Видимо, CONFIG_CPU_HOTPLUG не включен.

Да, с точки зрения ОС несколько ядер == несколько процессоров.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

APIC ... распределяет прерывания равномерно между ядрами.

а как он это делает? т.е. как он указывает, какое ядро должно обработать прерывание скажем от таймера?

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Indaril_Shpritz

Ну и да: есть «local APIC» (личный контроллер прерываний ядра), а есть «I/O APIC» (общий контроллер прерываний на чипсете).

intelfx ★★★★★
()
Ответ на: комментарий от Indaril_Shpritz

Вообще, таймер у каждого ядра свой, и прерывания от него приходят через local APIC.

I/O APIC обрабатывает прерывания от устройств (хотя да, если всё в режиме эмуляции, то таймер общесистемный) — ну, он пинает конкретное ядро через шину (FSB на старых системах, сейчас хз как).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

А ещё, оказывается, I/O APIC — штука устаревшая. Сейчас юзается MSI, т. е. когда устройство само пишет в память local APIC конкретного ядра и таким образом пинает ядро напрямую.

В этом случае устройство само выбирает, какому ядру отправлять прерывание.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

я правильно понимаю, что I/O APIC программируется через порты процессора? Если да, то мне непонятно: как программируется local APIC (т.е. через другие порты? или специальными инструкциями?)

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Indaril_Shpritz

Насколько понимаю, они все программируются через MMIO. Это когда определённые области оперативной памяти на самом деле являются «окнами» для общения с устройствами (т. е. запись данных по определённому адресу означает отправку данных на устройство).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

I/O APIC — штука устаревшая.
устройство само выбирает, какому ядру отправлять прерывание

устаревшая, но используемая? На какое ядро придёт прерывание от клавиатуры? Могут ли последовательные нажатия приходить на разные ядра?

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Indaril_Shpritz

устаревшая, но используемая?

Все PCI-express устройства используют MSI. Поэтому — смотря где. Найдёшь компьютер с P4 — будет используемая.

На какое ядро придёт прерывание от клавиатуры?

У меня — на нулевое. У тебя — на произвольное. Зависит от конфигурации железа и ОС.

Могут ли последовательные нажатия приходить на разные ядра?

Почему нет?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Я нашел, как инициализируются ядра (они после инициализации в состоянии останова и ждут как раз прерывание)
http://webhome.csc.uvic.ca/~mcheng/360/xv6/html/dc/df6/lapic_8c.html#ae7f5e79...

вот туториал - http://pdos.csail.mit.edu/6.828/2011/labs/lab4/

но куда и как идут прерывания от клавиатуры мне непонятно до сих пор.

Indaril_Shpritz
() автор топика
Ответ на: комментарий от Indaril_Shpritz

Прерывания от i8042-совместимого контроллера клавиатуры (опять же, я хз, как оно устроено на современных системах вне режимов эмуляции) — это IRQ 1, которое приходит на I/O APIC, который пинает по собственной шине произвольное ядро, которое прыгает на обработчик прерывания, забирает из нужного порта код клавиши и кидает его в ОС-специфичный буфер ввода.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

пинает ... произвольное ядро

а я не уверен, что произвольное. Думаю, что он как-то програмимруется, какое конкретно ядро дёргать

Indaril_Shpritz
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.