我正在使用 Kext,它为一个或多个使用 iokit 服务与其通信的用户空间客户端提供服务。
我希望每个这样的客户端都会参考 kext,这样只要仍有可用的客户端,就不可能卸载 kext。
根据我可以使用的文档IOServiceOpen
和IOConnectAddRef
,但仍然可以使用卸载驱动程序kextunload
。
kextstat
还表明没有对驱动程序进行引用,这些是文档中提到的其他驱动程序的引用,但我认为上述命令可以解决问题。
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
1 100 0xffffff7f80a46000 0x9d90 0x9d90 com.apple.kpi.bsd (16.7.0) 410B3B98-9DAB-4590-9086-7C57A5B3099A
2 8 0xffffff7f80fc3000 0x3940 0x3940 com.apple.kpi.dsep (16.7.0) FA744B47-913C-4B5D-8C16-2F8005D85935
3 127 0xffffff7f80a04000 0x21040 0x21040 com.apple.kpi.iokit (16.7.0) 80F2DA67-C67B-4583-9B09-082DB11F69FC
...
170 0 0xffffff7f80a04000 0x21040 0x32120 com.my-driver.nsl (1.0.0) 53390CCD-55F0-315F-BBD7-21645800E4A0
我应该怎么做才能增加上图中的#Refs?
编辑:在苹果文档中,可以在 info.plist 文件中声明您的 kext 依赖项。
任何 KEXT 都可以声明它依赖于任何其他 KEXT。开发人员在模块属性列表文件的 OSBundleLibraries 字典中列出了这些依赖项。
但是,我想通过将来自其他实体的引用标记到我的 kext 来做相反的事情,而这些实体不一定是驱动程序 - 在 Windows 中,它们都称为服务,并且可以轻松地在 2 个此类服务之间建立链接,而不管它们是否'是用户空间进程或内核模块。
感恩