且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.11 初始化硬盘

更新时间:2021-09-21 09:35:50

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形象地给出了初始化过程。
《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.11 初始化硬盘