我想在没有连接AC适配器的翻盖模式下使用Macbook air。但是,当我关闭盖子时,Mac OS会强制系统进入睡眠状态。
我发现苹果开源的这部分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 :(得分:0)
重新编译xnu内核比你想象的要容易:
http://shantonu.blogspot.ca/2013/10/building-xnu-for-os-x-109-mavericks.html
然而,Apple发布OSX维护版本的源代码的速度相当慢,因此您必须将更新延迟10.9.x,直到源可用。除此之外,您有两个明显的选择:
在这两种情况下,请在IOPMrootDomain::shouldSleepOnClamshellClosed
反汇编中找到mach_kernel
函数。弄清楚它在哪里读取acAdaptorConnected
并将这些指令替换为使代码表现得像acAdaptorConnected
始终为真的那些指令。
在运行时修补时需要注意。该方法是私有的,因此您无法使用kext链接器直接获取其地址,因此您需要从其他地方获取地址。
FWIW,我并不是100%确信这段代码应该归咎于你所看到的行为。如果连接了外部显示器,clamshellDisabled
通常应为true
。如果您专门尝试使用附带否屏幕的Macbook,您可以尝试生成假的kIOPMDisableClamshell
电源事件,该事件应该翻转该标志。
顺便说一下,Apple在内核中硬编码这种行为有点令人失望 - 似乎是一个简单的用户空间脚本应该决定的事情。 : - (