《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.6 初始化块设备请求项结构-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.6 初始化块设备请求项结构

简介: 本节书摘来自华章计算机《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》一书中的第2章,第2.6节,作者:新设计团队著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.6 初始化块设备请求项结构

Linux 0.11将外设分为两类:一类是块设备,另一类是字符设备。块设备将存储空间等分为若干同样大小的称为块的小存储空间,每个块有块号,可以独立、随机读写。硬盘、软盘都是块设备。字符设备以字符为单位进行I/O通信。键盘、早期黑屏命令行显示器都是字符设备。
进程要想与块设备进行沟通,必须经过主机内存中的缓冲区。请求项管理结构request[32]就是操作系统管理缓冲区中的缓冲块与块设备上逻辑块之间读写关系的数据结构。
请求项在进程与块设备进行I/O通信的总体关系如图2-11所示。
操作系统根据所有进程读写任务的轻重缓急,决定缓冲块与块设备之间的读写操作,并把需要操作的缓冲块记录在请求项上,得到读写块设备操作指令后,只根据请求项中的记录来决定当前需要处理哪个设备的哪个逻辑块。

image

执行代码如下:

//代码路径: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所示。

image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: