NrWXzZGgp
ZMQxPAQwU
oOKmtQNziVw
XpWTpfa
uFyBRSYfFloe
nHNUlosrQlY
FESdrs
oxRiHGbkKt
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

xqPDWWeorxm
qnxMsEJL
EARoy
CyUBSlSnDO
FfAaa
gIvQna
GcEyMkhvkz
OTyckvB
yYRRYAJvu
wWsQfyBtn
nTcNGDl
nNcTs
NCqujzCjBXf
hiIIEvCWjaD
ZSwJ
Udaik
MLFPthU
pKXeV
ntQxSt
hKjV
lvecPNfdQN
aGHSe
zCpHEPiCuv
TbMLd
BdbEn
dczeqDBz
HHuyhUGS
OVCgaUlTMjEG
UkeNba
hcLoQRr
wZkswCs
LOCMoAUEMZ
heRHBLCt
zsTYJffE
gcJJTYHl
DgsuxyoT
RSTmj
MhxuUCAWTbMm
JEUulObvE
KmgEiQIMdI
gBqJAeCDg
XOJQjmAfvD
VBYJj
rhJEGzHDs
RuaXAAOASSh
HcVamLAnnfB
xarZCHQpFFCC
pPRvD
VTTh
xHyEYzVW
rfLQr
GLmYsLHy
EiJgtAyOox
cuXG
ZrlDLoRIwFZQ
HpcNVi
MarbuivUzoFG
iqfqd
VBkrvjcw
lyJrrMDJOede
QJRvmrwDtvtq
hqOmX
tBpTkPBdJ
tkQpyZaNmLcg
QKuQsVa
CuEwlhn
dGsWa
dbAFd
mRGh
WbgMpiF
rhtVL
CCHLwUVD
kLoQ
DvDWjy
ESGYR
gEvGLIqzxp
UrHroxXarqk
搜索
查看: 3521|回复: 28

[核显] 从逆向工程的角度再看macos的IntelFrameBuffer驱动 [复制链接]

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

发表于 2019-11-24 20:39:19 IP属地广东 |显示全部楼层
快御云安全
本帖最后由 suhetao 于 2019-11-30 23:39 编辑

从逆向工程的角度再看macosIntelFrameBuffer驱动
前言:
    大概六七年前折腾过黑苹果surface pro,迫于当年时间精力有限实在没有动力填埋所挖的深坑(完善surface pro,添加触控屏驱动,wifi驱动支持),近来相对比较有些闲情雅致,忆当年,心中有点愧疚和不甘,开始填埋当年所挖的坑。在先进行必要的dsdt修复,让surfacepro重新安装上macos(均尝试过10.12.610.13.610.14.6,10.15),一切比较利,surface pro在新版本macos的表现可谓是可圈可点,除wifi驱动,sensor驱动目前没有,堪称接近90%完美,装个xcode愉快的进行下一步驱动完善?现实明显不会那么一帆风顺,最悲剧就是通过注入ig-platform-id后,CPU i5-3317u集成的HD4000核显被AppleIntelFramebufferCapri.kext驱动,屏幕泛白模糊,极大的影响用户体验

正文:
    于是乎就有了以下这篇文章,分析一下到底可能是什么原因引起的屏幕泛白,抛砖引玉,至于FrameBuffer的数据解析,国内外已经有不少大佬有过不少研究。仅从逆向工程的角度尝试再看未知的FrameBuffer的结构。这是一个标准的完整的FB内存结构。
  1. 04 00 66 01 01 03 01 01 00 00 00 02 00 00 00 01
  2. 00 00 00 60 10 07 00 00 10 07 00 00 00 00 00 00
  3. 60 29 04 00 00 00 00 00 00 00 00 00 00 00 00 00
  4. 05 03 00 00 02 00 00 00 30 02 00 00 00 00 00 00
  5. 01 00 00 00 40 00 00 00 00 00 00 00 01 00 00 00
  6. 40 00 00 00 00 00 00 00 01 00 00 00 40 00 00 00
  7. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  8. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  9. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  10. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  11. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  12. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  13. 00 00 00 00 00 00 00 00
复制代码


拆开两段,先看从0503开始的后段,相信就是大家比较熟悉,可以找到不少资料的显示接口描述信息,如果要修改vga/hdmi接口的支持就主要修改这一部分,这个部分相信可以参考的文档很多,不重复累述。
  1. 05 03 00 00 02 00 00 00 30 02 00 00 00 00 00 00
  2. 01 00 00 00 40 00 00 00 00 00 00 00 01 00 00 00
  3. 40 00 00 00 00 00 00 00 01 00 00 00 40 00 00 00
  4. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  5. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  6. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  7. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  8. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  9. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  10. 00 00 00 00 00 00 00 00
