簡體   English   中英

OSX kext:由於其他所有者擁有,因此無法在:: start()中打開IOResouces

[英]OSX kext: Can't open IOResouces in ::start() due to owned by some other

在過去的幾年中,我的工作的一部分是在OSX下進行USB虛擬化,我發現自己在封閉的門前再次感到困惑。

我的kext(派生自IOUSBControllerV3)要執行的第一步之一是,在提供程序(IOResources,因為我是virtuall)在超類內部調用了:: start()(:: init()完成)之后,嘗試提供程序->打開(this)。

這是正常的方式,並且可以正常運行,直到另一天(不是我的)虛擬化kext已經加載。 然后調用失敗,結果我的:: start()和kext安裝完全失敗(不起作用)。

抓住IOService類的源代碼並通過provider-> isOpen()獲取信息是正確的,而provider-> isOpen(this)是錯誤的IOResouces似乎是由另一個(虛擬化)kext擁有的。 這意味着IOService內部__owner被其他人獨占。

怎么會這樣?? IOResources如何一次只能處理一個__owner?

provider-> open()調用是在我的基類IOUSBController :: start()中完成的,並且一直保持打開狀態,直到調用:: stop()為止,這意味着生命周期終止。

故障從我的:: start()內部的超類IOUSBController :: start()中的調用provider-> open(this)返回,並且取決於是否已加載具有提供者IOResources的另一個kext。

在這種狀態下,不會有任何資源沖突,因為這是加載kext的開始。 在我的想象中,根本不會發生任何資源沖突,因為一切都是虛擬的。

還是真的,IOResources只能處理(作為提供者)一個kext?

不,令人難以置信。 我的下一個想法是,前生的kext實現不好(因為kextunload是不可能的,所以它不是完美的),但是provider-> open(this)和-> close(this)調用是在神聖的蘋果基類中完成的,必須正確。

抱歉,大量文字,並感謝您提出的建設性意見。

是否有充分的理由為什么需要open() IOResources? IOService的上下文中, open()的點專門用於提供對不支持任意數量客戶端的資源的獨占或至少保留訪問。 (例如,物理設備通常只能加載一個驅動程序)IOResources是虛擬服務,除了publishResource / resourceMatching機制之外,它不提供任何功能。 我不知道您需要在其上調用open()的任何原因。

編輯:我錯過了對open()的調用是由Apple的超類而不是asker的代碼進行的。 在這種情況下,與對提供程序對象有特殊要求的任何基類一樣,建議您編寫自己的提供程序類。 此提供程序類可以是IOResources的客戶端,而具有挑剔基類的驅動程序可以是它的客戶端。

遵循Phils(pmdj)極富建設性的建議,他顯然是apple kext IOKit olymp的成員,一個簡單的增強似乎可以解決我的問題。

在:: start(provider)中,我創建(OSTypeAlloc())一個虛擬IOService類dumprov,使dumprov-> init()和dumprov-> start(provider),然后成功調用我的超類IOUSBController :: start(dumprov): - )

當我對:: stop()調用finaly時,我將調用IOUSBController :: stop(dumprov)並創建dumprov-> release()。 精細!

非常感謝pmdj!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM