Linux asm - int 16h 模拟读取原始键盘扫描码
Linux asm - int 16h analogue to read raw keyboard scancodes
为了我的学习,我需要在 asm 上写一个程序,它会等到按下键盘键,然后打印它的扫描码和按键字符的 ASCII 码。
我知道 BIOS 的 int 16h
可以完成这项工作,但我现在正在使用 Linux,找不到合适的模拟系统调用。
我应该用什么来完成这个任务?我目前正在使用 Debian Stretch 和 NASM 作为我的汇编代码。
通常内核会将键盘扫描码转换为您可以在 tty 上读取的 ASCII 字符。但是有一些方法可以获得原始扫描码,例如看看如何 showkey(1)
does it (http://kbd-project.org/) on a text console. https://wiki.archlinux.org/index.php/Keyboard_input
https://github.com/legionus/kbd/blob/2.0.4/src/showkey.c 表明您可以 在控制台终端的文件描述符上使用 ioctl(2)
将 KBD 转换模式设置为 RAW(扫描码)或 MEDIUMRAW(键码)。然后就可以进行正常的read
系统调用了。
ioctl(fd, KDSKBMODE, show_keycodes ? K_MEDIUMRAW : K_RAW)
显然,您可以在 x86-64 上使用 syscall
或在 32 位 x86 上使用 int 0x80
从 hand-written asm 进行这些系统调用,在 [=16 中查找系统调用编号=],其他常量的值分别在headers.
showkey
负责设置看门狗计时器以干净地退出并捕获信号,因为这样做会在 内核进程 之前拦截键control-C 或 ctrl+alt+f2 序列。所以没有超时,就没有办法退出程序。如果您在未恢复正常模式的情况下退出,则无法在控制台上键入 运行 恢复正常键盘模式的命令。
为了我的学习,我需要在 asm 上写一个程序,它会等到按下键盘键,然后打印它的扫描码和按键字符的 ASCII 码。
我知道 BIOS 的 int 16h
可以完成这项工作,但我现在正在使用 Linux,找不到合适的模拟系统调用。
我应该用什么来完成这个任务?我目前正在使用 Debian Stretch 和 NASM 作为我的汇编代码。
通常内核会将键盘扫描码转换为您可以在 tty 上读取的 ASCII 字符。但是有一些方法可以获得原始扫描码,例如看看如何 showkey(1)
does it (http://kbd-project.org/) on a text console. https://wiki.archlinux.org/index.php/Keyboard_input
https://github.com/legionus/kbd/blob/2.0.4/src/showkey.c 表明您可以 在控制台终端的文件描述符上使用 ioctl(2)
将 KBD 转换模式设置为 RAW(扫描码)或 MEDIUMRAW(键码)。然后就可以进行正常的read
系统调用了。
ioctl(fd, KDSKBMODE, show_keycodes ? K_MEDIUMRAW : K_RAW)
显然,您可以在 x86-64 上使用 syscall
或在 32 位 x86 上使用 int 0x80
从 hand-written asm 进行这些系统调用,在 [=16 中查找系统调用编号=],其他常量的值分别在headers.
showkey
负责设置看门狗计时器以干净地退出并捕获信号,因为这样做会在 内核进程 之前拦截键control-C 或 ctrl+alt+f2 序列。所以没有超时,就没有办法退出程序。如果您在未恢复正常模式的情况下退出,则无法在控制台上键入 运行 恢复正常键盘模式的命令。