(莱昂氏unix源代码分析导读-30) device

本文深入探讨Unix系统中Block Device的工作原理,解释了struct bdevsw结构及其作用,包括d_open、d_close、d_strategy等函数。文章以PDP-11/40为例,阐述了Block Device的配置表bdevsw[]以及如何通过该表进行设备操作,特别提到了RK磁盘设备和swapdev。同时,文章还介绍了devtab结构和其在设备状态管理中的应用。
摘要由CSDN通过智能技术生成

                    

                                                                 By cszhao1980

我们现在必须放下身段看一看低层的IO操作了,复杂繁琐的外设。

 

PDP-11/40拥有两种外设:

(1)         Block device

(2)         Character device

 

简单说来,Block deviceblock来单位操作数据,而character device则以character为单位

操作数据。我们本章只讨论block device

 

struct bdevswblock device的“操控开关”,通过这个结构可以对此设置执行各种操作,

它由4个指针组成:

4617: struct bdevsw {

4618:     int (*d_open)();      /指向该设备的open函数

4619:     int (*d_close)();      /指向该设备的close函数

4620:     int (*d_strategy)();    /指向该设备的strategy函数(what’s this?)

4621:     int *d_tab;           /指向该设备的struct devtab

4622: } bdevsw[ ];

 

bdevsw [ ]数组则是unixblock device配置表:

4656: int (*bdevsw[])()

4657: {

4658:     &nulldev,    &nulldev,    &rkstrategy,    &rktab,     /* rk */

4659:     &nodev,     &nodev,     &nodev,        0,         /* rp */

…….

4667: };

 

对任何block device的操作都通过bdevsw [ ]数组进行——这样做的好处是高层函数可以

以相同的方法处理任何一种block device,即通过为block device配置各自的操作函数,就

屏蔽掉了低层的细节。

 

在我们讨论的模型中,仅有一种block device,即RK磁盘,而相应的bdevsw [ ]数组仅配置了

一种block设备。其他设备的操作函数为nodev,它将返回一个错误:

6566: nodev()

6567: {

6569:     u.u_error = ENODEV;

6570: }

 

【注】nulldev不同,它是个空操作(refer to 6577行)。

 

swapdev 是系统定义的用于swap的设备,它的高8bit称为major device number,将作为该设备

bdevsw数组内的index,如下所示,本模型中定义的swap设备为RK磁盘:

      4696:  int swapdev {(0<<8)|0

 

而低8bitminor设备号,与具体设备密切相关,在讲解RK磁盘时我们会讲到。

 

 系统也定义了majorminor,如下所示:

                 4604: struct {

4605:     char d_minor;

4606:     char d_major;

4607: };

 

还有个结构与device有关:

4551: struct devtab

4552: {

4553:     char d_active; /* busy flag */

4554:     char d_errcnt; /* error count (for recovery) */

4555:     struct buf *b_forw; /* first buffer for this dev */

4556:     struct buf *b_back; /* last buffer for this dev */

4557:     struct buf *d_actf; /* head of I/O queue */

4558:     struct buf *d_actl; /* tail of I/O queue */

4559: };

bdevsw结构中的d_tab指针实际上就指向该结构的变量。它记录的其实是设备的“状态”信

息——每个device在系统中都有一个对应的devtab结构,比如RK磁盘驱动器的为“rktab”:

5386: struct devtab rktab;

 

我们来看一下devtab的各项:

1 d_active:“忙”标记。一般说来,在启动device操作时,应该置1,当操作结束后,置0

2 d_errcnt;  error count (for recovery)

3.剩下的是4个指向struct buf的指针,可分为两对儿:

    1 d_actfd_actl

          构成了device的任务队列,其中,d_actf指向“对”头;d_actl指向“对”尾。

os要启动外设操作时,就在队列里添加一项,而外设操作结束后,会删除一项。

 

    2 b_forwb_back

          缓存区的头和尾。

 

 

博客地址:http://blog.csdn.net/cszhao1980

博客专栏地址:http://blog.csdn.net/column/details/lions-unix.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 献辞 致谢 序(一) 序(二) 历史注记 上篇 UNIX操作系统版本6源代码 UNIX操作系统过程分类索引 3 UNIX操作系统文件及过程 5 UNIX操作系统定义的符号列表 7 UNIX操作系统源代码交叉引用列表 9 第一部分 初始化、进程初始化 25 第二部分 陷入、中断、系统调用和 进程管理 75 第三部分 程序交换、基本输入/输出、 块设备 109 第四部分 文件和目录、文件系统、管道 133 第五部分 面向字符的特殊文件 181 下篇 莱昂UNIX源代码分析 前言 207 第1章 绪论 209 1.1 UNIX操作系统 209 1.2 公用程序 209 1.3 其他文档 210 1.4 UNIX程序员手册 210 1.5 UNIX文档 211 1.6 UNIX操作系统源代码 211 1.7 源代码中各部分 212 1.8 源代码文件 212 1.9 分析的使用 212 1.10 对程序设计水平的一条注释 212 第2章 基础知识 214 2.1 处理机 214 2.2 处理机状态字 214 2.3 通用寄存器 214 2.4 指令集 215 2.5 寻址方式 216 2.5.1 寄存器方式 217 2.5.2 寄存器延迟方式 217 2.5.3 自动增1方式 217 2.5.4 自动减1方式 217 2.5.5 变址方式 217 2.5.6 立即方式 218 2.5.7 相对方式 218 2.6 UNIX汇编程序 219 2.7 存储管理 219 2.8 段寄存器 220 2.9 页说明寄存器 220 2.10 存储分配 220 2.11 状态寄存器 221 2.12 “i”和“d”空间 221 2.13 启动条件 221 2.14 专用设备寄存器 221 第3章 阅读“C”程序 222 3.1 某些选出的例子 222 3.2 例1 222 3.3 例2 223 3.4 例3 223 3.5 例4 225 3.6 例5 225 3.7 例6 227 3.8 例7 227 3.9 例8 228 3.10 例9 228 3.11 例10 229 3.12 例11 229 3.13 例12 230 3.14 例13 230 3.15 例14 231 3.16 例15 231 3.17 例16 232 3.18 例17 233 第4章 概述 235 4.1 变量分配 235 4.2 全局变量 235 4.3 “C”预处理程序 235 4.4 第一部分 236 4.4.1 第1组“.h”文件 236 4.4.2 汇编语言文件 237 4.4.3 在第一部分中的其他文件 237 4.5 第二部分 237 4.6 第三部分 238 4.7 第四部分 238 4.8 第五部分 239 第一部分 初始化、进程初始化 第5章 两个文件 241 5.1 文件malloc.c 241 5.1.1 列表维护规则 241 5.1.2 malloc(2528) 242 5.1.3 mfree(2556) 243 5.1.4 结论 244 5.2 文件prf.c 244 5.2.1 printf(2340) 244 5.2.2 printn(2369) 245 5.2.3 putchar(2386) 246 5.2.4 panic(2419) 247 5.2.5 prdev(2433)、deverror(2447) 247 5.3 包含的文件 247 第6章 系统初启 249 6.1 操作员的动作 249 6.2 start(0612) 249 6.3 main(1550) 251 6.4 进程 252 6.5 proc〔0〕的初始化 252 6.6 sched(1940) 253 6.7 sleep(2066) 253 6.8 swtch(2178) 253 6.9 再回到main 254 第7章 进程 256 7.1 进程映像 256 7.2 proc结构(0358) 257 7.3 user结构(0413) 257 7.4 每个进程数据区 258 7.5 段 258 7.6 映像的执行 258 7.7 核心态执行 259 7.8 用户态执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值