此章堪称整本书中最难的一章了。。所以就以一个简单的任务开头:显示系统硬盘个数。
就在刚刚刷的代码基础上添加。。细节书上都有。。流水账之。。
步骤如下:
1,添加hd.c文件,在hd.c文件中添加Init_Hard_Disk函数,在此函数中把硬盘个数打印出来,使能级联中断和硬盘中断,硬盘中断处理函数使用 默认的处理函数。
kernel/hd.c
- /*
- By Marcus Xing
- kernel/hd.c
- 与硬盘驱动相关的代码
- */
- #include "type.h"
- #include "const.h"
- #include "console.h"
- #include "tty.h"
- #include "protect.h"
- #include "proc.h"
- #include "ipc.h"
- #include "proto.h"
- /*----------------------------------------------------------------Init_Hard_Disk
- 初始化硬盘驱动
- 显示硬盘个数,打开硬盘中断
- */
- void Init_Hard_Disk()
- {
- u8 *hd_num = (u8*)0x475; /* BIOS会在0x475地址处写入硬盘数 */
- /* 显示之 */
- Disp_Color_Str("Driver Num is ",Make_Color(RED,BLACK));
- Disp_Int(*hd_num);
- Disp_Str("/n");
- /* 由于硬盘中断在从片,所以必须先打开级联中断 */
- Enable_IRQ(CASCADE_IRQ);
- Enable_IRQ(AT_WINI_IRQ);
- }
2,在kernel.asm中调度进程前调用Init_Hard_Disk。
kernel/kernel/asm
- extern Init_Hard_Disk
- ...
- call Init_Hard_Disk ;初始化硬盘驱动,注意须在Init_All_TTY前调用
- call Init_All_TTY ;初始化所有的TTY
3,在protect.h中添加外中断的各中断向量的宏,使代码亲切可读。
include/protect.h
- /* 各外中断的IRQ号 */
- #define CLOCK_IRQ 0
- #define KEYBOARD_IRQ 1
- #define CASCADE_IRQ 2 /* cascade enable for 2nd AT controller */
- #define ETHER_IRQ 3 /* default ethernet interrupt vector */
- #define SECONDARY_IRQ 3 /* RS232 interrupt vector for port 2 */
- #define RS232_IRQ 4 /* RS232 interrupt vector for port 1 */
- #define XT_WINI_IRQ 5 /* xt winchester */
- #define FLOPPY_IRQ 6 /* floppy disk */
- #define PRINTER_IRQ 7
- #define AT_WINI_IRQ 14 /* at winchester */
还要在Init_Clock和Init_Keyboard.c中使用相应的宏,过程略。
修改makefile的过程略去。
OK,make,运行bochs,结果如图:
由于目前还没设置硬盘。。所以硬盘数为0。。