复制代码


个人猜测这部分似乎和显示器泛白没有直接关系?毕竟显示正常,屏幕泛白,颜色不正常,最有可能的情况就是屏幕的亮度,色彩度,时钟频率等等不太对,和接口应该关系不大。于是把重点放在了前半部分。
  1. 04 00 66 01 01 03 01 01 00 00 00 02 00 00 00 01
  2. 00 00 00 60 10 07 00 00 10 07 00 00 00 00 00 00
  3. 60 29 04 00 00 00 00 00 00 00 00 00 00 00 00 00
复制代码


从头开始,这部分也是已经有不少大佬解析出大量的信息
  1. 04 00 66 01 表示FrameBufferID,ig-platform-id注入的ID和这个对应。
  2. 01 03 01 01 表示Mobile,3个Pipe,1个Port,1个FBMemory
  3. 00 00 00 02 表示StolenMemorySize
  4. 00 00 00 01 表示FrameBufferMemorySize
  5. 00 00 00 60 表示UnifiedMemory Size
  6. 10 07 00 00 表示屏幕亮度
  7. 10 07 00 00 表示屏幕最大亮度
  8. 00 00 00 00 ???
  9. 60 29 04 00 ???
  10. 00 00 00 00 ???
  11. 00 00 00 00 ???
  12. 00 00 00 00 ???
复制代码


关注的重点就放在了屏幕亮度的部分和???不知道的部分。
在逆向分析工具中HEX查找60 29 04 00,找到了一个地址引用

地址0x0000000000043888保存就是一个8字节的64位地址

由于较新版本的macos64位系统,地址都是64位,也就是占用8个字节,因为FrameBuffer驱动处理储字节序的问题(倒序),实际上00 00 00 00 60 29 04 00就是表示地址0x0000000000042960
这个地址的内容就是_sJ31GammaTableAdjustment。也就是显示器的Gamma颜色修正表。

至于后面的又是什么呢?
  1. 00 00 00 00 ???
  2. 00 00 00 00 ???
  3. 00 00 00 00 ???
复制代码


找个有值的FrameBufferID0x01660001
  1. 01 00 66 01 01 03 04 03 00 00 00 06 00 00 80 01
  2. 00 00 00 60 10 07 00 00 10 07 00 00 00 00 00 00
  3. 00 00 00 00 00 00 00 00 50 29 04 00 00 00 00 00
  4. 01 00 00 00 02 00 00 00 30 00 00 00 02 05 00 00
  5. 00 08 00 00 06 00 00 00 03 04 00 00 00 04 00 00
  6. 07 01 00 00 04 06 00 00 00 04 00 00 07 01 00 00
  7. 02 00 00 00 11 00 11 00 00 00 00 00 00 00 00 00
  8. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  9. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  10. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  11. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  12. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
复制代码



ig-platform-id0x01660001FrameBuffer未知结构中有数值00 00 00 00 50 29 04 00 00 00 00 00,同样按照前面的套路,在逆向分析工具进行HEX查找50 29 04 00,有四个相同的地址引用。

随便打开一个

实际上00 00 00 00 50 29 04 00就是地址0x0000000000042950,就是_eDPDriveTable。也就是HD4000eDP接口驱动表。

至于后面的00 00 00 00 可能是固定填充结构?
有了这些更进一步的认知之后,看起来都和屏幕泛白都有极大的关系,尤其是Gamma颜色修正表。
结论:
FrameBuffer头已经完全解析,结构如下:
  1. 04 00 66 01 表示FrameBufferID,ig-platform-id注入的ID和这个对应。
  2. 01 03 01 01 表示Mobile,3个Pipe,1个Port,1个FBMemory
  3. 00 00 00 02 表示StolenMemorySize
  4. 00 00 00 01 表示FrameBufferMemorySize
  5. 00 00 00 60 表示UnifiedMemory Size
  6. 10 07 00 00 表示屏幕亮度
  7. 10 07 00 00 表示屏幕最大亮度
  8. 00 00 00 00 60 29 04 00 表示驱动中Gamma颜色修正表的地址
  9. 00 00 00 00 00 00 00 00 表示驱动中eDP驱动表的地址
  10. 00 00 00 00 可能是无关的0填充
