2.11 初始化硬盘
硬盘的初始化为进程与硬盘这种块设备进行I/O通信建立了环境基础。
在hd_init()函数中,将硬盘请求项服务程序do_hd_request()与blk_dev控制结构相挂接,硬盘与请求项的交互工作将由do_hd_request()函数来处理,然后将硬盘中断服务程序hd_interrupt()与IDT相挂接,最后,复位主8259A int2 的屏蔽位,允许从片发出中断请求信号,复位硬盘的中断请求屏蔽位(在从片上),允许硬盘控制器发送中断请求信号。
执行代码如下:
//代码路径:init/main.c:
void main(void)
{
…
hd_init();
…
}
//代码路径:kernel/blk_dev/hd.c: //与rd_init类似,参看rd_init的注释
void hd_init(void)
{
blk_dev[MAJOR_NR].request_fn= DEVICE_REQUEST;//挂接do_hd_request()
set_intr_gate(0x2E,&hd_interrupt); //设置硬盘中断
outb_p(inb_p(0x21)&0xfb,0x21); // 允许8259A发出中断请求
outb(inb_p(0xA1)&0xbf,0xA1); // 允许硬盘发送中断请求
}
图2-27形象地给出了初始化过程。