博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(莱昂氏unix源代码分析导读-49) 字符缓冲区
阅读量:6819 次
发布时间:2019-06-26

本文共 1253 字,大约阅读时间需要 4 分钟。

                                                                                       by cszhao1980

同块设备一样,对字符设备的输入输出也是通过缓冲区来进行的。使用缓冲区有个额外

的好处,即以缓冲区为界,函数可分为高低两个层次。低层函数负责与实际设备交互,

而高层函数只与缓冲区打交道,只对缓冲区存取数据,这样可以蔽掉掉底层的许多细节。

 

对于字符缓冲区,有两个最重要结构,即cblockclist。前者是缓冲区本身,后者则用作

字符链表(队列)的头结点。莱昂在第23章中详细介绍了这两个struct,并对字符链表的

增删操作作了详细的分析,请您务必仔细阅读第23章的说明。

 

系统共有NCLIST个缓冲区资源:

8146 struct cblock cfree[NCLIST]

空闲的缓冲区都被链接在cfreelist链表中。

 

Cinit函数使用头插法建立cfreelist链表,该函数比较令人费解的是第8240行的for循环——该条

语句的作用是,使每个实际使用的缓冲区的起始地址都能够被8整除。莱昂其实已经说明了这

样做的原因,即这样设置之后,可以通过地址模除8的方式来判断clist的头尾指针是否移出了

一个缓冲区边界。

 

getcputc函数分别用来从缓冲区链表中getput char。奇怪的是,unix v6选择使用汇编来实现

这两个函数——也许是出于性能的考虑吧。

 

getc函数有一个参数,即缓冲区链表的头结点地址。

1)第936行将first ptr放入r2

2 937行:如果头结点的first ptrNULL(表示缓冲区已空),则跳到Label 9,返回-1

3 938行:取first ptr指向的一个byte,放入r0(作为返回值);

      注意,这里使用的movb指令以byte为单位进行操作,r2会后移1byte,而不是word

4 940行:将first ptr后移一个byte

 

接下来的处理分为3种情况:

i.缓冲区链表已空;

   此时,无需后续处理,直接从Label3:”处返回即可。

 

iifirst ptr移出了当前缓冲区边界;

iiifirst ptr仍在当前缓冲区内;

   这两种情况需要后续处理,即调整first ptr,并释放用完的缓冲区。

 

putc函数有两个参数:

(1)         要放入缓冲区链表的char

(2)         缓冲区链表头结点地址。

 

getc不同,该函数在当前缓冲区链表满时,需要申请空闲缓冲区——当无空闲缓冲区可

用时,操作会失败,会通过Label 9返回非0数据。函数有几个重要的判断:

(1)         976: 当前缓冲链表是否为空(只有头结点);

(2)         978 系统中是否还有空闲缓冲区;

(3)         984 当前缓冲区是否已经写满

 

【注】:从putc函数可知,clistlast ptr指向的其实并不是缓冲链表内最后一个char,而是该

char的下一个byte。如果没有跨越缓冲区边界,则此byte可用于存放下一个char,否则,表示

缓冲链表已满,需要新申请一个缓冲区。

 

博客地址:

博客专栏地址:

 

转载地址:http://ouszl.baihongyu.com/

你可能感兴趣的文章
Linux下用netstat查看网络状态、端口状态
查看>>
Java 实现有序链表
查看>>
zoj 1203 Swordfish
查看>>
手机怎么访问电脑服务器上的网页
查看>>
Python帮助函数调试函数 用于获取对象的属性及属性值
查看>>
制做rpm包工具fpm安装
查看>>
POJ 2253-Frogger (Prim)
查看>>
哪种锻炼方式最能让程序猿远离亚健康? - 强烈推荐
查看>>
基于Metronic的Bootstrap开发框架经验总结(15)-- 更新使用Metronic 4.75版本
查看>>
Kafka(二)-- 安装配置
查看>>
MapReduce 图解流程
查看>>
[LeetCode] Wildcard Matching
查看>>
深入解析Windows窗体创建和消息分发
查看>>
AIX下RAC搭建 Oracle10G(六)dbca建库
查看>>
vs code 快捷键中英文对照
查看>>
systemd的运行级别与服务管理命令简介
查看>>
Linux下的两个经典宏定义 转
查看>>
报错stale element reference: element is not attached to the page document结局方案
查看>>
【感悟】——人生路,昂首走
查看>>
Testbench
查看>>