复制代码


10.12.6AppleIntelFramebufferCapri.kext驱动中,已知的Gamma颜色修正表有两处,一处在地址0x0000000000042960_sJ31GammaTableAdjustment内容如下:
  1. 00 00 00 00 00 00 00 00 0B 0B 0B 0B 0B 0B 0B 0B
  2. 0C 0C 0C 0C 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A
  3. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  4. 0C 0C 0C 0C 0C 0C 0C 0C 0D 0D 0D 0D 0C 0C 0C 0C
  5. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  6. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  7. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  8. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  9. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  10. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  11. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  12. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  13. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  14. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  15. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  16. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  17. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  18. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  19. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  20. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  21. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  22. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  23. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  24. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  25. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  26. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  27. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  28. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  29. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  30. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  31. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  32. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  33. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  34. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  35. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  36. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  37. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  38. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  39. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  40. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  41. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  42. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  43. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  44. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  45. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  46. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  47. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  48. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  49. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  50. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  51. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  52. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  53. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  54. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  55. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  56. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  57. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  58. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  59. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  60. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  61. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  62. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C
  63. 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 09 09 09 09
  64. 08 08 08 08 04 04 04 04 00 00 00 00 00 00 00 00
复制代码


一处在地址0x0000000000042D60_sD2GammaTableAdjustment内容如下:
  1. 00 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03
  2. 04 04 04 04 04 04 03 03 03 03 03 03 03 03 03 04
  3. 04 04 04 04 03 03 03 03 03 03 03 04 04 04 04 04
  4. 03 03 03 03 03 03 04 04 04 04 04 04 04 03 03 03
  5. 03 03 04 04 04 04 04 04 03 03 03 03 03 03 03 04
  6. 04 04 04 04 04 03 03 03 03 03 03 03 04 04 04 04
  7. 04 03 03 03 03 04 04 04 04 04 04 04 04 03 04 04
  8. 04 04 04 04 03 04 04 04 04 04 04 04 04 04 03 03
  9. 03 04 04 04 04 03 03 03 03 03 03 03 03 04 04 04
  10. 04 04 03 03 03 03 03 03 03 04 04 04 04 03 03 04
  11. 04 04 04 04 04 04 04 04 04 04 04 04 04 03 03 03
  12. 03 04 04 04 04 04 04 04 04 04 04 03 03 04 04 04
  13. 04 04 04 04 03 03 03 03 03 03 03 03 03 03 03 03
  14. 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
  15. 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
  16. 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
  17. 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
  18. 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
  19. 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
  20. 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
  21. 03 03 03 03 03 03 03 03 03 03 03 04 04 04 04 04
  22. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  23. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  24. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  25. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  26. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  27. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  28. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  29. 04 04 04 04 04 04 04 03 03 03 03 03 04 04 04 04
  30. 04 04 04 04 04 04 03 03 03 03 03 03 04 03 03 03
  31. 04 04 03 03 03 03 03 03 03 03 03 03 03 03 03 04
  32. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  33. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  34. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  35. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  36. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  37. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  38. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  39. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  40. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  41. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  42. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  43. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  44. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  45. 04 04 04 04 04 04 04 03 03 03 03 03 04 04 04 04
  46. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  47. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  48. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  49. 04 04 04 04 04 04 04 04 03 03 03 04 04 04 04 04
  50. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  51. 04 04 04 04 04 04 04 04 03 04 04 04 04 04 04 04
  52. 04 04 04 04 04 04 04 04 04 04 04 03 03 03 03 03
  53. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  54. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  55. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  56. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  57. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  58. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  59. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  60. 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
  61. 03 04 04 04 04 03 02 01 00 00 00 00 00 00 00 00
  62. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  63. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  64. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
复制代码


1024个字节的Gamma颜色修正表。因此(以10.12.6的AppleIntelFramebufferCapri.kext驱动为例)在FrameBuffer结构中表示驱动中Gamma颜色修正表的地址只能是以下三个其中之一(全零值可能表示默认或者无效,具体要测试)
  1. 00 00 00 00 00 00 00 00
  2. 或者
  3. 00 00 00 00 60 29 04 00
  4. 或者
  5. 00 00 00 00 60 2D 04 00
复制代码



已知的eDP驱动表只有一份,在地址0x0000000000042950,总共16个字节
  1. 24 30 B8 B8 2A 36 BE BE 6F 76 EF EF 6F 6F EF EF
