16)硬盘初始化

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];

// kernel/blk_drv/ll_rw_blk.c
struct blk_dev_struct blk_dev[NR_BLK_DEV] = {
{ NULL, NULL }, /* no_dev */
{ NULL, NULL }, /* dev mem */
{ NULL, NULL }, /* dev fd */
{ NULL, NULL }, /* dev hd */
{ NULL, NULL }, /* dev ttyx */
{ NULL, NULL }, /* dev tty */
{ NULL, NULL } /* dev lp */
};

// kernel/blk_drv/hd.c
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

最后两行也是熟悉的端口操作,这些是硬件规定的操作,意思是允许硬盘发送中断请求。

至此内核的所有初始化就结束了。


16)硬盘初始化
https://carl-5535.github.io/2024/11/08/Linux0.11/16)硬盘初始化/
作者
Carl Chen
发布于
2024年11月8日
许可协议