Skip to content

14 块设备初始化blk dev init:读取硬盘前的准备工作

上一讲我们说到中断初始化 trap_init,它可以设置中断描述符表中的一些中断处理函数,比如键盘中断、硬盘中断等等,是我们学到的main方法中的第三个初始化函数。

这一讲,我们会看到块设备初始化的过程,为后续读写磁盘做准备。

我们接着往下看,blk_dev_init方法。

// init/main.c
void main(void) {
    ...
    blk_dev_init();
    ...
}

直译过来就是块设备初始化。

块设备初始化

我们知道,读取硬盘数据到内存中,是操作系统的一个基础功能。这个过程需要有块设备驱动程序、文件系统、缓冲区,甚至进程的阻塞与唤醒等功能的支持。

但不要慌,我们就按照源码的顺序,看看这个块设备初始化究竟在搞什么鬼。

// kernel/blk_drv/ll_rw_blk.c
void blk_dev_init(void) {
    int i;
    for (i=0; i<32; i++) {
        request[i].dev = -1;
        request[i].next = NULL;
    }
}

我没看错吧,这也太简单了吧?

就是给 request 这个数组前 32 个元素结构体中的两个属性 devnext 附上值,看这两个值 -1NULL 也大概可以猜出,这是没有任何作用时的初始化值。