📅  最后修改于: 2023-12-03 15:25:34.691000             🧑  作者: Mango
引导程序 3(Bootloader 3)是用于启动操作系统的一段程序,而其中的 kbd 模块则是用于读取键盘输入的部分代码。在 BIOS 初始化完成后,Bootloader 3 会被加载到内存中,接着它会执行 kbd 模块,将用户的键盘输入读入到操作系统中。
kbd 模块主要包含两个函数:kbd_init() 和 kdb_getc()。
kbd_init() 函数用于初始化键盘控制器,并将其设置为能够产生中断。在初始化完成后,键盘控制器可以将用户的键盘输入读取到内存中的键盘缓冲区中。
kbd_init:
; 将键盘控制器设置为能够产生中断
in al, 0x64
or al, 0x80
out 0x64, al
in al, 0x60
and al, 0x7f
out 0x64, al
; 开启键盘控制器的所有按键中断
mov al, 0x60
out 0x64, al
in al, 0x60
or al, 0x80
out 0x64, al
mov al, 0x20
out 0x20, al
; 设置键盘缓冲区
mov BYTE [kbd_head], 0
mov BYTE [kbd_tail], 0
ret
kbd_getc() 函数用于从键盘缓冲区中读取一个字符,并返回该字符的 ASCII 码值。如果缓冲区中没有字符,则该函数会等待直到有字符输入。
kbd_getc:
cli
; 判断键盘缓冲区是否为空
cmp BYTE [kbd_head], BYTE [kbd_tail]
je .wait
; 从缓冲区中读取一个字符
mov al, [kbd_buf + BYTE [kbd_tail]]
; 更新缓冲区头尾指针
inc BYTE [kbd_tail]
and BYTE [kbd_tail], KBD_BUF_SIZE - 1
sti
; 返回该字符的 ASCII 码值
ret
.wait:
; 等待有字符输入
sti
hlt
jmp kbd_getc
kbd 模块是 Bootloader 3 中的一个关键模块,它负责读取用户的键盘输入并将其传递给操作系统。通过对 kbd 模块代码的分析,我们可以更好地理解操作系统启动的过程。