各位好,我是澎湖冰洲,从今天起,我将在远景不定时更新IOKit驱动教程!!!
其实想做这个东西,已经有很长时间了,但是始终没有下定决心。为什么呢?因为第一,我本身就是半吊子,不能算完全的开发者;第二,发这么个东西,写的不好,容易被喷。但是,昨天某些人的行为刺激了我,最终促使我下定决心,做出这个教程来。我决定,将我的教程作为一个起点,一个抛砖引玉的起点,吸引更多的IOKit大佬前来论坛,为黑苹果贡献更多驱动来。
由于本人水平有限,编写时间仓促,难免有所疏漏,还请各位批评指正,共同完善
废话说完了,该开始进入正题了
首先今天开篇,我想跟各位谈谈什么是IOKit。如果我直接跟各位提出这个东西,恐怕很多人都没法理解这个概念,但是如果我说出诸如FakeSMC、Lilu、VoodooI2C这样的项目,我想大家都会第一时间反应:咦,这不是我们用的黑苹果驱动嘛。如果你能这样想,那就对了。实际上,你们所熟知的这些驱动,都是基于IOKit框架开发的驱动。IOKit框架,是由苹果设计的,基于内核态与用户态之间过渡的一个驱动框架,这个框架封装了一些很多底层的kpi(内核接口),让你在写驱动时,会变得更加容易。
那么有的同学会说,冰洲,不过就是个封装嘛,咋就容易了?其实,如果你对比过Linux的驱动代码就会知道,封装的一个最大优势,就是减少了代码量,避免了很多重复的工作。不得不说,苹果在IOKit方面,很有远见,其他系统如windows、Linux等,大多数都是用C语言来开发驱动,可是苹果却比较标新立异,它的所有IOKit框架驱动,全部采用c++来书写(当然win也支持c++,只不过不如mac这么彻底)。至于为什么搞c++来书写,我想学过c++的同学都知道,c++是一种OOP(面向对象编程)的语言,而且混合了C的特性,既可以无伤实现与C的混合编译(使用extern关键字),同时也可以支持OOP的很多特性,如继承,封装等。可以说,是一个代替C语言开发驱动的不俗选择之一。有人会问,冰洲,OOP具体有啥好处啊?概括起来七个字:”避免重复造轮子“(感谢Linux内核开发群某位大佬的概括,很精辟)。利用OOP提供的类,可以实现多个数据对象之间的互相调用,以及类与类之间的继承,最大限度地减少开发量。具体关于OOP的优势,大家可以自行百度,这里不再赘述。
说完了这些有些懂c++的人会问,冰洲,你这不是扯淡嘛,c++用了那么多东西,又用类又用库什么的,跑起来驱动不是要卡死嘛?是的,你说的没错,所以这里,我要说明一点,苹果驱动开发所使用的C++,绝非你在用户空间编程接触的那个C++,它是基于C++、IOKit、libkern改造后的C++子集,这一点大家一定要明确。既然是子集,那么有些C++特性,在IOKit编程里,自然是不能用了。这其中,就包括了STL、运行时(Runtime)以及异常处理(exception-handling)。这三块内容,不仅对于内核编程毫无帮助,而且会极大拖慢驱动运行速度,所以在IOKit编程里,这三块是不可以用的。
- 10