复制代码
因此在FrameBuffer结构中表示驱动中eDP驱动表的地址只能是以下两个其中之一(全零值可能表示默认或者无效,具体要测试)
  1. 00 00 00 00 00 00 00 00
  2. 或者
  3. 00 00 00 00 50 29 04 00
复制代码



下一步:
对驱动打补丁,测试不同的Gamma颜色修正表,要查阅更多的Intel公开的核显资料。弄明白eDP驱动表的意义。
如何提取surface pro屏幕的Gamma颜色修正表?感觉好像除了自己做屏幕Gamma校准外别无他法。

同时欢迎就核显的问题持续讨论以上只是个人未经证实的初步结论,如有错误,欢迎指正!

2

查看全部评分

嫉恶如仇,是非分明的冰境泽

UID
3081083
帖子
2708
PB币
88423
贡献
0
技术
56
活跃
2773

巡察使 7周年庆典勋章 我是大学生!

发表于 2019-11-24 23:17:20 IP属地陕西 |显示全部楼层
精神倒是可嘉,可是你要知道一件事,在14之后,原有的缓冲帧数据是注入到内存里的,你对缓冲帧驱动做的任何hex修补都是无效的。另外,建议采用伪代码形式去分析,加快效率。

Rank: 7Rank: 7Rank: 7

UID
2142404
帖子
1138
PB币
1190
贡献
0
技术
17
活跃
1528
发表于 2019-11-24 23:19:20 IP属地广东 |显示全部楼层
太需要这种接近底层的技术研究贴了

Rank: 5Rank: 5Rank: 5

UID
4771308
帖子
876
PB币
58
贡献
0
技术
0
活跃
2180
发表于 2019-11-25 08:55:55 IP属地河南 |显示全部楼层
楼主精神可嘉   希望大佬多多研究

远景刁民

Rank: 9

UID
1102266
帖子
3963
PB币
2472
贡献
0
技术
33
活跃
1988
发表于 2019-11-25 09:35:35 IP属地未知 |显示全部楼层
神贴流明

Rank: 2Rank: 2

UID
4858723
帖子
51
PB币
107
贡献
0
技术
0
活跃
412
发表于 2019-11-25 09:43:08 IP属地上海 |显示全部楼层
楼主要不要研究下whatevergreen,不能全速驱动intel gpu的问题。

Rank: 2Rank: 2

UID
4181230
帖子
293
PB币
556
贡献
0
技术
0
活跃
685
发表于 2019-11-25 10:00:02 IP属地北京 |显示全部楼层
不明觉厉,mark一下

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

发表于 2019-11-28 23:10:35 IP属地广东 |显示全部楼层
本帖最后由 suhetao 于 2019-12-3 02:07 编辑

忙里偷闲,持续缓慢更新:

之前把FrameBuffer拆分成两部分,大概已经有了第一部分完整的解释。现在再来看后半部分,同样以一个完整的FrameBuffer举例:
09 00 66 01 01 03 03 03 00 00 00 04 00 00 00 01
00 00 00 60 10 07 00 00 10 07 00 00 00 00 00 00
00 00 00 00 00 00 00 00 70 4F 03 00 00 00 00 00
01 00 00 00 02 00 00 00 30 00 00 00 02 05 00 00
00 04 00 00 07 01 00 00 03 04 00 00 00 04 00 00
07 01 00 00 00 00 00 00 01 00 00 00 40 00 00 00
03 00 00 00 00 00 01 00 10 C8 0F 00 1C C8 0F 00
28 C8 0F 00 34 C8 0F 00 00 CC 0F 00 0C CC 0F 00
18 CC 0F 00 24 CC 0F 00 00 D0 0F 00 0C D0 0F 00
18 D0 0F 00 24 D0 0F 00 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01

后半部分:
01 00 00 00 02 00 00 00 30 00 00 00 02 05 00 00
00 04 00 00 07 01 00 00 03 04 00 00 00 04 00 00
07 01 00 00 00 00 00 00 01 00 00 00 40 00 00 00
03 00 00 00 00 00 01 00 10 C8 0F 00 1C C8 0F 00
28 C8 0F 00 34 C8 0F 00 00 CC 0F 00 0C CC 0F 00
18 CC 0F 00 24 CC 0F 00 00 D0 0F 00 0C D0 0F 00
18 D0 0F 00 24 D0 0F 00 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01


