我有一個IOBlockStorageDevice設備創建,報告blocksize,由用戶設置。它爲該磁盤創建一個/ dev/diskX條目。如果reportBlockSize返回4096,並且嘗試寫入一個塊,則它會正好寫入1個塊。IOBlockStorageDevice和blockSizes,避免specfs限制
如果使用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,並在以下條件語句,它決定先調用讀取,然後寫入。
更糟糕的是,如果你嘗試設置一個大於4096的blockSize,它就會直線上升失敗。
這似乎相當有限,我想知道是否有辦法避免使用specfs。由於我使用IOkit創建我的設備,因此我認爲它將vnops設置爲深處內的specfs。所以,即使我要製作自己的specfs vnops,我也無法設置它們?
在設備上安裝文件系統後,它將使用不同的vnops,一切正常。但是很難甚至對設備進行分區,例如,如果塊大小爲8192.