VSF应用实例--模拟U盘(3)fakefat32模拟FAT32块设备

[复制链接]
1294|0
 楼主| vsf 发表于 2018-4-1 12:42 | 显示全部楼层 |阅读模式
本帖最后由 vsf 于 2018-4-1 13:36 编辑

VSF应用实例--模拟U盘(1)USB设备端协议栈
VSF应用实例--模拟U盘(2)SCSI设备和块设备
VSF应用实例--模拟U盘(3)fakefat32模拟FAT32块设备

之前讲到mal2scsi模块输入一个mal块设备,输出一个scsi设备。这里模拟U盘的话,U盘使用FAT32文件系统,并且,这个文件系统不对应实际的块设备,而是应用一个模拟的FAT32块设备。直接上数据结构:
  1. .mal.fakefat32.sector_size                                = 512,
  2. .mal.fakefat32.sector_number                        = 0x00001000,
  3. .mal.fakefat32.sectors_per_cluster                = 8,
  4. .mal.fakefat32.volume_id                                = 0x0CA93E47,
  5. .mal.fakefat32.disk_id                                        = 0x12345678,
  6. .mal.fakefat32.root[0].memfile.file.name= "ROOT",
  7. .mal.fakefat32.root[0].memfile.d.child        = (struct vsfile_memfile_t *)usrapp.fakefat32.root_dir,

  8. .mal.mal.drv                                                        = &fakefat32_mal_drv,
  9. .mal.mal.param                                                        = &usrapp.mal.fakefat32,
这里,对于fakefat32的话,关键参数是sector_size、sector_number、sectors_per_cluster以及root根目录。根目录的数据结构定义了模拟的FAT32磁盘里的目录结构。对于mal块设备的话,参数就支持drv和param,定义了块设备的驱动和参数。后面,就只需要定义根目录结构就可以了:
  1. .fakefat32.root_dir                                                =
  2. {
  3.         {
  4.                 .memfile.file.name                                = "VSFVM",
  5.                 .memfile.file.attr                                = VSFILE_ATTR_VOLUMID,
  6.         },
  7.         {
  8.                 .memfile.file.name                                = "ide.py",
  9.                 .memfile.file.attr                                = VSFILE_ATTR_ARCHIVE | VSFILE_ATTR_READONLY,
  10.                 .memfile.file.size        = sizeof(usrapp_param.ide.py),
  11.                 .memfile.file.f.buff      = usrapp_param.ide.py,
  12.         },
  13.         {
  14.                 .memfile.file.name                                = "compile",
  15.                 .memfile.file.size                                = 1,
  16.                 .memfile.file.attr                                = VSFILE_ATTR_ARCHIVE | VSFILE_ATTR_HIDDEN | VSFILE_ATTR_SYSTEM,
  17.                 .cb.write                                                = usrapp_write_compile,
  18.         },
  19.         {
  20.                 .memfile.file.name                                = "run",
  21.                 .memfile.file.size                                = 1,
  22.                 .memfile.file.attr                                = VSFILE_ATTR_ARCHIVE | VSFILE_ATTR_HIDDEN | VSFILE_ATTR_SYSTEM,
  23.                 .cb.write                                                = usrapp_write_run,
  24.         },
  25.         {
  26.                 .memfile.file.name                                = "stop",
  27.                 .memfile.file.size                                = 1,
  28.                 .memfile.file.attr                                = VSFILE_ATTR_ARCHIVE | VSFILE_ATTR_HIDDEN | VSFILE_ATTR_SYSTEM,
  29.                 .cb.write                                                = usrapp_write_stop,
  30.         },
  31.         {
  32.                 .memfile.file.name                                = "bytecode.bin",
  33.                 .memfile.file.size                                = sizeof(usrapp.vsfvm.token),
  34.                 .memfile.file.attr                                = VSFILE_ATTR_ARCHIVE | VSFILE_ATTR_HIDDEN | VSFILE_ATTR_SYSTEM,
  35.                 .cb.read                                                = usrapp_read_bytecode,
  36.                 .cb.write                                                = usrapp_write_bytecode,
  37.         },
  38.         {
  39.                 .memfile.file.name                                = "source.txt",
  40.                 .memfile.file.attr                                = VSFILE_ATTR_ARCHIVE | VSFILE_ATTR_HIDDEN | VSFILE_ATTR_SYSTEM,
  41.                 .cb.read                                                = usrapp_read_source,
  42.                 .cb.write                                                = usrapp_write_source,
  43.         },
  44.         {
  45.                 .memfile.file.name = NULL,
  46.         },
  47. },
这里就是模拟的U盘里的目录结构,模拟FAT32磁盘的话,根目录第一个都是VOLUMID,在电脑上会显示为磁盘的名字。其他的都是文件或者目录。另外,对于文件的读写操作,用户可以自己定义callback接口(cb.read和cb.write),实现虚拟文件。这里就用compile文件的callback接口举例:
  1. static vsf_err_t usrapp_write_compile(struct vsfsm_pt_t *pt, vsfsm_evt_t evt,
  2.                 struct fakefat32_file_t *file, uint64_t offset, uint8_t *buff,
  3.                 uint32_t pagesize)
  4. {
  5.         vsfsm_post_evt_pending(&usrapp.vsfvm.sm, USRAPP_EVT_VM_COMPILE);
  6.         return VSFERR_NONE;
  7. }
PC上,ide.py界面中,用户单击compile命令后,只是会简单写compile文件,然后,会调用到compile文件的cb.write接口,就是这里的usrapp_write_compile,简单发送事件给虚拟机任务,执行编译操作。同样,run文件也是一样的处理:
  1. static vsf_err_t usrapp_write_run(struct vsfsm_pt_t *pt, vsfsm_evt_t evt,
  2.                 struct fakefat32_file_t *file, uint64_t offset, uint8_t *buff,
  3.                 uint32_t pagesize)
  4. {
  5.         vsfsm_post_evt_pending(&usrapp.vsfvm.sm, USRAPP_EVT_VM_RUN);
  6.         return VSFERR_NONE;
  7. }
fakefat32的结构: fakefat32.png

总体模块结构:
title3.png

另外,fakefat32除了可以提供mal块设备接口还,还可以提供fs文件系统的接口。这样,模拟的FAT32磁盘,可以直接接入到VSF里的文件子系统。
title4.jpg
这里,fs_op是文件系统的操作接口,实现的是memfs文件系统,可以链接到vsfile文件子系统。
另外,mal_drv可以通过mim(mal in mal模块),去掉MBR等系统扇区,只保留FAT32相关的扇区,然后通过malfs(块文件系统)里的vsffat(FAT文件系统驱动),接入到vsfile文件子系统。
这些和模拟U盘无关,所以就不介绍了。


vsf

27

主题

60

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部