(莱昂氏unix源代码分析导读-31) “缓存头”初探

                                 By cszhao1980

struct buf结构,又被称为“缓存头”结构,而buf[NBUF]数组被称为“缓存头”数组。

顾名思义,“缓存头”结构应该是用于缓存处理的,事实上,它确实有这个功能——

“缓存头”数组的每个entry可与系统的一个缓存区域对应,用于操控一个缓存区域。

 

4520: struct buf

4521: {

4522:     int b_flags;          /* see defines below */

4523:     struct buf *b_forw;    /* headed by devtab of b_dev */

4524:     struct buf *b_back;    /* " */

4525:     struct buf *av_forw;   /* position on free list, */

4526:     struct buf *av_back;   /* if not BUSY*/

4527:     int b_dev;           /* major+minor device name */

4528:     int b_wcount;        /* transfer count (usu. words) */

4529:     char *b_addr;        /* low order core address */

4530:     char *b_xmem;      /* high order core address */

4531:     char *b_blkno;       /* block # on device */

4532:     char b_error;         /* returned after I/O */

4533:     char *b_resid;       /* words not transferred after error */

4534:

4535: } buf[NBUF];                

 

但是,除此之外,“缓存头”结构还有一项重要的功能,即作为进程与外设驱动

程序之间的接口,进程要进行的操作和设置,通过“缓存头”结构传入,而操作

结果也通过这一结构传出。如swbuf就用于与swap外设(即RK磁盘)交互。

     4721: struct buf swbuf;

 

结构中很多项都是用来与外设进行交互的,如:

(1)         b_dev——device name

分为高8bitmajor号,和低8bitminor号;

所谓的minor号对不同的设备会有不同的含义,等到介绍RK磁盘时我们就会了解;

 

(2)         b_wcount——要传递的word数;

 

(3)         b_addrb_xmem—— highlow core(主存)address

此处的地址为实际的18位的物理地址,因此需要2个字来存放。其中,b_addr存放低16 bits

b_xmem存放高2 bits

 

这里很特别的使用了物理地址——这是因为,慢速的块设备往往通过DMA直接与主存进行信息

传递,这样才不会占用处理机资源,不至于让高速的处理机等待外设。而为块设备提供逻辑地

---物理地址转化功能是愚蠢的,因为这样做既不经济的,还会使外设固定于特定的系统,使

其失去通用性。

 

(4)         b_blkno —— block number。即要读/写的块号;

 

(5)         b_error/ b_resid —— refer to 其注释;

 

(6)         b_flags ——各种flag,如:

4571: #define B_WRITE 0    /表示要进行写操作

4572: #define B_READ 01    /表示要进行读操作  

 

除此之外,它还帮助devtab维护任务列表:

(1)         av_forw:后一个任务;

(2)         av_back:前一个任务

 

对缓存区和缓存头的探讨暂时就到这里,剩余的部分会在今后加以补充。

 

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值