Какое аппаратное обеспечение использует ядро ​​linux для прерывания по таймеру

Процесс, запущенный из оболочки, имеет связанный с ним управляющий TTY, который они наследуют от оболочки, а также принадлежат к группе процессов. При запуске нескольких процессов в канале с |или использовании нотации подоболочки с ()все эти процессы запускаются с одной и той же группой процессов. Когда пользователь нажимает клавишу приостановки, обычно Ctrl -Z с клавиатуры, уровень TTY отправляет сигнал SIGTSTPвсем процессам в текущей группе процессов переднего плана, и родительская оболочка просыпается с сообщениемSIGCHLD(или возвращает вызовwait())для повторной обработки TTY. Оболочка отвечает за контроль над тем, какая группа процессов находится на переднем плане, поскольку она управляет TTY, а сама оболочка находится в своей собственной группе процессов.

Если процесс не является частью текущей группы процессов переднего плана для TTY, он будет автоматически остановлен уровнем TTY с SIGTTINпри попытке чтения с терминала. Например, отправка SIGCONTв интерактивный текстовый редактор, такой как vim, возобновит его, но он немедленно получит SIGTTIN, как только вызовет read(), чтобы получить следующее нажатие клавиши с клавиатуры. Оболочка должна быть уведомлена с помощью директивы управления заданиями fgо том, что она должна переместить vim в группу процессов переднего плана, прежде чем возобновить ее, тем самым удаляя оболочку из переднего плана.

3
31.10.2019, 06:00
2 ответа

TSC представляет собой регистр x86, подсчитывающий тактовые циклы -, поэтому устройством может быть ЦП , поскольку ЦП знает его частоту (более или менее ). С многоядерностью и SMP это создает некоторые проблемы. Я предполагаю, что для этого будет использоваться опция acpi_pmв качестве источника часов.

HPET(hpet)является альтернативой. Он был указан Intel (и Microsoft )в 2004 году для синхронизации мультимедиа «Мультимедийный таймер». Вики объясняет, что HPET et al. Ну, проблема действительно в том, как это все совместить.

И RTC предназначен для календаря и секунд, а не для найма -тиков. Но, в конце концов, ядро ​​может даже использовать это для калибровки в один миг.


"прерывание по таймеру"/"программируемый интервал/таймер прерывания" :Это должно быть определено в первую очередь; как и «MMU», вещи могут быть интегрированы в чип ЦП. Виртуализированный.


Вики-статья о APIC ближе к концу:

A VMware document notes that "software does not have a reliable way to determine its frequency. Generally, the only way to determine the local APIC timer’s frequency is to measure it using the PIT or CMOS timer, which yields only an approximate result.

Выше поясняется, что локальный apic интегрирован в процессор и что он имеет APIC-таймер . Так что это таймер в контроллере прерываний в процессоре.

Я думаю, что Q делает очень умный беспорядок сложной темы. Я пробую более точную формулировку:

Как калибруются jiffies? Какие источники синхронизации являются отдельными устройствами и как все это работает? Что такоеkernel/time/(680K )?

В Планирование пользовательских и ядерных потоков я отвечаю "Kconfig.hz", чтобы показать важность этого параметра. Только сейчас я понимаю, что это "HZ" означает, сколько джиффи в секунду вы хотите (между 100 и 1000 ).

[    0.000000] tsc: Detected 2300.000 MHz processor
[    0.000564] tsc: Detected 2304.000 MHz TSC

Эти две dmesgстроки являются смежными. Обратите внимание :Вначале, прежде чем ядро ​​сможет измерить время(в 0 микросекунд ), ядро ​​уже знает :2,3 ГГц.

Через полмиллисекунды он знает :2,304 ГГц.

Поскольку HZ (мгновений в секунду )может варьироваться от 100 до 1000 (за четыре шага ), эта дополнительная точность не имеет значения для реального размера временных интервалов. Если мы настроим только 100 джиффи в секунду, а он делает 90 или 110, мы этого прямо не заметим.

Косвенно, да :когда системное время идет слишком быстро, ФАЙЛЫ будут иметь неправильное время. После перезагрузки с чтением rtc -cmos это может означать, что файл был создан в будущем.

dmesg |grep часы


