Linux通过在内存中开辟一块缓冲区来保存最近从磁盘中读取的数据块,达到共享数据、减小对磁盘的读取频率、增大系统吞吐量的目的,这个缓冲区称为高速缓冲区(Cache Buffer)。高速缓冲区位于文件子系统与块设备驱动程序之间,所以Linux中除了设备驱动程序以外的所有程序对块设备的读写操作都必须通过高速缓冲区实现(很重要,一旦出现错误系统就完蛋)。
按照Linux对内存的分配情况来看,高速缓冲区从内核模块的末端位置开始到主内存区的开始位置。其中640K到1M被显存和显示BIOS占据,所以实际的高速缓冲区的大小应该减去384K。
以1K为单元高速缓冲区被分为若干个缓冲块。并通过标识缓冲块的缓冲头部实现对缓冲块的管理,在高速缓冲区初始化时实现缓冲块的划分和缓冲头部的建立。详细的过程在void buffer_init(long buffer_end)中实现,此函数在main函数进入保护模式后调用,用以初始化高速缓冲区。
初始化高速缓冲区的过程实际上是在高速缓冲区的高端开始划分1K大小的缓冲块,同时在低端开始建立与之相应的缓冲头部,直到缓冲区被划分完毕。建立缓冲头部的过程中,需要将这些缓冲头部建立成双向链表(此时都为空闲缓冲块,因此在建立连接的时候只需要简单地将当前缓冲头部的Next指针指向下一个建立的缓冲头就可以了)
void buffer_init(long buffer_end)
{
struct buffer_head * h = start_buffer;//内核模块的末尾
void * b;
int i;
if (buffer_end == 1<<20)//如果等于1M,划分的位置为640K
b = (void *) (640*1024);
else
b = (void *) buffer_end;