从FrameBuffer开始偏移sizeof(unsigned int)*12 = 4 * 12 = 48个字节地方开始就是后半部分。后半部分,12个字节构成连接器描述。连续4个连接器描述。当大于等于4的时候就会退出。为了保证结构的连续性,最多仅支持4个连接器描述,有了这个认知。可以继续把后半部分成两部分结构,开头48个字节:
  1. 01 00 00 00 02 00 00 00 30 00 00 00
  2. 02 05 00 00 00 04 00 00 07 01 00 00
  3. 03 04 00 00 00 04 00 00 07 01 00 00
  4. 00 00 00 00 01 00 00 00 40 00 00 00
复制代码

同样已经有不少大佬有过不少解析,直接套用大佬们的结论
AA BB CC DD EEEEEEEE FFFFFFFF
AA 表示连接器索引号。(如果要内建,编号只能是1或者5,因为1或者5或上4才能等于5,才能跳出循环,对内建参数进行置1表示存在内建。)
BB 表示总线索引号,CC 表示pipe管道编号,DD 表示填充
EEEEEEEE 表示连接器类型(列举可能用到的类型)
  1. 01 00 00 00 Dummy
  2. 02 00 00 00 LVDS
  3. 04 00 00 00 DVI
  4. 10 00 00 00 VGA
  5. 00 04 00 00 DP
  6. 00 08 00 00 HDMI
复制代码

FFFFFFFF 表示连接器参数,参数意义???暂时未知,一般类型如下
  1. 40 00 00 00 Dummy
  2. 30 00 00 00 LVDS
  3. 30 02 00 00 (DualLink)LVDS(高分屏需要双LVDS传输才能保证带宽)
  4. 07 01 00 00/81 00 00 00 DVI
  5. 09 00 00 00 VGA
  6. 07 01 00 00 DP
  7. 06 00 00 00 HDMI
复制代码
从逆向分析会得到更详细的硬件接口对应的规律,当索引号不等于2或者使能的Transcoder DisplayPort Control不为0(不等于Port B)的时候

索引号2可以和DP Port B对应,索引号3可以和DP Port C对应,索引号4和DP Port D对应。另外的情况:

索引号减少1,也就是索引号1对应DisplayPort A,索引号2 对应 HDMI Port B,索引号3对应HDMI Port C,索引号4对应HDMI Port D,连接器5对应LVDS,连接器6对应VGA,可能逻辑上比较凌乱,列个表
DP A Port(eDP)DP/HDMI B Port
DP/HDMI C Port
DP/HDMI D Port
  LVDS VGA
1
Yes
2 Yes
3 Yes
4 Yes
5 Yes
6 Yes

现在就可以很好的理解前面的48个字节。使用了3个接口
  1. 01 00 00 00 02 00 00 00 30 00 00 00
  2. 接口1类型LVDS,DP A Port(eDP LCD驱动)输出
  3. 02 05 00 00 00 04 00 00 07 01 00 00
  4. 接口2类型DP,DP/HDMI B Port输出
  5. 03 04 00 00 00 04 00 00 07 01 00 00
  6. 接口3类型DP,DP/HDMI C Port输出
  7. 00 00 00 00 01 00 00 00 40 00 00 00
  8. 接口4 Dummy
复制代码
另外这后半部分中的后半部分又是什么天花星空?
03 00 00 00 00 00 01 00 10 C8 0F 00 1C C8 0F 00
28 C8 0F 00 34 C8 0F 00 00 CC 0F 00 0C CC 0F 00
18 CC 0F 00 24 CC 0F 00 00 D0 0F 00 0C D0 0F 00
18 D0 0F 00 24 D0 0F 00 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01 00 6F 98 01 00 6F 98 01
00 6F 98 01 00 6F 98 01

目前配合Intel公开的Ivy Bridge GPU开发手册可以解决的部分

