Обычно ядро переводит коды сканирования клавиатуры в символы ASCII, которые вы можете прочитать на tty.Но есть способы получить необработанные коды сканирования, например, посмотреть, как showkey(1)
делает это (http://kbd -project.org / ) на текстовой консоли.https://wiki.archlinux.org/index.php/Keyboard_input
https://github.com/legionus/kbd/blob/2.0.4/src/showkey.c показывает, что вы можете использовать ioctl(2)
в дескрипторе файла для консольного терминала , чтобы установить для режима перевода KBD значение RAW (коды сканирования) илиСРЕДНЯЯ (ключевые коды).Затем вы можете делать обычные read
системные вызовы.
ioctl(fd, KDSKBMODE, show_keycodes ? K_MEDIUMRAW : K_RAW)
Очевидно, что вы можете выполнять эти системные вызовы из рукописного asm, используя syscall
на x86-64 или int 0x80
на 32-битной x86,поиск номеров системных вызовов в asm/unistd_64.h
и значений других констант в соответствующих заголовках.
showkey
заботится о настройке сторожевого таймера для чистого выхода и перехватасигналы, потому что при этом перехватывает ключи до , ядро обрабатывает последовательности control-C или ctrl + alt + f2 .Поэтому без тайм-аута не было бы возможности выйти из программы.И если вы вышли без восстановления нормального режима, на консоли не было бы возможности набрать команду для восстановления нормального режима клавиатуры.