2012-02-03 3 views
6

Я пытаюсь отслеживать вызов функции высокого уровня, который блокирует определенный процесс. Примером такого является scanf, который блокирует терминал, пока не получит '\ n'. Теперь я проследил scanf до getc (scanf использует getc для получения символов из stdin). Мой вопрос: какой процесс требуется для интерпретации данных, поступающих с клавиатуры, вплоть до ядра и возврата getc? Также как scanf останавливает терминал (компьютер работает на холостом ходу или работает над другой задачей)? Thank YouОтслеживание системного вызова C блокировки

+3

Вы просите нас указать вам на 'strace', или вы спрашиваете, как блокируют системные вызовы в целом? – cha0site

+1

Если вам было интересно, как это делается на уровне ассемблера: http://www.programmersheaven.com/mb/x86_asm/295346/295346/keyboard-input/ :) – Vyktor

+2

Попробуйте запустить его под отладчиком, например gdb. Хит-контроль-С, затем введите «bt». Scanf вызывает getc, который вызывает чтение, который является системным кодом, который не возвращается, пока на самом деле не будет чего-то читать. Вы заблокированы в чтении. – wildplasser

ответ

5

Когда процесс выдает системный вызов (например, блокировка read(2)), процесс запускается в режиме ядра, то есть код ядра, обрабатывающий конкретный системный вызов, вызывается.

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

Затем ядро ​​возобновляет процесс, ожидающий ввода, и доставляет данные, копируя их из адресного пространства ядра в адресное пространство конкретного процесса.

1

Системный вызов позволяет программе пользователя запускаться в превалированном режиме. Когда пользовательская программа выполняет системный вызов, она генерирует прерывание 0x80. Когда ядро ​​получит прерывание, он выполнит поиск в таблице дескрипторов прерываний (IDT) для 0x80 и выполнит соответствующий обработчик (syscall). После выполнения этого обработчика управление будет передано в пользовательскую программу после копирования информации из памяти ядра в пользовательскую память.

В этом случае scanf отображается в библиотечную функцию «читать». Системный вызов «read» вызывает «sys_read», который затем считывает из входного потока STDIN с помощью getc. Надеюсь это поможет!

+0

Это не обязательно 'int 80h'. x86 также предоставляет SYSCALL/SYSENTER. –

Смежные вопросы