Есть число доступных решений для отладки ядра; Вот пара, которую я использовал:
gdb
; gdb
. Оба они могут привести к зависанию ЦП при запуске эмулируемой системы, что позволяет отладить начальную загрузку. При использовании в качестве целей для gdb
они также поддерживают присоединение исходного кода, чтобы вы могли следовать коду C (или теоретически чему-либо gdb
).
Нажатие C при нажатой Ctrl отправляет нажатие клавиши, за которым следует событие X11, в эмулятор терминала.
После этого события (обычно при нажатии клавиши) эмулятор терминала записывает байт 0x3 ( ^ C
) в свой файловый дескриптор на стороне ведущего устройства псевдотерминала.
Если параметр isig
termios устройства включен и параметр intr
установлен на этот байт 0x3, то ядро отправляет сигнал SIGINT всем членам Группа процессов переднего плана оконечного устройства (еще один атрибут, хранящийся в устройстве pty).В этом случае байт 0x3 не будет доступен для чтения на ведомой стороне pty.
Обычно это интерактивные оболочки, которые создают группы процессов (с помощью setpgid ()
) для заданий оболочки и решают, какую из них поместить на передний план (с помощью tcsetpgrp ()
, чтобы установить этот атрибут. устройства pty) или нет.
Например, когда вы запускаете по приглашению интерактивной оболочки:
foo | bar
Оболочка запускает новую группу процессов с двумя процессами (в которых она выполняет foo
и bar
после подключив их стандартный ввод / вывод с помощью трубы) и помещает эту группу на передний план. Оба процесса получат SIGINT, если вы нажмете Ctrl-C.
В:
foo | bar &
То же самое, но группа процессов не выводится на передний план (и оболочка также не ждет этого, поэтому вы можете вводить другие команды). Эти процессы не получат SIGINT при нажатии Ctrl-C, но могут быть приостановлены, если они попытаются прочитать с устройства tty.
Дополнительная литература: Каковы обязанности каждого компонента псевдотерминала (PTY) (программное обеспечение, ведущая сторона, ведомая сторона)?