文件系统-高速缓冲区

Linux的高速缓冲区旨在减少磁盘读取,提高系统吞吐量。缓冲区从内核模块末端到主内存开始处,1K单位划分成缓冲块,并通过缓冲头部管理。getblk函数负责查找或申请缓冲块,bread函数则根据b_uptodate标志决定是否从磁盘读取数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值