SylixOS NandFlash读CACHE

  1. NandFlash 读CACHE简介

    由于磁盘属于低速设备,磁盘的读写速度远远低于CPU,所以为了解决这种速度不匹配的问题,SylixOS提供了对应块设备的缓冲器。与此对应的,为了提高NandFlash的读速度,SylixOS也为NandFlash提供了一种读CACHE机制。为了不影响写平衡软件对坏块的管理,该缓冲机制在NandFlash写一个扇区时,将相关的扇区CACHE全部设为读不命中;当NandFlash擦除一个块时,将块内所有的扇区CACHE设为读不命中。

  2. 技术实现

    SylixOS中关于NandFlash读CACHE的内容主要在"libsylixos/SylixOS/fs/nandRCache"目录下,主要实现了读CACHE的创建、删除操作,以及节点的申请、释放操作。其中,读CACHE的创建函数接口如程序清单 2-1所示。

    程序清单 2-1读CACHE创建函数

    #include <SylixOS.h>
    LW_API ULONG  API_NandRCacheCreate(PVOID              pvNandRCacheMem, 
                                       size_t             stMemSize,
                                       ULONG              ulPageSize,
                                       ULONG              ulSpareSize,
                                       ULONG              ulPagePerBlock,
                                       PLW_NRCACHE_CB    *ppnrcache);

    函数API_NandRCacheCreate原型分析:

  • 此函数成功返回ERROR_NONE,失败返回错误码;
  • 参数pvNandRCacheMem是缓存内存地址;
  • 参数stMemSize是缓存内存大小;
  • 参数ulPageSize是每个页面数据区大小;
  • 参数ulSpareSize是每个页面扩展区大小;
  • 参数ulPagePerBlock是每一块页面的个数;
  • 参数ppnrcache是需要返回的创建成功的控制块。

使用API_NandRCacheCreate函数创建CACHE成功时,最后一个入参将返回NandFlash的读CACHE控制块,该控制块的详细信息如程序清单 2-2所示。

程序清单 2-2读CACHE管理控制块

typedef struct {

    PLW_NRCACHE_NODE         NRCACHE_pnrcachenBuffer;                   /*  nand flash 所有的缓冲       */
    ULONG                    NRCACHE_ulPagePerBlock;                    /*  每一个块的页面个数          */
    ULONG                    NRCACHE_ulnCacheNode;                      /*  CACHE 中包含的节点个数      */
    INT                      NRCACHE_iHashSize;                         /*  hash 表大小                 */
    PLW_LIST_LINE           *NRCACHE_pplineHash;                        /*  搜索 hash 表                */
    PLW_LIST_RING            NRCACHE_pringLRU;                          /*  有效点中最近最少使用表      */
    PLW_LIST_LINE            NRCACHE_plineFree;                         /*  空闲表头                    */
} LW_NRCACHE_CB;
typedef LW_NRCACHE_CB       *PLW_NRCACHE_CB;                            /*  nand read cache 控制块      */

NandFlash的读CACHE创建过程主要包括开辟Hash表内存、开辟初始化控制块内存以及初始化每个节点内存使用情况。和块设备的DiskCACHE类似,NandFlash读CACHE以NODE节点管理CACHE缓存,每一个NODE节点都对应着一页缓存,NODE节点则以LRU(Least Recently Used)的方式组成循环链表,方便刷新脏节点。对于已经缓存的扇区,则通过HASH表与链表结合的方式进行快速索引。空闲的节点单独构成一个链表,方便节点的快速申请。

管理CACHE缓存的NODE节点详细信息如程序清单 2-3所示。

程序清单 2-3 NODE节点控制块

typedef struct {
    LW_LIST_LINE             NRCACHEN_lineManage;                       /*  空闲链表 或 hash            */
    LW_LIST_RING             NRCACHEN_ringLRU;                          /*  LRU 链                      */
    ULONG                    NRCACHEN_ulChunkNo;                        /*  扇区号                      */
    caddr_t                  NRCACHEN_pcChunk;                          /*  数据区缓冲                  */
    caddr_t                  NRCACHEN_pcSpare;                          /*  扩展区缓冲                  */
} LW_NRCACHE_NODE;
typedef LW_NRCACHE_NODE     *PLW_NRCACHE_NODE;                          /*  缓冲节点                    */

对于NODE节点的操作主要包括申请、查找、释放等操作,其中节点申请函数接口如程序清单 2-4所示。

程序清单 2-4 CACHE节点申请函数

#include <SylixOS.h>
LW_API PLW_NRCACHE_NODE      API_NandRCacheNodeAlloc(PLW_NRCACHE_CB  pnrcache, ULONG  ulChunkNo);

函数API_NandRCacheCreate原型分析:

  • 此函数成功返回NODE节点,失败返回LW_NULL
  • 参数pnrcache是CACHE控制块;
  • 参数ulChunkNo是需要缓存的扇区号。

函数API_NandRCacheCreate从空闲NODE池中获取节点时,若不存在空闲节点,则将从LRU表中淘汰一个最久未使用的节点。

获得指定扇区节点的函数接口如程序清单 2-5所示。

程序清单 2-5 CACHE节点查找函数

#include <SylixOS.h>
LW_API PLW_NRCACHE_NODE      API_NandRCacheNodeGet(PLW_NRCACHE_CB  pnrcache, ULONG  ulChunkNo);

