📜  引导程序 3 中的 kbd (1)

📅  最后修改于: 2023-12-03 15:25:34.691000             🧑  作者: Mango

引导程序 3 中的 kbd

简介

引导程序 3(Bootloader 3)是用于启动操作系统的一段程序,而其中的 kbd 模块则是用于读取键盘输入的部分代码。在 BIOS 初始化完成后,Bootloader 3 会被加载到内存中,接着它会执行 kbd 模块,将用户的键盘输入读入到操作系统中。

kbd 模块代码分析

kbd 模块主要包含两个函数:kbd_init() 和 kdb_getc()。

kbd_init()

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()

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 模块代码的分析,我们可以更好地理解操作系统启动的过程。