gpt4 book ai didi

c - IOBlockStorageDevice 和 blockSizes,避免规范限制

转载 作者:行者123 更新时间:2023-11-30 17:37:07 26 4
gpt4 key购买 nike

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

如果使用 block 大小 512,则单个 block 写入请求将变为 8 block 读取,然后是 8 block 写入。 (如 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;

如果一个 block 小于PAGE_SIZE(4096),则将bsize设置为4096,并且在下面的条件语句中,它决定先调用read,然后调用write。

更糟糕的是,如果您尝试设置大于 4096 的 blockSize,它会直接失败。

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

一旦文件系统安装在设备上,它将使用不同的 vnop,一切都很好。但即使对设备进行分区也很困难,例如, block 大小是8192。

最佳答案

devfs blob 深处的 bdevsw_add 调用(由 iokit 调用)将始终附加 specfs vnops。 Darwin 不允许您更改 vnode 上的 vnop。因此尝试这样做是不现实/不可取的。 IOkit 创建的/dev/节点需要保持原样,并与 GUI 和 block 大小限制一起使用。

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

关于c - IOBlockStorageDevice 和 blockSizes,避免规范限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22497013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com