当前位置:   article > 正文

MacOS 驱动调试笔记_kernel_debug_kit

kernel_debug_kit

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, 
          2.9.2. 查找连接(IODisplayConnect)的Framebuffer 
          2.9.3. 调用fConnection->getFramebuffer(),得到Framebuffer()
          2.9.4. 判断 fConnection->getAttributeForConnection(
                  kConnectionSupportsHLDDCSense, NULL );
          2.9.5. 判断 hasDDCConnect(fConnection->getConnection())
          2.9.6. 调用 framebuffer->getDDCBlock( fConnection->getConnection(),1, kIODDCBlockTypeEDID, 0, (UInt8 *) &readEDID, &length );
          2.9.7. framebuffer调用 driverIO和硬件驱动进行通信,传入参数: cscGetDDCBlock, &ddcRec,blocktype传 kIODDCBlockTypeEDID, blocknumber传1.
 

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,头文件和库基本上都可以找到了。



 

     


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/226412
推荐阅读
相关标签
  

闽ICP备14008679号