今天最大的收获是从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。容易解决。编译好了之后先要配置。
- 准备硬盘文件。使用bximage命令即可。我创建了1个1024mb的。要记下配置。
- bochsrc,这就是启动bochs的配置文件。根据Search Order,选择一个合适的位置。我的配置文件如下:
- 然后就可以启动了。bochs -q。
1 2 3 4 5 6 7 8 9 10 11 | # System configuration. romimage: file=$BXSHARE/BIOS-bochs-latest vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest megs: 256 # Hard disks. ata0-master: type=disk, path="c.img", cylinders=2080, heads=16, spt=63 display_library: x, options="gui_debug" floppya: 1_44="boot.img", status=inserted boot: floppy |
按键处理:
感觉这个没有什么要特别注意的地方。就是处理中断后,把数据获取。由于不能让CPU被中断处理打断,一般都要将获取的值缓冲起来,然后内核主程序循环查看缓冲区是否有新数据。这就引发了下面的内容。FIFO。
FIFO:
作者还是使用最简单的方法实现了FIFO,我也就不管了,跟着照做。具体代码见github。
使能鼠标:
鼠标由于各种原因,需要两步才能启用。具体原理我也不是很明白,我觉得这不是重点,所以就快速通过。下图1E是按下A松开的按键编码,00是获取的鼠标数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #define KEYCMD_SENDTO_MOUSE 0xd4 #define MOUSECMD_ENABLE 0xf4 void enable_mouse(void) { // enable mouse wait_KBC_sendready(); _io_out8(PORT_KEYCMD, KEYCMD_SENDTO_MOUSE); wait_KBC_sendready(); _io_out8(PORT_KEYDAT, MOUSECMD_ENABLE); return; // may return ACK 0xfa } |
链接: