linux内核时的键盘驱动谁解释下mode、leds、e0、_keyboard_interrupt的这种用法貌似不是c语言,难道是intel x86的汇编语法?
时间:10-02
整理:3721RD
点击:
#inlcude <linux/config.h>
.text
.globl _keyboard_interrupt
size =1024 //键盘缓冲区的长度
head =4 //缓冲区开头指针字段偏移。
tail =8 //缓冲区尾指针字段偏移
proc_list =12 //等待改缓冲区队列的进程字段偏移
buf =16 //缓冲区字段偏移
/*mode是键盘特殊的按下状态标志
表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。
位7 caps键按下:
位6 caps键的状态(应该与leds中的对应标志位一样):
位5 右alt键按下:
位4 左alt键按下:
位3 右ctrl键按下:
位2 左ctrl键按下:
位1 右shift键按下:
位0 左shift键按下。*/
mode: .byte 0 //caps,alt,ctrl and shift mode
//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态
//位7-3 全0不用
//位2 caps-lock
//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
//位0 scroll-lock
leds: .byte 2 //num-lock,caps,scroll-lock(num-lock on)
//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
//位1 =1 收到0xe0标志
//位0 =1 收到0xe1标志
e0: .byte 0
/*
con_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符
*/
////键盘中断处理程序入口
_keyboard_interrupt:
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %ds
pushl %es
movl $0x10,%eax
mov %ax,%ds
mov %ax,%al
xorl %al,%al
inb $0x60,%al
cmpb $0xe0,%al
je set_e0
cmpb $0xe1,%al
je set_e1
call key_table(,%eax,4)
movb $0,e0
......(略)
最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。
希望可以帮助到你!
.text
.globl _keyboard_interrupt
size =1024 //键盘缓冲区的长度
head =4 //缓冲区开头指针字段偏移。
tail =8 //缓冲区尾指针字段偏移
proc_list =12 //等待改缓冲区队列的进程字段偏移
buf =16 //缓冲区字段偏移
/*mode是键盘特殊的按下状态标志
表示大小写转换键(caps)、交换键(alt)、控制键(ctrl)和换挡键(shift)的状态。
位7 caps键按下:
位6 caps键的状态(应该与leds中的对应标志位一样):
位5 右alt键按下:
位4 左alt键按下:
位3 右ctrl键按下:
位2 左ctrl键按下:
位1 右shift键按下:
位0 左shift键按下。*/
mode: .byte 0 //caps,alt,ctrl and shift mode
//数字锁定键(num-lock)、大小写转换键(caps-lock)和滚动锁定的leds发光管状态
//位7-3 全0不用
//位2 caps-lock
//位1 num-lock(初始设置1;也即设置数字锁定键(num-lock on))
//位0 scroll-lock
leds: .byte 2 //num-lock,caps,scroll-lock(num-lock on)
//当扫描码是(0xe0或者0xe1时),置改标志,表示起手还跟着1个或者2个字符扫描码
//位1 =1 收到0xe0标志
//位0 =1 收到0xe1标志
e0: .byte 0
/*
con_int 是实际的中断处理子程序,用于读键盘扫描码并将其转换成相应的ascii字符
*/
////键盘中断处理程序入口
_keyboard_interrupt:
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %ds
pushl %es
movl $0x10,%eax
mov %ax,%ds
mov %ax,%al
xorl %al,%al
inb $0x60,%al
cmpb $0xe0,%al
je set_e0
cmpb $0xe1,%al
je set_e1
call key_table(,%eax,4)
movb $0,e0
......(略)
内核一般是用汇编写的。
首先,你的这个文件名应该是linux/kernel/keyboard.S ,从.S就可以说明,它不是C语言文件 ,而应该是汇编语言,至于是什么语法,这个要看具体的CPU芯片,虽然汇编语言有许多相似的地方,但具体的芯片或公司有略微的差别,故不能简单地说是Intel x86汇编语法。另外,后缀为大S,引入c++预编译,使得汇编程序可以用预处理命令。其次 ,文件的最开始处的.text说明下面的程序或定义的变量,是可执行代码,即申明代码段(另外,一般还有.data,表示已初始化的数据段,.bss表示未初始化的数据段)。而.global指定了入口函数,其中keyboard_interrupt为入口函数的名字。
- .text
- .globl keyboard_interrupt
- mode: .byte 0 /* caps, alt, ctrl and shift mode */
- leds: .byte 2 /* num-lock, caps, scroll-lock mode (nom-lock on) */
- e0: .byte 0
- keyboard_interrupt:/*这个是键盘中断函数,没几行代码,每次按键盘,就进入这里*/
- pushl %eax
最后,mode、leds、e0表示定义的变量,它们的类型都是byte,并分别初始化为0,2,0。
希望可以帮助到你!
表示不怎么会用键盘啊