UNIX设备管理分析
——块设备管理之getblk( )
作者:张金良 周中新 刘浩 (南京审计学院计算机系02291班)
指导教师:江效尧
[摘要] UNIX系统的缓冲区管理是块设备管理的第二层,包括申请、释放、摘链、查链、清0、写回和初启,通过getblk()函数实现申请一块指定设备、块号的缓冲。
[ summary] UNIX system buffer area the management is an equipments second floor that manage, include the application, release, take off the chain, check the chain , pure zero, write back with the early start , and pass the getblk() function to realize the application a cake of to specify the equipments, piece the number's buffer.
[关键字] Unix操作系统、块设备、缓冲区
[key word] Unix operate system, piece equipments, buffer area
一、 概述
设备分为面向块的设备和面向字符的设备,块的如磁盘、磁带等字符的如纸带输入/穿孔输出机、打印机等。块设备通过一层缓冲软件管理,字符设备通过字符缓冲实现。
块设备中存储的信息从硬件组织上是有结构的,由若干固定大小的块所组成,信息的存取通常是以块为单位的,从块设备的用户方面看,有三种用法:(1)程序对换系统使用,它有自己的数据结构和管理程序。(2)文件系统使用,为了有效支持文件系统,利用了多重缓冲技术。(3)将磁盘当作字符设备来使用,从块设备管理系统的实现方式和程序组成看,可分为三个层次:最低层为设备驱动程序,它的主要数据结构是磁盘的各种控制寄存器和设备表;第二层是缓冲区的管理,包括申请、释放、摘链、查链、清零、写回和初启,主要数据结构是15个缓冲首部和一个作为链头的缓冲首部,主要有文件系统使用。最上层是与使用方式有关的程序,相当于块设备与外部的接口。
二、 功能分析
块设备除了用作程序对换空间之外,主要用于文件系统。为了克服慢速外部设备和快速处理机加工速度之间的不匹配问题。Unix采用了多重缓冲技术,以便给文件系统以有效的服务,为此系统维持了一个缓冲池,内含15个缓冲,这些缓冲起着虚拟存储器的作用,而getblk函数正是为了申请一块指定设备,块号的缓冲,其主要应用于:
1系统调用(exec())执行一个文件,为将要执行的文件申请新的缓冲。
2进程的自我终止(exit()),getblk为将要终止的进程查找相应的缓冲。
3读一块到缓冲(bread()),为其申请一块缓冲。
4读当前块到缓冲,再预读一块(breada()),为将要读的块申请缓冲。
5从空闲盘区链中获得一空闲盘块(alloc()),函数根据分配到的盘块号申请一缓冲区。
6将释放的盘块号记入专用的空闲块栈中(free()),申请一缓冲区,将空闲块栈中的信息复制到该缓冲区中。
7文件系统初启(iinit()),申请一块不与任何设备有联系的内存专用区,存放专用块。
8完成转储任务(update())为superblock复制回文件卷而申请缓冲区。
9系统文件卷的安装(smount()),为存储文件卷的superblock申请缓冲区。
10把文件复制到I/O缓冲区然后再记到外存(writei()),为I/O设备申请缓冲区。
三、数据结构分析
1缓冲部首:系统为每个缓冲提供了一个缓冲控制块,称缓冲部首。其中保留对应缓冲的地址,对应的设备名,使用情况等定义为char buffers[NBUF][514];(NBF=15)
缓冲部首说明如下:
struct buf
{ int b_flags ; //标志字位串
struct buf*b_forw; //设备(b)链向前指针
struct buf*b_back; //设备(b)链向后指针
struct buf*av_forw; //空闲(av)链向前指针
struct buf*av_back; //空闲(av)链向后指针
int b_dev; //设备名
int b-wcount; //传送字数(二进制补码)
char * b_addr; //内存地址低16位
char * b_xmem; //内存地址高16位
char * b_blkno; //设备上的物理块号
char * b_error; //返回I/0出错信息
char * b_resid; //因出错而未传送的剩余字数
} buf[NBUF];
为了有效地管理这些缓冲,对应的缓冲部首连人到两个双向链中,一个是设备链,或简称b链,它把一类设备所用的所有缓冲连接起来。另一个是空闲链,或简称av链,它把系统中所有未用的缓冲连接起来,包括已属于某设备的b链中的缓冲。
2设备名:
struct{ char d_minor (次设备号)
char d_major (主设备号)
};
设备名的高字节存设备类型号d_major,也叫设备号,表示某一类设备,同类设备使用相同的驱动程序,低字节存设备号d_minor,也叫次设备号,表示某类设备的第几台设备。
3块设备表:
含有该类设备的状态信息、IO队列头尾指针和上面提到的该类设备的b链头尾指针。
设备表说明如下:
struct devtab
{ char d_active; //忙闲标志
char d_errent; //出错重试次数
struct *buf b_forw; //b链链头指针向前指针
struct *buf b_back; //b链链头指针向后指针
struct *buf d_actf; //IO队列头指针
struct *buf d_act1; //IO队列尾指针
};
4块设备开关:每类设备自己的管理程序
struct bdevsw
{ int (*d_open) ( ); //打开子程序入口地址
int (*d_close) ( ); //关闭子程序入口地址
int (*d_strategy) ( ); //启动子程序入口地址
int *d_tab //对应设备表地址(devtab)
} bdevsw;
5bfreelist:是av链的链头,用了buf中的四个指针。但b_forw和b_back指向的b链不与任何设备相连系。
swbuf:专门用于程序对换。
rrkbuf:专门用于原始磁盘操作。
如图所示(下页):(缓冲区本身略去)
dev=0 Busy=0 swbuf dev=-1 Busy=0 dev=-1 Busy=1 d_close d_strategy d_tab r ktab
Java Mail API:【下一篇】