赞
踩
1. 10.13 不可以在system下看到系统层的log了,要用log 命令来看, 如
1.1. log show --predicate 'process="kernel"' #查看内核的已经记录的log
1.2. log stream --predicate 'process="kernel"' #查看即时的log
1.3. sudo log erase --all #删除全部log
1.4 log stream --level=debug 'process="WindowServer"' #查看windows的log, level设置为debug.
1.5 调试要到开发者网站下载kernel debug kit, 里面包括了debug版的内核文件,要copy到/S/L/kernels/下, 添加启动参数,从debug核内核启动系统, 然后使用lldb的
kdp-remote ip进行连接调试,下载的kernel debug kit安装在/Library/Developer/KDKs/KDK_10.13.1_17B45a.kdk/里,里面有一个readme.html, 会告诉你具体怎么调试.
1.6 发行版的内核,打印内核的地址指针会打印不出来显示<private>,10.13以上好像听说加启动加-show_pointers的参数也不行了。这个暂时用getprovider()->name,用来区别不同的对象
2. 显示驱动的架构:
2.1 基类都在IOGraphicsFamily, 这个部分代码苹果已经开源,下载了可以成功编译IOGraphicsFamily的kext驱动, 上层的驱动都应该继承IOFrameBuffer.
2.2 每个显示器都有一个IOFrameBuffer, 它的Privider是这个显示器
2.3 显示相关的操作都经过IOFrameBuffer, 如设置Timing(分辨率,刷新率), 设置颜色,关闭,打开。
2.4 WindowServer是桌面层的核心,它作为client和IOFrameBuffer打交道, 它连接到framebuffer,发送相应的命令,如命令#define IOFB_FID_extSetStartupDisplayMode 20
2.5 IOFrameBuffer 又是图形硬件层驱动的Client, 它通过DriverIO和硬件层驱动进行操作和查询.
2.6 10.11以前是CoreGraphics.framework + IOKit.framework 组成 桌面ring3层的图形管理, 10.12.x 以后是 SkyLight.framework + CoreDisplay.framework
2.7 ATI的驱动是原生的驱动,直接继承IOFrameBuffer实现,也是苹果自己实现的
2.8 为了支持非原生的驱动,如Nvidia 的驱动, 派生了IONDRVFramebuffer, 这个在IONDRVSupport.kext里.
2.9 如读显示屏的EDID,
2.9.1. IODisplay调用 readFramebufferEDID,3. Nvida的WebDriver的组织:
3.1 NVDAResmanWeb实现了IONDRVFramebuffer, 类名为NVDA , 重载了, start, stop, setup,doDriverIO, validateDetailedTiming,setAtrributeForConnection, getAttributeForConnection等一堆重载方法.
3.2 NVDAResmanWeb通过RmClient和硬件驱动打交道, 主要的通信基本通过 _NvRmControl,doDriverIO里把参数转一下就转给NvRmControl了。
3.3 NVDA注册了,HDCP, Hotplug等中断服务, 对于dell up2715k, 在热插拔的时候,会做特别的判断,以支持双dp 5K输出.
3.4.NVDAGP100HalWeb为显卡的硬件驱动,里面有一个pixel-clock的限制,原值是: 165000(0x28488), 这里导致4K无法输出, 可以直接改成1000000.
4. 编译Apple open source.
1. sdkroot要从macosx.internal 改为macosx
2.缺的和私有的文件基本都在xnu这个包里,编译有缺的话,find, grep....
3.到opensource.apple.com 把全部包都下载下来,解压好,以用来找头文件之类的
4.找好缺失的头文件,在xcode里设置好header search的目录, 就可以直接编译了. 编译了IOGraphis,完全了没有问题.
5. LILU
1. 这个基于capstone(https://github.com/aquynh/capstone.git), 实现系统层的补丁和勾子,可以直接打内存补丁,还可以hook住某个方法和函数,编写代码对原功能进行修改。https://github.com/vit9696/Lilu.git
2. 自己编译一下debug的版本,启动参数加上-liludbgall, 通过log命令就可以查看debug log了。
3. 其它的lilu插件一般下载下来都没有包括lilu.kext的,把自己编译出来那个放到项目的根目录或者做个link,头文件和库基本上都可以找到了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。