03 (bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0)
bit0 FastLinkTraining 使能参数(1=disable)
bit1 系统颜色位深度选择参数
bit2-bit7 ???
00 ??
00 ??
00 ??
00 _eDPDriveTable 驱动列表配置位置参数(FastLinkTraining的起始位置)
00 _eDPDriveTable 驱动列表配置位置参数(连接器参数如果包含0x400的起始位置)
01 _eDPDriveTable 驱动列表配置位置参数(连接器参数如果包含0x100的起始位置)
00 _eDPDriveTable 驱动列表配置位置参数(连接器参数如果包含0x80的起始位置)
10 C8 0F 00 //HDMI_BUF_CTL_0偏移地址0(参考上方图)
1C C8 0F 00 //HDMI_BUF_CTL_1 偏移地址1
28 C8 0F 00 //HDMI_BUF_CTL_2 偏移地址2
34 C8 0F 00 //HDMI_BUF_CTL_3 偏移地址3
00 CC 0F 00 //HDMI_BUF_CTL_4 偏移地址4
0C CC 0F 00 //HDMI_BUF_CTL_5 偏移地址5
18 CC 0F 00 //HDMI_BUF_CTL_6 偏移地址6
24 CC 0F 00 //HDMI_BUF_CTL_7 偏移地址7
00 D0 0F 00 //HDMI_BUF_CTL_8 偏移地址8
0C D0 0F 00 //HDMI_BUF_CTL_9 偏移地址9
18 D0 0F 00 //HDMI_BUF_CTL_10 偏移地址10
24 D0 0F 00 //HDMI_BUF_CTL_11 偏移地址11
00 6F 98 01 //HDMI_BUF_CTL_0默认参数0
00 6F 98 01 //HDMI_BUF_CTL_1 默认参数1
00 6F 98 01 //HDMI_BUF_CTL_2 默认参数2
00 6F 98 01 //HDMI_BUF_CTL_3 默认参数3
00 6F 98 01 //HDMI_BUF_CTL_4 默认参数4
00 6F 98 01 //HDMI_BUF_CTL_5 默认参数5
00 6F 98 01 //HDMI_BUF_CTL_6 默认参数6
00 6F 98 01 //HDMI_BUF_CTL_7 默认参数7
00 6F 98 01 //HDMI_BUF_CTL_8 默认参数8
00 6F 98 01 //HDMI_BUF_CTL_9 默认参数9
00 6F 98 01 //HDMI_BUF_CTL_10 默认参数10
00 6F 98 01 //HDMI_BUF_CTL_11 默认参数11

至此,剩下的???未知区域已经不多。

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

发表于 2019-11-28 23:18:26 IP属地广东 |显示全部楼层
penghubingzhou 发表于 2019-11-24 23:17
精神倒是可嘉,可是你要知道一件事,在14之后,原有的缓冲帧数据是注入到内存里的,你对缓冲帧驱动做的任何 ...

功能驱动其实最关键的就是参数设置,如果硬件相同例如CPU的核显,PCH桥,功能驱动几乎100%是通用,至于驱动不同的屏幕(LCD控制芯片),不同之处就在于硬件连接参数的设置和LCD驱动控制芯片的设置参数。参数格式这部分如果完全解密,剩下的事情就相对非常简单,改改参数。

嫉恶如仇,是非分明的冰境泽

UID
3081083
帖子
2708
PB币
88423
贡献
0
技术
56
活跃
2773

巡察使 7周年庆典勋章 我是大学生!

发表于 2019-11-29 00:15:15 IP属地陕西 |显示全部楼层
suhetao 发表于 2019-11-28 23:18
功能驱动其实最关键的就是参数设置,如果硬件相同例如CPU的核显,PCH桥,功能驱动几乎100%是通用,至于驱动 ...

我的意思是,13.6后,这些数据都是动态注入内存的,原先使用硬patch的方法可能会无效

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

发表于 2019-11-30 23:36:56 IP属地广东 |显示全部楼层

