2014-03-19 77 views
0

我有一個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.

回答

0

調用devfs blob中的bdevsw_add深度,由iokit調用,將始終附加specfs vnops。達爾文不允許您更改vnode上的vnops。所以嘗試這樣做是不現實的/不可取的。由IOkit創建的/ dev /節點需要保持原樣,並與GUI和塊大小限制一起使用。

我將不得不做的是創建第二套BLK和CHR設備(無論是否在/ dev /內部)並附加我自己的vnops,它可以處理任何塊大小。這些節點將用於非GUI相關的事情。 (具體塊大小要求的應用程序卷)。