[英]How do I allocate memory buffers which may be reclaimed by the OS for caching in a Mac OS X kernel extension?
根據我閱讀的文檔和xnu源代碼,我了解到Mac OS X使用統一緩沖區緩存(UBC)緩存文件 I / O. UBC根據可用的RAM增長盡可能大,但UBC頁面是內存越來越緊張時首先被犧牲的頁面。
在我的驅動程序中,我處理各種磁盤元數據。 我希望能夠使用UBC或類似的機制來保持MRU緩存這些數據以加快速度,同時讓內核能夠在需要時收回內存。 然而,元數據不代表文件數據,因此不直接落入UBC的域。 是否有我可以使用的低級機制,或者我可以以某種方式僅使用UBC中處理緩沖區本身的部分?
我目前正在尋找HFS +源代碼,試圖弄清楚它是否以及如何緩存文件系統元數據,盡管沒有太大的成功。
主要的替代方案當然是為緩存保留特定的內存區域並進行自己的LRU剔除。 我可以選擇一個固定的緩存大小或者使用某種啟發式方法,但是當RAM豐富時它總是會占用太少的內存,而當它沒有時它會占用太多的內存。
更新:
在搜索了一些之后,我發現可以使用kIOMemoryPurgeable
選項創建IOBufferMemoryDescriptor
實例。 這允許你在其上調用IOMemoryDescriptor::setPurgeable()
來標記內存“公平游戲”以便丟棄。 我會嘗試並用結果更新問題。
你是對的。 在請求內存時將kIOMemoryPurgeable
設置為其中一個選項。 它從非易失性開始,可以被分頁,但不會被丟棄。
當你想讓操作系統丟棄它時,調用setPurgeable(kIOMemoryPurgeableVolatile, &oldState );
如有必要,操作系統將丟棄它,而不是將其分頁到磁盤。
要訪問內存時,必須調用setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState );
並檢查if(oldState != kIOMemoryPurgeableEmpty)
如果內存仍然可用則為true,如果已被丟棄則為false。
如果你遇到任何捕獲,我會很高興聽到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.