2.6 初始化块设备请求项结构
Linux 0.11将外设分为两类:一类是块设备,另一类是字符设备。块设备将存储空间等分为若干同样大小的称为块的小存储空间,每个块有块号,可以独立、随机读写。硬盘、软盘都是块设备。字符设备以字符为单位进行I/O通信。键盘、早期黑屏命令行显示器都是字符设备。
进程要想与块设备进行沟通,必须经过主机内存中的缓冲区。请求项管理结构request[32]就是操作系统管理缓冲区中的缓冲块与块设备上逻辑块之间读写关系的数据结构。
请求项在进程与块设备进行I/O通信的总体关系如图2-11所示。
操作系统根据所有进程读写任务的轻重缓急,决定缓冲块与块设备之间的读写操作,并把需要操作的缓冲块记录在请求项上,得到读写块设备操作指令后,只根据请求项中的记录来决定当前需要处理哪个设备的哪个逻辑块。
执行代码如下:
- //代码路径:init/main.c:
- void main(void)
- {
- …
- blk_dev_init();
- …
- }
- //代码路径:kernel/blk_dev/blk.h:
- …
- #define NR_REQUEST 32
- 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; //说明request可以构成链表
- };
- …
- //代码路径:kernel/blk_dev/ll_rw_block.c:
- …
- struct request request[NR_REQUEST]; //数组链表
- …
- void blk_dev_init(void)
- {
- int i;
- for (i=0;i<NR_REQUEST;i++) {
- request[i].dev= -1; //设置为空闲
- request[i].next= NULL; //互不挂接
- }
- }
注意:request[32]是一个由数组构成的链表;request[i].dev = ?1说明了这个请求项还没有具体对应哪个设备,这个标志将来会被用来判断对应该请求项的当前设备是否空闲;request[i].next = NULL说明这时还没有形成请求项队列。初始化的过程和效果如图2-12所示。