前言
各位好,很久没有更新些干货了,真是抱歉。这一年自己真的很忙,忙学习,忙着准备考研,事情繁杂,所以直到现在才抽出空来搞搞这些。
将近一年的时间里,除了学习以外的生活,我基本醉心于IOKit的驱动开发。在我心里,能写出来IOKit的驱动,是检验自己能力的标志之一。前两天我的这个项目总算有了些眉目,目前也基本到了能识别的状态。所以我选择把它拿出来,给各位分享下。
没错,你没看错。我做了这个项目的初衷,真的是致敬我最爱的英雄联盟里最喜欢的英雄之一——加里奥的。(嗨,大家好~)
皮这一下我很开心,下面我们说点正经的。 GalioEthernet9601是一个基于Davicom公司的DM9601 USB转接器开发的MacOS开源驱动 (详细说明请见 samuelv0304的项目))。实际上,你可以把它看作是对USBCDCEthernet的一个重写和升级的项目。
USBCDCEthernet是一个十分完善的驱动,自从我上了大一以后,这个网卡我就在用过,配合USBCDCEthernet,在黑果下工作十分完美。不过美中不足,这个驱动很久没人维护了,将近七年的时间,苹果的底层代码早已大变样。当这个驱动来到大苏尔时代时,它的代码就不那么好运行在大苏尔上了;除此之外,由于过于老旧,你没法在新版系统上编译USBCDCEthernet项目的源码,因为USBCDCEthernet项目源码是基于IOUSBDevice作为提供者类(Provider)来开发的。然鹅,早在12 Sierra时代,苹果就已经废弃了IOUSBDevice相关的头文件,让开发者迁移到IOUSBHostDevice上。所以只要你的MacOS版本大于12.0,这个驱动基本你就没什么办法编译了(除非你强行用旧版SDK或者使用MacKernelSDK。可即便这样,这个驱动的编译依旧很费劲)。
更加糟糕的是,经过我对这个驱动的源码的检查,发现里面有很多代码都是苹果已经不推荐使用的代码(比如这个驱动的定时器事件代码,没有使用苹果驱动目前通常使用的OSMemberFunctionCast宏来转换)。另外,这里面使用了10.9时代由IOUSBFamily示例改写的CDC源码,里面由于IOLog函数的版本问题,在高版本MacOS上已经无法输出日志,这对于驱动故障的排除很是不便。
基于以上种种理由,最后我下定了决心:重写这个驱动。
重写的路并非一帆风顺。IOKit的学习资料并不算很多,我查阅了不少东西,也包括问了不少人(包括PMHeart老阿姨、Kishor老哥还有Intel无线网卡驱动的开发者Zxystd等人在内),经过差不多大半年的折腾,现在终于可以拿出来一个相对比较完善的成品出来给大家,也当做自己的一个处女作品。
它能做什么?
就像我说的一样,这是一个由USBCDCEthernet 重写的 项目,因此理论上 USBCDCEthernet能做到什么,它也能做到什么。目前为止,我已经移植了原USBCDCEthernet将近五分之四的源码,源码的移植工作已经趋近尾声。我还没有计划加入一些新的东西, 也许有一天,当它完全移植了USBCDCEthernet的所有原有代码后,我就可以着手加些新东西了。
截止本文发稿时,我已经实现了在MacOS上识别此设备(显示为“自分配的IP“,实际还不能上网,因为上网通信相关的函数尚未移植完成),并且插上网线也能亮灯。目前我的计划是在闲暇时间内,将剩余部分的源码移植完成,并着手排除一些驱动错误,优化驱动代码,使它的运行效率更高。
一群人的力量总是大过一个人。如果你对这个项目有一些好主意,只需要在issue页面写下来就好。如果你有好的代码要贡献,欢迎随时送达PR给我。
目前据我了解的情况是,市面上绝大多数USB网线转接器,使用的都是RD9700这个型号,也就是DM9601芯片。因此,应该很容易测试开发这个驱动。
我怎样安装它?
- 从这里下载并用Xcode编译它。
- 使用sudo把驱动拷贝到/System/Library/Extensions然后重建缓存(或者通过OC/Clover注入,仅限黑苹果)。
我在13.6上已经测试过,它很可能支持12.0以上版本,但我目前尚未测试。
顺带放几张已经测试的照片:
首先是驱动加载时的情况:
然后是驱动卸载的情况:
目前来说,这个驱动已经可以正常卸载和加载了,且能够被系统识别出来,剩下的就是网络通信功能的添加(实际上在这个图里我已经移植了一部分的网络通信功能)。
驱动下载以及开发文档
鸣谢
- @haiku 的 haiku project
- @samuelv0304 的 USBCDCEthernet(致以最崇高的敬意!)
- @zxystd 对此项目编写的帮助
许可证
这个项目的代码遵循 苹果公共源代码许可证(ASPL)。点击License可以查询更多相关信息。