使用C语言写内核遇键盘屏幕支持难题?这篇教程为你排忧解难!

在我之前的文章中,我介绍了如何构建一个基本的x86内核,该内核可以使用GRUB引导,在保护模式下运行,并在屏幕上打印字符串。

今天,我们将扩展这个内核,添加键盘驱动程序,使其能够从键盘读取字母a-z和数字0-9,并将它们打印在屏幕上。我们通过输入输出(I/O)端口与I/O设备进行通信。这些端口只不过是x86 I/O总线上的特定地址。对这些端口的读写操作是通过处理器内置的特定指令来完成的。

端口的读写操作

read_port:
    mov edx, [esp + 4]
    in al, dx    
    ret

write_port:
    mov   edx, [esp + 4]    
    mov   al, [esp + 4 + 4]  
    out   dx, al  
    ret

I/O端口是使用x86指令集的一部分——inout指令来访问的。

read_port函数中,端口号作为参数传入。当编译器调用你的函数时,它会将所有参数压入堆栈。通过堆栈指针将参数复制到寄存器edx中。寄存器dxedx的低16位。这里的in指令读取由dx指定编号的端口,并将结果存储在al中。寄存器aleax的低8位。如果你还记得大学课程的内容,函数返回值是通过eax寄存器接收的。因此,read_port函数让我们能够读取I/O端口。

扫描二维码关注微信公众号,回复密码,即可获取密码

阅读剩余
THE END