[    0.062253] clocksource: refined-jiffies:...
[    0.231167] clocksource: hpet:...
[    0.231239] hpet clockevent registered
[    0.254592] clocksource: tsc-early:...
[    0.438579] clocksource: jiffies:...
[    0.620170] PTP clock support registered
[    0.691015] clocksource: Switched to clocksource tsc-early
[    0.709307] clocksource: acpi_pm:...
[    0.874691] clocksource: tsc:...
[    0.874702] clocksource: Switched to clocksource tsc
[    1.047411] sched_clock: Marking stable (1050040970, -2655574)->(1055759219, -8373823)
[    1.066116] rtc_cmos rtc_cmos: setting system clock to 2019-11-03T08:23:32 UTC (1572769412)
[    4.509934] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock

Теперь, если бы кто-нибудь мог объяснить мне ВСЕ это, от (refined-)jiffiesв качестве источника часов до PHC clockдля модуля Ethernet?

У меня такие же /sysзаписи --интересные.

В kernel/time/tick-common.cя нашел это; он также должен учитывать горячее подключение процессора.

   /*
     * First device setup ?
     */
    if (!td->evtdev) {
            /*
             * If no cpu took the do_timer update, assign it to
             * this cpu:
             */
            if (tick_do_timer_cpu == TICK_DO_TIMER_BOOT) {
                    if (!tick_nohz_full_cpu(cpu))
                            tick_do_timer_cpu = cpu;

arch/x86/kernel/hpet.c

 /*
     * HPETs are a complete disaster. The compare register is
     * based on a equal comparison and neither provides a less
     * than or equal functionality (which would require to take
     * the wraparound into account) nor a simple count down event
     * mode. Further the write to the comparator register is
     * delayed internally up to two HPET clock cycles in certain
     * chipsets (ATI, ICH9,10). Some newer AMD chipsets have even
     * longer delays. We worked around that by reading back the
     * compare register, but that required another workaround for
     * ICH9,10 chips where the first readout after write can
     * return the old stale value. We already had a minimum
     * programming delta of 5us enforced, but a NMI or SMI hitting
     * between the counter readout...

Это вверху:

/* FSEC = 10^-15
   NSEC = 10^-9 */
#define FSEC_PER_NSEC                   1000000L

Фемтосекунды и «полная катастрофа»

-3
27.01.2020, 21:29

Я подозреваю, что вы читали это или что-то очень похожее(https://elinux.org/Kernel_Timer_Systems):

Timer Wheel, Jiffies and HZ (or, the way it was)

The original kernel timer system (called the "timer wheel) was based on incrementing a kernel-internal value (jiffies) every timer interrupt. The timer interrupt becomes the default scheduling quantum, and all other timers are based on jiffies. The timer interrupt rate (and jiffy increment rate) is defined by a compile-time constant called HZ. Different platforms use different values for HZ. Historically, the kernel used 100 as the value for HZ, yielding a jiffy interval of 10 ms. With 2.4, the HZ value for i386 was changed to 1000, yeilding a jiffy interval of 1 ms. Recently (2.6.13) the kernel changed HZ for i386 to 250. (1000 was deemed too high).

Похоже, вы спрашиваете: "Какой таймер умножает на мгновение?"

Путем исключения:RTC, более новый Local APIC и TSC не поддерживают прерывания с фиксированной частотой. Как указано ниже, HPET, похоже, заменяет PIT.

Итак, наиболее вероятным ответом будет HPET. Они основаны на счетчике, запускаемом кварцевым кристаллом, обычно на южном мосту . В этом случае jiffy отсчитываются одним компаратором HPET в периодическом режиме, который генерирует прерывание .

Однако в Linux возможно использование PIT или другого таймера (см.https://en.wikipedia.org/wiki/High_Precision_Event_Timer):

Use and compatibility

Operating systems designed before HPET existed cannot use HPET, so they use other timer facilities. Newer operating systems tend to be able to use either. Some hardware has both. Indeed, most current southbridge chips have legacy-supporting instances of PIT, PIC, Advanced Programmable Interrupt Controller (APIC) and RTC devices incorporated into their silicon whether or not they are used by the operating system, which helps very modern PCs run older operating systems.

Связь между PIT и PET

Программируемый таймер прерывания — это активный таймер, который прерывает нормальное выполнение кода. Похоже, что он был вытеснен HPET:

The Programmable Interval Timer (PIT) is an essential component of modern computers, especially in a multi-tasking environment. The PIT chip can be made ‒ by setting various register values ‒ to count up or down, at certain rates, and to trigger interrupts at certain times. The timer can be set into a cyclic mode, so that when it triggers it automatically starts counting again, or it can be set into a one-time-only countdown mode.

On newer hardware, a HPET (High Precision Event Timer), which is an evolution of the PIT concept, is likely to be available.

5
27.01.2020, 21:29

Теги

Похожие вопросы