函数API_NandRCacheNodeGet原型分析:

  • 此函数成功返回节点控制块,失败返回LW_NULL
  • 参数pnrcache是CACHE控制块;
  • 参数ulChunkNo是需要缓存的扇区号。

当API_NandRCacheNodeGet函数在CACHE中命中时,会将此节点挂入LRU表的头部,这样最近使用的数据始终保持在链表头部。

将一个有效节点释放的函数接口如程序清单 2-6所示。

程序清单 2-6 CACHE节点释放函数

#include <SylixOS.h>
LW_API VOID    API_NandRCacheNodeFree(PLW_NRCACHE_CB  pnrcache, ULONG   ulChunkNo);

函数API_NandRCacheNodeFree原型分析:

  • 此函数成功返回;
  • 参数pnrcache是CACHE控制块;
  • 参数ulChunkNo是需要缓存的扇区号;

NandFlash的读CACHE删除操作的函数接口如程序清单 2-7所示。

程序清单 2-7读CACHE删除函数

#include <SylixOS.h>
LW_API ULONG   API_NandRCacheDelete(PLW_NRCACHE_CB    pnrcache);

函数API_NandRCacheDelete原型分析:

  • 此函数成功ERROR_NONE,失败返回PX_ERROR
  • 参数pnrcache是CACHE控制块。
  1. 参考资料

时间: 2024-10-05 04:58:31

SylixOS NandFlash读CACHE的相关文章

9.NandFlash的驱动_读操作2440

9.NandFlash的驱动_读操作 在Makefile里添加nand.o,然后新建一个nand.c来实现NandFlash的读操作. 对NandFlash的读方式有两种: 按页读(需要提供页地址,也就是行地址). 随机读(就是读取页里的某一列,需要提供页地址,也就是行地址和列地址). 实现页读需要两个操作,一个是页地址,另一个是存放读出的数据的变量.所以定义的函数的原型: void NF_PageRead(unsigned long addr,unsigned char* buff) 该函数根

主从DB与cache一致性

本文主要讨论这么几个问题: (1)数据库主从延时为何会导致缓存数据不一致 (2)优化思路与方案 一.需求缘起 上一篇<缓存架构设计细节二三事>中有一个小优化点,在只有主库时,通过"串行化"的思路可以解决缓存与数据库中数据不一致.引发大家热烈讨论的点是"在主从同步,读写分离的数据库架构下,有可能出现脏数据入缓存的情况,此时串行化方案不再适用了",这就是本文要讨论的主题. 二.为什么数据会不一致 为什么会读到脏数据,有这么几种情况: (1)单库情况下,服务层

Linux中Buffer和Cache的区别

1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能. Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元):Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制

存储器结构、cache、DMA架构分析--【sky原创】

存储器的层次结构 高速缓冲存储器  cache 读cache操作 cache如果包含数据就直接从cache中读出来,因为cache速度要比内存快 如果没有包含的话,就从内存中找,找到后就放到cache中去,以后再读的话就直接从cache读了,下次访问很多次的时候就会快很多,相当于提高了命中率,cpu的访问速度就大大提高了 cache能大大提高cpu的访问速率 cache的设计 不能太大,也不能太小 太大的话,因为程序在查看数据的时候需要把cache走一遍,如果cache太大, 那么走一遍的时间就

ATS读小文件(内存命中)

一个资源根据其大小可能会存在多个存储对象中.如果足够小(连同doc结构的大小小于一个fragment的size),连同这个资源的meta信息一起存储在一个doc中.如果比较大,第一个存储对象保存资源的meta信息,后面跟着若干个fragment存着资源的content.这里讨论小文件读行为,并且内存命中,在资源第二次命中的时候才有可能是内存命中.整个流程在主状态机流程的入口函数是Cache::open_read,正流程如下: Cache::open_read: 计算的到vol.运行了dir_pr

运维职责,buffer和cache什么区别?机房防止服务器断电,远程控制卡

1.运维职责·数据不能丢·网站7*24小时运行·用户体验要好2.buffer和cache什么区别?buffeer 缓冲区 数据写入到内存的buffer区域 写buffer' 写缓冲cache 缓存区 从内存中的cache区域进行读取 读cache 读缓存 机房防止服务器断电A. 双电源AB路(使用不同的变压器).B. UPS(不间断电源)蓄电池组 30分钟 最多一小时C. 柴油发电机+油罐D. 附近的加油站签订紧急供油协议4.远程控制卡dell iDrac作用:A. 远程控制与管理服务器B. 远

[转] Cache 和 Buffer的区别

程序员开发过程中经常会遇到“缓存”.“缓冲”等相似概念,之前没有特别关注,现在停下来做一下总结,才能更好地前行. 先来下枯燥的概念: 1.Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能.Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小

DMA、TCM与Cache介绍

[转]https://blog.csdn.net/qq_20880415/article/details/89036066 DMA DMA=Direct Memory Access.这是一种通过硬件实现的数据传输机制.简单的说,就是不在CPU的参与下完成数据的传输. DMA是一种硬件设备.这种设备的工作原理是这样的: ——首先CPU告诉DMA设备,要有一堆数据需要传输,为了效率而请它出马.(DMA请求) ——DMA收到CPU的消息,开始准备.此时CPU把数据源地址.数据目标地址.传输数据量.传输

秒杀系统架构分析与实战

0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有: 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动,