hd_init
1 2 3 4 5 6
| void main(void) { ... hd_init(); floppy_init(); ... }
|
最后一个是软盘初始化,现在已经被淘汰了,所以硬盘初始化就是最后一个需要初始化的部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| struct blk_dev_struct { void (*request_fn)(void); struct request * current_request; };
extern struct blk_dev_struct blk_dev[NR_BLK_DEV];
struct blk_dev_struct blk_dev[NR_BLK_DEV] = { { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL } };
void hd_init(void) { blk_dev[3].request_fn = do_hd_request; set_intr_gate(0x2E,&hd_interrupt); outb_p(inb_p(0x21)&0xfb,0x21); outb(inb_p(0xA1)&0xbf,0xA1); }
|
首先定义了一个数组blk_dev,并将第三个的request_fn设置为do_hd_request,以后有关fd的操作都会使用初始化设置的do_hd_request函数来处理。
第二行是很熟悉的中断初始化,将中断号0x2E和hd_interrupt绑定,当硬盘处理结束后向CPU发送0x2E中断,CPU就会去执行hd_interrupt。

最后两行也是熟悉的端口操作,这些是硬件规定的操作,意思是允许硬盘发送中断请求。
至此内核的所有初始化就结束了。