哈哈,终于开始写操作系统实验啦,简直就是心魔了,看我这次怎么打败这个大boss!
主程序
首先从os-lab/src/main.c这里开始吧,看看主程序做了些什么。
void game_init()
{
init_serial();
init_timer();
init_idt();
init_intr();
set_timer_intr_handler(timer_event);
set_keyboard_intr_handler(keyboard_event);
printk("game start!\n");
enable_interrupt();
main_loop();
assert(0);
}
串行接口
第一句话就是初始化串行串口,它在os-lab0/include/game.h中定义,在os-lab0/src/device/serial.c中实现
微信计算机主机与外部设备连接,基本使用了两类接口:串行接口serial port和并行接口parallel port。
并行接口是指数据的各位同时进行传说,所以传输速度快,但是当传输距离较远,位数也多时,会使通信线路变复杂,成本也就提高了。
串行接口则是将数据一位位地顺序传送,所以通信线路简单,只需要一对传输线就可以实现双向通信,还可以使用电话线,使得成本大大降低。
内联汇编
in_byte和out_byte是对计算机硬件中的端口进行读写,所以需要用到内联汇编,相关可见。。。
in_byte便是从端口port处读入数据,out_byte则是将数据写入端口port处。
COM port
从代码中可以看出串行接口地址为0x3F8,why?还有接下来那些写端口的操作都是在干嘛呢?wiki中是这样介绍的
串行接口一般有4组COM(comunication) port,一般是使用前两组COM1和COM2,四组COM port的端口起始位置分别为:
COM Port | IO Port |
---|---|
COM1 | 3F8h |
COM2 | 2F8h |
COM3 | 3E8h |
COM4 | 2E8h |
偏移量可以从0~7,不同偏移量对应不同寄存器,对应关系如下:
IO Port Offset | Setting of DLAB | Register mapped to this port |
---|---|---|
+0 | 0 | Data register. Reading this registers read from the Receive buffer. Writing to this register writes to the Transmit buffer. |
+1 | 0 | Interrupt Enable Register. |
+0 | 1 | With DLAB set to 1, this is the least significant byte of the divisor value for setting the baud rate. |
+1 | 1 | With DLAB set to 1, this is the most significant byte of the divisor value. |
+2 | - | Interrupt Identification and FIFO control registers |