2013-12-13 54 views
1

我想在没有连接交流适配器的情况下使用Macbook air在翻盖模式下。但是,当我关上盖子时,Mac OS会强制系统进入睡眠状态。重写Mac XNU内核而不重新编译源代码

我发现XNU内核的这部分从苹果的开源可能与此行为:

由于IOKit /核心/ IOPMrootDomain.cpp

...

6362  /* 
6363  * Evaluate clamshell and SLEEP if appropiate 
6364  */ 
6365  if (eval_clamshell && clamshellClosed) 
6366  { 
6367   if (shouldSleepOnClamshellClosed()) 
6368    privateSleepSystem (kIOPMSleepReasonClamshell); 
6369   else 
6370    evaluatePolicy(kStimulusDarkWakeEvaluate); 
6371  } 

...

3061 //****************************************************************************** 
3062 // sleepOnClamshellClosed 
3063 // 
3064 // contains the logic to determine if the system should sleep when the clamshell 
3065 // is closed. 
3066 //****************************************************************************** 
3067 
3068 bool IOPMrootDomain::shouldSleepOnClamshellClosed(void) 
3069 { 
3070  if (!clamshellExists) 
3071   return false; 
3072 
3073  DLOG("clamshell closed %d, disabled %d, desktopMode %d, ac %d sleepDisabled %d\n", 
3074   clamshellClosed, clamshellDisabled, desktopMode, acAdaptorConnected, clamshellSleepDisabled); 
3075 
3076  return (!clamshellDisabled && !(desktopMode && acAdaptorConnected) && !clamshellSleepDisabled); 
3077 } 

当然,我可以编译内核,但我怀疑它是否是最新的Mavericks内核。所以我想知道是否可以通过插入动态库来替代内核空间函数,就像我们为用户空间函数所做的那样。

回答

0

重新编译XNU内核是很容易,你似乎认为:

http://shantonu.blogspot.ca/2013/10/building-xnu-for-os-x-109-mavericks.html

苹果一直相当缓慢但是发布源代码OSX的维护版本,所以你会不得不推迟更新10.9。直到源变得可用。

除此之外,你有一个2种明显的选择:

  • 直接补丁mach_kernel可执行文件在磁盘上。
  • 在运行时使用专用的kext修补IOPMrootDomain :: shouldSleepOnClamshellClosed函数。

在这两种情况下,找到mach_kernel拆卸IOPMrootDomain::shouldSleepOnClamshellClosed功能。找出它在acAdaptorConnected的位置,并将这些指令替换为使代码的行为如同acAdaptorConnected始终为真的指令。

在运行时修补时需要注意。该方法是私有的,所以你不能直接使用kext链接器获得它的地址,所以你需要从别处获取地址。

FWIW,我不是100%确信这个代码是为你所看到的行为负责。如果连接了外部显示器,则clamshellDisabled通常应为true。如果您专门尝试使用附带屏幕的Macbook,则可以尝试生成虚假的kIOPMDisableClamshell电源事件,该事件应该翻转该标志。

顺便说一下,苹果已经在内核中硬编码了这样的行为,这有点令人失望 - 看起来就像一个简单的用户空间脚本应该决定的那样。 :-(

+0

通读,你是正确的,clamshellDisabled是真的如果外部显示出现。我会尝试启用调试标志本周末,看看我能否找到任何东西,我猜可能是内核签名。我不确定如何实现option2,所以我最终可能会编译内核,无论如何,感谢您的指导,我对于快速响应感到非常惊讶,我相信这个特性在Apple中非常流行笔记本电脑客户 –

+0

'mach_kernel'完全没有签名:'codesign -v/mach_kernel'表示''/ mach_kernel:代码对象根本没有签名',所以修改/替换它不成问题。 – pmdj

相关问题