[第14天] 高分辨率和键盘输入

好久没有更新了。最近搞怎么黑人搞上瘾了。所以没有时间更新这个了。当然不能半途而废。

今天的主要内容是更新分辨率和接收键盘输入。分辨率这部分我早就实现了。因为原来320×200的分辨率看着实在恶心。而且这部分也不难,主要涉及硬件,所以直接跳过。

基本原理:

键盘的原理是什么?学过电子的应该知道,TM的映射那么多键需要很多线,而且还有组合这不是坑爹吗?我也不是很清楚,概括来说就是有个单片机一直在扫描电路,看看有没有接通,接通了就传给计算机相应代码。具体可以看这个。搞过下面的那个板子的同学肯定也能理解原理。但是如何做到这么多键位我就有点糊涂了。

danpianji

按下键盘的按键后,硬件会传入一个代码,这个代码代表什么字符就需要系统判断。一般的映射是Original XT scan code set。按下A就传如1E,松开传入9E。我也实现了这个。

代码实现:

其中接收部分之前就已经完成。就是传入到FIFO里。然后要做的就是解释代码。为了方便起见,用个数组。下面就是主要代码。

参考:

  1. OS dev
  2. Computer engineering
  3. linux atkbd.c
  4. how keyboard works

[第7天] 键盘 FIFO缓冲和bochs

       今天最大的收获是从qemu转向bochs。不是说qemu不好,而是bochs专业,可以debug,是制作操作系统必备啊!qemu是稳定,是为真正的操作系统准备的。真是相见恨晚,虽然之前听说过bochs,而且我也查过qemu怎么dump memory,为什么就没有发现bochs自带这个功能。。现在亡羊补牢,再也不用手动判断内存中的内容了。。苦水吐不完啊,当时GDT折腾的时候,二分法找内存对应位置的值,想想我真是太机智了,根据HLT之后CPU占有率来判断,那个内存是不是测试的值。

       然后今天主要是讲了获取键盘按键编码和缓冲。然后顺便打开了鼠标的开关。主要内容是FIFO缓冲,这个学过编程就是小意思啊。

Bochs准备:

       由于Arch自带的bochs没有gui,所以还得手动编译。根据osdev,configure一下就可以make了。最后会出个问题,就是libgui.a(gtk_enh_dbg_osdep.o): undefined reference to symbol ‘pthread_create@@GLIBC_2.2.5’。 原因是Makefile某个地方没有加-lpthread。容易解决。编译好了之后先要配置。

  1. 准备硬盘文件。使用bximage命令即可。我创建了1个1024mb的。要记下配置。
  2. bochsrc,这就是启动bochs的配置文件。根据Search Order,选择一个合适的位置。我的配置文件如下:
  3. bximage

  4. 然后就可以启动了。bochs -q。bochs

按键处理:

       感觉这个没有什么要特别注意的地方。就是处理中断后,把数据获取。由于不能让CPU被中断处理打断,一般都要将获取的值缓冲起来,然后内核主程序循环查看缓冲区是否有新数据。这就引发了下面的内容。FIFO。

FIFO:

       作者还是使用最简单的方法实现了FIFO,我也就不管了,跟着照做。具体代码见github

使能鼠标:

       鼠标由于各种原因,需要两步才能启用。具体原理我也不是很明白,我觉得这不是重点,所以就快速通过。下图1E是按下A松开的按键编码,00是获取的鼠标数据。

keyboard and mouse

链接:

  1. bochsrc
  2. bochs hacking guide