IOBlockStorageDevice和blockSizes,避免specfs限制

时间:2014-03-19 05:27:47

标签: c kernel iokit darwin

我创建了一个IOBlockStorageDevice设备,它报告用户设置的blocksize。它为磁盘创建/ dev / diskX条目。如果reportBlockSize返回4096,并且尝试写入单个块,则它会写入1个块。

如果使用块大小为512,则单个块写入请求变为8块读取,然后是8个块写入。 (在doAsyncReadWrite中观察到)。

我相信我已将此跟踪到spec_vnops.c spec_write()

543                 devBlockSize = vp->v_specsize;
544                 if (devBlockSize > PAGE_SIZE)
545                         return(EINVAL);
546 
547                 bscale = PAGE_SIZE / devBlockSize;
548                 blkmask = bscale - 1;
549                 bsize = bscale * devBlockSize;

如果一个块小于PAGE_SIZE(4096),那么使bsize为4096,并在下面的条件语句中,它决定先调用read,然后再写。

更糟糕的是,如果你试图将blockSize设置为大于4096,那么它就会直接失败。

这似乎相当有限,我想知道是否有办法避免使用specfs。由于我使用IOkit创建我的设备,我假设它将vnops设置为内部深处的specfs。所以,即使我要制作自己的specfs vnops,我也无法设置它们?

一旦文件系统安装在设备上,它将使用不同的vnops,一切都很好。但是甚至很难对设备进行分区,例如,blocksize是8192。

1 个答案:

答案 0 :(得分:0)

由iokit调用的devfs blob中的bdevsw_add调用将始终附加specfs vnops。达尔文不允许你更改vnode上的vnops。因此,尝试这样做是不现实/不可取的。 IOkit创建的/ dev / nodes需要保持原样,并与GUI和blocksize限制一起使用。

我需要做的是创建第二组BLK和CHR设备(无论是否在/ dev内部或外部)并附加我自己的vnops,它可以处理任何块大小。这些节点将用于非GUI相关的事物。 (特定块大小要求的应用程序卷)。