本帖最后由 penghubingzhou 于 2019-5-3 00:12 编辑
- 由于文章篇幅过大,因此这里只放摘要进来,完整教程,请见:https://www.penghubingzhou.cn/2019/05/02/Battery%20Hotpatch%20Make/
复制代码 前言这个教程,是基于宪武大神的口述,加上博主的亲身实践并精心整理而成的,且发布已经得到宪武大神的授权,任何其他形式的转载请注明出处!!!教程并不一定适用于所有情况,只是给各位提供一个比较基础的思路。如果中间有任何问题,欢迎反馈给我,好让我及时更新教程。
我为什么要修改
修改这个的意义,实际就是热补丁的意义。尽管我已经在我的另一篇教程里面说过了热补丁的好处,我还是乐意在这里再复述一遍。
热补丁的编辑更加高效。使用热补丁,你不需要去修改其他的无关代码,也不需要你去联合反编译DSDT然后除错,更是大大节省了你的工程量。
热补丁更加安全。如果热补丁导致你的启动出现问题,你只需要还原对应的热补丁修改(删除热补丁)即可,既快捷又方便,并且也无需备份什么。而如果是DSDT,在改动前你必须备份原有DSDT,而且出了问题时排除代码是个很让人头疼的问题。
热补丁管理方便。每个功能可以写一个热补丁,无论是配置文件里还是SSDT,都方便管理与添加;并且由于热补丁的动态注入特性,在部分情况下可以实现直接修改DSDT报错而不能完成的修改。
热补丁与平台无关。由于这一点,有些修改的热补丁可以跨平台使用,大大提高了黑果的移植度以及修改工程量。尤其是,当你发现某些机型的DSDT不能通用但是却具有高度相似的修改时,热补丁的优势将尤其明显(比如潮7000 13寸与14寸,以及潮5000关于触摸板的部分)
基于上述这几点,我们也显然可以看到了电池热补丁的优势:跨平台、易修改、易参考、高度可移植。
阅读预备
正如我一直跟黑果进阶的同学反复强调的那样,热补丁是DSDT的延伸,因此,基于这一点,以下情况,我不推荐您阅读此教程:
没有良好的DSDT基础 电池尚未用DSDT补丁修改好
在阅读本教程之前,建议先去阅读下这篇帖子:修改dsdt实现电量显示方法(整理修改已有帖子),了解下基础的字节以及补丁工作原理,然后再来阅读下本教程。
原理
电池热补丁的原理,本质就是热补丁的原理以及电池的字节拆分原理,在此我不再赘述,有兴趣的请自己去百度相关教程。不过涉及到一些这二者协调部分的原理,在这里我有必要解释一下:
我们知道,在DSDT的电池补丁里,电池的各种变量,存在一个变量的字节位占用问题,如果将变量字节位搞错,将会导致打补丁后的DSDT无法正常显示电池信息。而热补丁本质就是DSDT的延伸,因此,我们在热补丁中动态修补电池字节数据的时候,也必须保留对原有字节位的占用,而不能随意错位。
电池的数据一般存储在一个大的OperationRegion块中。懂热补丁的都知道,显然OperationRegion方法是不允许直接注入的。因此,我们通常想到的就是直接将电池设备改名,重新注入数据。这种方法经过本人测试,存在很大问题,其中之一就是数据无法正确注入修改后的电池数据(OperationRegion)到DSDT中,会报错。另外这样书写的热补丁代码量太大,需要处理的引用与方法交叉十分多。
所幸宪武大神给出了一个折中的方法:新建一个OperationRegion块,在这个新块里动态注入所有的拆分字节数据;同时,对原有的未拆分字节保留空位,从而在保证位移量正确的情况下正确注入并引用新的数据。如此,电池就可以以热补丁的形式注入字节数据并被修改为正确信息。
当然,这种方法也有其弊端在里面:由于二次调用数据,这样的热补丁执行效率会有点低,但是对于现在的机子而言,这个效率的影响微乎其微。
鸣谢
@宪武 电池热补丁思路提供
|