11)块设备初始化

blk_dev_init

1
2
3
4
5
6
// init/main.c
void main(void) {
...
blk_dev_init();
...
}

块设备初始化是为后续读写磁盘做准备

块设备初始化

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

1
2
3
4
5
6
7
8
// 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个节点的dev初始化为-1,next初始化为NULL

request 结构体

1
2
3
4
5
6
7
8
9
10
11
12
// kernel/blk_drv/blk.h
struct request {
int dev; /* -1 if no request */
int cmd; /* READ or WRITE */
int errors;
unsigned long sector;
unsigned long nr_sectors;
char * buffer;
struct task_struct * waiting;
struct buffer_head * bh;
struct request * next;
};

这个结构体就代表了一次读写磁盘的请求

  • dev 表示设备号,-1 就表示空闲。
  • cmd 表示命令,其实就是 READ 或者 WRITE,也就表示本次操作是读还是写。
  • errors 表示操作时产生的错误次数。
  • sector 表示起始扇区。
  • nr_sectors 表示扇区数。
  • buffer 表示数据缓冲区,也就是读盘之后的数据放在内存中的什么位置。
  • waiting 是个 task_struct 结构,可以表示一个进程,也就表示是哪个进程发起了这个请求。
  • bh 是缓冲区头指针,这个后面讲完缓冲区的时候你就懂了,因为这个 request 是需要与缓冲区挂钩的。
  • next 指向了下一个请求项。

这个 request 结构可以完整描述一个读盘操作。然后那request 数组就是把它们都放在一起,并且它们又通过 next 指针串成链表


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