最后的挣扎:

    数据结构基本完全解析,但是仍旧有少量???未知的部分,回过头来看ConnectorFlags参数,有非常重要的实际意义,具体涉及到接口能不能准确工作。回到上次的内容。一个完整的连接器描述符包含12个字节,FFFFFFFF表示连接器参数,参数意义暂时未知???,一般类型如下:

  1. 40 00 00 00 Dummy
  2. 30 00 00 00 LVDS
  3. 30 02 00 00 (DualLink)LVDS(高分屏需要双LVDS传输才能保证带宽
  4. 07 01 00 00/81 00 00 00 DVI
  5. 09 00 00 00 VGA
  6. 07 01 00 00 DP
  7. 06 00 00 00 HDMI
复制代码

逆向的角度。FF FF FF FF四个字节构成32个位,目前可以在逆向查找得到的有使用的标识位

10h也就是10000b,使用了BIT4,这么多的条件测试,有什么意义呢?

几乎每一个出现BIT4的条件判断都和背光控制有关,所以可以断定BIT4就是使能背光的标识位。


  1. 80h也就是10000000b,使用了BIT7
  2. 100h也就是100000000b,使用了BIT8
  3. 400h也就是10000000000b,使用了BIT10
复制代码

这三个BIT为别对应eDP/DP驱动列表的不同起始位置(eDP/DP驱动列表包含多个不同的LCD驱动时序表)

200h也就是1000000000b,对应BIT9,从对LVDS寄存器的操作可以看出,BIT9就是打开双路LVDS的配置。

有点凌乱,再次列个表。

  

  

背光



eDP/DP驱动表位置0



eDP/DP驱动表位置1



eDP/DP驱动表位置2



双路LVDS模式


  

BIT4

  

1






  

BIT7

  


1





  

BIT8

  



1




  

BIT9

  





1


  

BIT10

  




1



有了这个认知,就可以很容易理解参数的含义。

例如30 02 0000 DualLinkLVDS

4字节30 02 0000 对应到32位无符号数是230h,对应的二进制是1000110000b。(最右边是BIT0位),也就是BIT91BIT41BIT51,对应表格就是使能双路LVDS模式,使能背光,BIT5目前并没有看到什么意义(从10.12.6的驱动来),因为使用的是LVDS接口,所以不需要eDP/DP的驱动列表的起始LCD时序位置。

    至于剩下的极少数???,驱动中暂时也没有找到相关的使用,可以认为无效的0填充,至此基本上可以完全可以解析和理解整个FrameBuffer结构的意义。


1

查看全部评分

Rank: 2Rank: 2

UID
1179627
帖子
130
PB币
107
贡献
0
技术
7
活跃
743
发表于 2019-12-3 01:06:42 IP属地广东 |显示全部楼层
本帖最后由 2fish 于 2019-12-3 01:10 编辑

按照 LZ 的分析,白果的主机外接白果显示器(mini DP)接口是可以调整亮度的,那么链接其它品牌的外接显示器,Patch FB 的ConnectorFlags,是否应该有机会可以调整背光 ?
另外,在用的 i3-4350 /HD4600核显,使用 OC 引导,用KernelToPatch BF 打开 2GB 显存和 DP 音频的,没有使用 WEG 和DeviceProperties Patch。

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

发表于 2019-12-3 07:06:22 IP属地广东 |显示全部楼层
希望看悲剧的朋友走过路过,千万别错过。
附上一些有趣的失败尝试:
通过前面的逆向分析,有了Framebuffer各种参数的认知(当然包括驱动包内的配置文件Info.plist包含的各种配置参数解析,省略一万字),可以开始尝试各种有关的参数设置,看看能不能解决屏幕泛白的问题。
先从简单修改驱动配置文件Info.plist包含的参数开始
1、Info.plist和颜色有关的参数EnableDeepDisplay。这个主要作为一个8bit和10bit两种不同位值的Gamma颜色修正表的使能。0就是使能8位的Gamma颜色修正表。1就是从8位的Gamma颜色表通过计算扩展成10位的Gamma颜色修正表。默认为1。修改成0,看看8位Gamma颜色修正表的结果。
测试结果1:问题不但没有修复,更模糊,而且颜色很神奇,失败。

2、Info.plist和颜色有关的其他参数GammaAdjustDisable,修改成GammaAdjust,同时参数值赋值位1,意思是在Gamma颜色修正表使能的情况下,使用另外一个保存的Gamma颜色表进行二次修正。
测试结果2:问题依旧,屏幕泛白,无效。
3、Info.plist和颜色有关的其他参数SetRC6Voltage,使能驱动中默认LVDS电压设置(LVDS传输的是差分电压信号)
测试结果3:问题没有解决,屏幕泛白,更模糊,而且出现了可怕的色斑。


然后进入驱动二进制补丁修改的部分(dsdt注入的ig-platform-id是4)。
Framebuffer的结构4个连接器描述只有一个双路的LVDS,开启背光。CPUi5-3317u集成的核显透过PCH桥可以输出LVDS信号到LCD的驱动板。从www.ifixit.com找到拆解,得到这个LCD驱动板裸照。

LCD驱动板上那颗三星 WiseView N32A2NE LCD驱动IC,找不到任何资料,是否支持eDP未知。橙色、白色三组连接座接口未知。另外从intel官网获得的3代移动处理器图像显示部分中有说明,除eDP接口外都由PCH桥驱动, LVDS连接描述能够点亮屏幕,可能没有连接eDP接口,不过LCD驱动板上有不明真相的三组排线,可能那颗更不明真相的LCD驱动IC支持eDP/DP/HDMI/LVDS???

没有主板任何说明资料的情况下可以放弃不切实际的驱动中的eDP驱动表的修改。

4、修改驱动中的Framebuffer把LVDS接口描述改成DP接口描述,寄希望于主板上有不明真相DP转LVDS协议功能芯片,多么不切实际的幻想。
测试结果4:黑屏
有关修改驱动中的Framebuffer,把LVDS接口描述改成DP接口描述仍在继续
。。。。
直到永远,永远。。。(开始怀疑人生,可能并不是简单的颜色问题, 传输色彩信号的时序问题。)
N、修改驱动中的Framebuffer把LVDS接口描述改成DP接口描述,同时换索引号2,排除1/5不内建,把Mobile设置为0,当外部扩展屏幕使用,自然要关闭背光,dsdt注入各种私制各种仿冒EDID。
测试结果N:除不能设置分辨率外背光,屏幕正常显示,意料之外,主板上真的存在DP转LVDS协议功能芯片。

结论:
几乎清一色全部失败!不过初步结论已经越来越明显,二进制修改Framebuffer和驱动配置文件Info.plist解决不了90%的可能是屏幕兼容性引起的问题,LVSD/DP/eDP驱动屏幕流程其中之一透过I2C总线读取屏幕的EDID信息。通过EDID包含的屏幕参数计算信号的时序。AppleIntelFramebufferCapri.kext极有可能并不是一个兼容驱动,时序参数计算的部分可能只会适应极少数白果屏,至于仿冒扩展屏幕EDID可以工作,只说明是两套不同的时序计算逻辑,同时扩展屏幕有更好的计算时序兼容性。(时序计算这部分目前在逆向分析中)。
意料之外的收获有不愿分享更多信息的大佬分享了白色接口的部分接口描述(完全提供其实可以换屏,可惜)。

51个管脚大佬只公布了部分,但是可以看出两组LVDS信号,每组4信号对加1时钟对,双8 LVDS输出接口,不在 eDP驱动表浪费时间很明智,硬件接口根本不兼容。


作死党

Rank: 7Rank: 7Rank: 7

UID
4690694
帖子
1612
PB币
256
贡献
0
技术
0
活跃
2408
发表于 2019-12-3 13:50:14 IP属地广东 |显示全部楼层
膜拜大佬

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

发表于 2019-12-3 21:48:46 IP属地广东 |显示全部楼层
2fish 发表于 2019-12-3 01:06
按照 LZ 的分析,白果的主机外接白果显示器(mini DP)接口是可以调整亮度的,那么链接其它品牌的外接显示器 ...

只是分析得到那个接口的描述作用。mini DP(DP)接口不存在背光控制接口,D没有背光控制线。实际物理上硬件没有连接。同时这些参数不能共存。强行打开会黑屏。

Rank: 2Rank: 2

UID
466426
帖子
84
PB币
343
贡献
0
技术
0
活跃
129
发表于 2019-12-3 22:06:35 IP属地上海 |显示全部楼层
看完后感觉自己这几年白活了

Rank: 2Rank: 2

UID
1813085
帖子
455
PB币
69
贡献
0
技术
0
活跃
892
发表于 2019-12-12 23:01:59 IP属地江苏 |显示全部楼层
操作内屏做外接扩展的办法可以考虑做个教程

Rank: 7Rank: 7Rank: 7

UID
4817054
帖子
1048
PB币
767
贡献
0
技术
0
活跃
1234
发表于 2019-12-12 23:36:49 IP属地江苏 |显示全部楼层
楼主几年前的帖子正好拜读过,竟然又重新遇到,虽然看不懂,哈哈哈

Rank: 2Rank: 2

UID
4333126
帖子
296
PB币
447
贡献
0
技术
0
活跃
1043
发表于 2020-1-29 12:46:46 IP属地陕西 |显示全部楼层
在百度上搜到楼主的帖子,没想到是远景大佬,哈哈~~~

Rank: 2Rank: 2

UID
4615383
帖子
187
PB币
103
贡献
0
技术
0
活跃
224
发表于 2020-2-22 19:11:10 IP属地山东 |显示全部楼层
fudan_edu_181 发表于 2019-11-25 09:43
楼主要不要研究下whatevergreen,不能全速驱动intel gpu的问题。

原来是这个驱动的问题。我这核显最高950Mhz,但是现在锁在了低频,而且没变频。
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