我試過擴展IOUserNetworkEthernet和呼叫RegisterEthernetInterface(). 這適用于一個以太網介面,盡管驅動程式在RegisterEthernetInterface第二次呼叫時崩潰(不回傳錯誤代碼)。我試過用單獨的佇列注冊。
另一種方法是擴展IOUserClient,并呼叫IOService::Create創建子 IOUserNetworkEthernet 實體。這種方法的一切都有效(孩子出現在 ioreg 中)。但是,一旦我RegisterEthernetInterface只呼叫其中一個孩子,macOS 就會崩潰。
我將如何創建具有多個以太網介面的 dext?我是否以正確的方式接近它?
感謝任何幫助。
uj5u.com熱心網友回復:
我自己還沒有實作以太網 dext,但根據我將 DriverKit 用于其他型別的驅動程式的經驗并了解它的設計目標,我知道解決方案可能是什么。
首先,讓我們澄清一下:您正在實作一個虛擬以太網設備,或者您正在為硬體構建一個驅動程式,該驅動程式將多個獨立埠聯合到一個物理設備中。在前一種情況下(根據您的評論,我猜這是您正在做的事情IOUserClient),您的驅動程式將匹配IOUserResources,并且當您從用戶空間組件收到相應訊息時,您將創建以太網驅動程式實體。
現在,DriverKit 設計: DriverKit 是圍繞將每個設備的驅動程式實體保存在其自己的單獨行程中的目標而構建的。有點回到微內核的想法。具體來說,這意味著使用相同驅動程式的多個設備將在各自的行程中創建該驅動程式的獨立實體。這很可能意味著 NetworkingDriverKit 從未設計為支持多個實體IOUserNetworkEthernet,因為它們被視為單獨的設備。因此崩潰。
好的,我們該怎么辦?按預期方式使用 DriverKit。將每個虛擬以太網配接器放在其自己的驅動程式實體中。這有點棘手。我認為這應該有效:
- 您的 dext 有一個“控制”實體。這是匹配的東西
IOUserResources。這是一個簡單的IOService類,它監聽信號(大概IOUserClient)以創建或銷毀虛擬以太網設備。創建虛擬以太網設備時,您需要它在自己的驅動程式實體中運行。(對于具有多個埠的實際設備,這將匹配 USB/PCI 設備節點,管理與設備的總線通信,并列舉埠。) - 與其創建
IOUserNetworkEthernet子類的實體,不如創建一個“nub”類的實體并將其附加到您的中央控制類實體。呼叫RegisterService()它的啟動代碼,因此它被考慮用于 IOKit 匹配。 - 在您的 Info.plist 中設定第二個 IOKit 匹配字典,它與您的新“nub”物件匹配。在這里,使用您的
IOUserNetworkEthernet-derived 類來“驅動”小塊。準備好使用虛擬以太網設備后,呼叫RegisterEthernetInterface().
2個額外的注意事項:
- 虛擬設備將運行在獨立于控制物件的行程中,因此它們只能通過DriverKit 行程間呼叫(即用戶客戶端)進行通信。但愿它們實際上并不需要太多通信,并且控制客戶端可以通過 nub 上的屬性傳遞所需的所有資訊。如果您正在實作對多埠硬體的支持,那么您可能無法避免這部分。
- 您的用戶空間組件(應用程式、守護程式)將需要打開與虛擬設備的新通信通道,因此您可能還需要在那里實作用戶客戶端支持。
我不確定您將如何關閉單個虛擬以太網設備,您可以嘗試呼叫Terminate()它或它匹配的小塊,看看會發生什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/418373.html
標籤:
上一篇:如何在文本檔案中查找多個字串?
