SylixOS块设备驱动开发(六)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2021年1月10日18:09:55 评论 806

块设备和块缓冲配置

1. 块设备配置

这里对块配置中几个比较重要的成员做个说明:

  • BLKD_pcName:这个名字会在proc文件系统中查看块缓冲信息时用到。
  • BLKD_ulNSector:块设备总扇区个数。
  • BLKD_ulBytesPerSector:单个扇区的大小。
  • BLKD_bRemovable:块设备是否可卸载。
  • BLKD_iFlag:块设备是只读的还是可读写的。
  • BLKD_pfuncBlkRd:块设备读操作回调函数。
  • BLKD_pfuncBlkWrt:块设备写操作回调函数。
  • BLKD_pfuncBlkIoctl:块设备控制操作回调函数。
  • BLKD_pfuncBlkReset:块设备复位回调函数。
  • BLKD_pfuncBlkStatusChk:块设备状态检查函数。

在此驱动中,虚拟磁盘大小为20MB,扇区大小为512B:

#define SECTOR_BYTES       512
#define VIRTUAL_DISK_SIZE  20 * LW_CFG_MB_SIZE

    pdev->BLKD_pcName = "VirtualDisk";
    pdev->BLKD_ulNSector = VIRTUAL_DISK_SIZE / SECTOR_BYTES;
    pdev->BLKD_ulBytesPerSector = SECTOR_BYTES;
    pdev->BLKD_ulBytesPerBlock = SECTOR_BYTES;
    pdev->BLKD_bRemovable = LW_TRUE;
    pdev->BLKD_iRetry = 1;
    pdev->BLKD_iFlag = O_RDWR;
    pdev->BLKD_bDiskChange = LW_TRUE;
    pdev->BLKD_pfuncBlkRd = vdisk_read;
    pdev->BLKD_pfuncBlkWrt = vdisk_write;
    pdev->BLKD_pfuncBlkIoctl = vdisk_ioctl;
    pdev->BLKD_pfuncBlkReset = vdisk_reset;
    pdev->BLKD_pfuncBlkStatusChk = vdisk_status_chk;

    pdev->BLKD_iLogic = 0;
    pdev->BLKD_uiLinkCounter = 0;
    pdev->BLKD_pvLink = LW_NULL;

    pdev->BLKD_uiPowerCounter = 0;
    pdev->BLKD_uiInitCounter = 0;

2. 块缓冲配置

下面我们对块缓冲中几个重要成员做个介绍:

  • DCATTR_pvCacheMem:如果驱动需要自己分配DiskCache,则可以将分配后的内存地址用来初始化此成员,否则填NULL让内核自己分配。
  • DCATTR_stMemSize:DiskCache的大小。
  • DCATTR_iBurstOpt:BurstBuffer的cache属性,如果需要分配带cache属性的,则初始化为0,如果需要非cache属性的,则初始化为LW_DCATTR_BOPT_CACHE_COHERENCE。
  • DCATTR_iMaxRBurstSector:读猝发缓冲区大小。
  • DCATTR_iMaxWBurstSector:写猝发缓冲区大小。
  • DCATTR_bParallel:是否可以同时进行读写操作。
  • DCATTR_iPipeline:系统后台刷新写缓冲的线程个数。
  • DCATTR_iMsgCount:每个写缓冲线程消息数量,一般为DCATTR_iPipeline的2~8倍数值大小。

在本驱动中,读和写猝发扇区设置为64,DiskCache大小设置64KB。另外需要注意的是,实际内核中申请的写猝发缓冲区大小为DCATTR_iMaxWBurstSector  * 单扇区大小 * DCATTR_iMsgCount。

#define BUSTOR_SECTOR      64
#define DISK_CACHE_SIZE    64 * LW_CFG_KB_SIZE

    dcattrl.DCATTR_pvCacheMem = LW_NULL;
    dcattrl.DCATTR_stMemSize = (size_t)(DISK_CACHE_SIZE);
    dcattrl.DCATTR_iBurstOpt = LW_DCATTR_BOPT_CACHE_COHERENCE;
    dcattrl.DCATTR_iMaxRBurstSector = (INT)BUSTOR_SECTOR;
    dcattrl.DCATTR_iMaxWBurstSector = (INT)BUSTOR_SECTOR;
    dcattrl.DCATTR_iMsgCount = 4;
    dcattrl.DCATTR_bParallel = LW_TRUE;
    dcattrl.DCATTR_iPipeline = 1;

系统后台写缓冲刷新线程为 t_dcwpipe

[root@sylixos:/root]# ts
thread show >>

      NAME         TID    PID  PRI STAT LOCK SAFE    DELAY   PAGEFAILS FPU CPU
---------------- ------- ----- --- ---- ---- ---- ---------- --------- --- ---
t_idle0          4010000     0 255 RDY     0 YES           0         0       0
t_itimer         4010001     0  20 SLP     0 YES        8741         0       0
t_isrdefer       4010002     0   0 SEM     0 YES           0         0       0
t_except         4010003     0   0 SEM     0 YES           0         0       0
t_log            4010004     0  60 MSGQ    0 YES           0         0       0
t_power          4010005     0 254 SLP     0 YES          50         0       0
t_hotplug        4010006     0 250 SEM     0 YES          50         0       0
t_reclaim        4010008     0 253 MSGQ    0 YES           0         0       0
t_sync           4010009     0 252 SLP     0             150         0       0
t_sdhcisdio      401000a     0 197 SEM     0               0         0       0
t_dcwpipe        401000b     0 160 SEM     0               0         0       0
t_tpsfs          401000c     0 160 SLP     0              10         0       0
t_netjob         401000d     0 110 SEM     0 YES           0         0       0
t_netproto       401000e     0 110 MSGQ    0 YES           6         0 USE   0
t_snmp           401000f     0 110 MSGQ    0 YES           0         0       0
t_ftpd           4010010     0 160 MSGQ    0               0         0       0
t_telnetd        4010011     0 160 MSGQ    0 YES           0         0       0
t_xinput         4010013     0 199 SEM     0               0         0       0
t_tshell         4010015     0 150 RDY     1               0         0       0

thread: 19
[root@sylixos:/root]#

3. 查看系统块缓冲信息

经过上述的初始化之后,加载虚拟块设备驱动之后就可以根据《SylixOS块设备驱动开发(二)》中的方法对块设备进行分区和格式化操作了。通过 cat /proc/diskcache 命令来查看系统中所有块设备的块缓冲信息:

[root@sylixos:/proc]# cat /proc/diskcache
DO NOT INCLUDE 'NAND' READ CACHE INFO.

       NAME       OPT SECTOR-SIZE TOTAL-SECs VALID-SECs DIRTY-SECs BURST-R BURST-W  HASH
----------------- --- ----------- ---------- ---------- ---------- ------- ------- ------
VirtualDisk         0         512        128         64          0      64      64    128
SD-MemCard          0         512       1024       1024          0      16      32   1024
[root@sylixos:/proc]#

 

gewenbin
  • 本文由 发表于 2021年1月10日18:09:55
  • 转载请务必保留本文链接:http://www.databusworld.cn/9952.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: