串行FLASH数据缓冲区的管理

1.题目

对于串行FLASH芯片的存取操作,内核能够通过直接对芯片的读写来实现,但是较慢的芯片响应速度会使用读写响应时间加长,吞吐率降低。因此,内核通过保持一个称为数据缓冲区高速缓冲的内部数据缓冲区来减小对芯片的存取频度。高速缓冲含有最近被使用过的串行Flash的数据。

当从芯片中读数据的时候,内核试图先从高速缓冲中读取。如果数据已经在该高速缓冲中,则内核可以不必从芯片中读取数据。如果数据不在该高速缓冲中,则内核从芯片上读数据,并将其缓冲起来,这样下次使用时就不需要再从芯片中读取了。

但是,由于串行Flash的容量都比较大,将Flash的所有内容都缓冲在内存中是不可行的,只能将部分Flash的内容缓冲起来。所使用的算法试图把尽可能多的有效数据保存在高速缓冲中。

以下的算法描述的就是数据缓冲区的管理。

数据缓冲区的结构

缓冲区由两部分组成:一个用于存储数据块的数组及一个用来标识该缓冲区的缓冲头部,两者是一到一的映射关系。

缓冲区头部含一个设备号字段与一个块号字段,这两个字段唯一地标识了该缓冲区。这两个字段都是16-bit的。

缓冲区头部含有一个标志,用于标识存储数据块的数据是否含有有效的数据。显然,当缓冲区刚分配时,它其中没有有效的数据,当驱动程序从芯片中数据读出后,数据块中含有有效的数据。

缓冲池的结构

数据块以最近最少使用算法(LRU,least recently used)缓冲于缓冲池中:当一个缓冲区使用之后,只要不是所有其他缓冲区都在更近的时间内被使用过了,它就不能让其他使用者使用该缓冲区。

系统中维护一个缓冲区的空闲表,它按被最近使用的次序保存块的缓冲。空闲表是缓冲区的双向循环表,具有一个哑缓冲区头,以标志缓冲区空闲表的开始和结束。当内核想要一个空闲缓冲区的话,它可以从空闲表的头部取出一个缓冲区。但是,如果它可以标识出缓冲池中一个特定的块的话,它会从空闲表的中间取出这个特定的缓冲区。在这两种情况下,它都从空闲表中摘下缓冲区。当内核把一个缓冲区归还缓冲池时,它把该缓冲区附到空闲表的尾部。当内核从空闲表上不断地摘下缓冲区时,装有有效数据的缓冲区会越来越近地移动到空闲表的头部。因此,离空闲表的头部近的缓冲区比离空闲表的头部远的缓冲区是最近最少使用的。

当内核申请一个数据块时,它使用对应的设备号和块号的组合去找相应的缓冲区。它并不是去搜索整个缓冲区池。缓冲区组织成一个个队列,这些队列是以设备号和块号来散列的。内核把一个散列队列上的缓冲区链接成一个类似于空闲表结构的双向链接循环表。一个散列队列上的缓冲区数目在系统生存期间是变化的。内核必须使用一个散列函数,该散列函把诸缓冲均匀分布在一组散列队列中。散列函数也必须简单,以便使性能不受损失。

每个缓冲区总在存在于一个散列队列中,然而它位于队列上的什么位置是不重要的。一个缓冲区可以同时既存在于一个散列队列中又存在于一个空闲队列中,所以内核在两个方法可以找到它:如果它要寻找一个特定的缓冲,则它搜索散列队列;如果它要寻找任何一个空闲缓冲区,则它从空闲表中摘下一个缓冲区。概括的说,一个缓冲区总是在某个散列队列上,但是它可以在或不在空闲表中。

最初空闲表中空的,所需要的块是从系统内存中分配的。最初散列队列中也是空的。申请块缓冲时,在整个数据块已经申请的缓冲数量未达到上限以前,从系统中申请新的数据块,否则,从空闲表中分配,如果空闲表也没有数据块,则返回失败。

数据结构:

#define BLK_SIZE         512      /* the chip block size */

#define HASH_BITS       6

#define HASH_SIZE       (1UL << HASH_BITS)

#define HASH_MASK       (HASH_SIZE-1)

typedef struct nand_block_head_s {

    struct list_head hash;

    struct list_head lru;

    int    dev;

int    blk_nr;

int    flags;      /* see below */

    unsigned char blk_data[0];

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值