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。
分为高8bit的major号,和低8bit的minor号;
所谓的minor号对不同的设备会有不同的含义,等到介绍RK磁盘时我们就会了解;
(2) b_wcount——要传递的word数;
(3) b_addr、b_xmem—— high、low 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