块设备和块缓冲配置
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]#
评论