macos - 在运行时修改我自己的内核二进制文件的直接和潜在影响?
问题描述
我更像是一名网络开发人员和数据库专家,但与kernel_task
我个人机器上的温度和温度相关的严重不便的性能问题让我有兴趣深入了解我的 Mac OS 的细节(我注意到一些进程会触发长期的峰值在内核任务中,尽管 CPU 温度一直很低并且新重新映像的机器)。
我是我自己的 OSX 机器上的 root 用户。我可以阅读/System/Library/Kernels/kernel
。我的理解是这是这台机器的“ Mach / XNU ”内核(虽然我不太了解这些,但我很惊讶它只有13Mb)。
如果我修改或删除会发生什么/System/Library/Kernels/kernel
?
我想因为它是在运行时,所以在我尝试重新启动之前事情可能会好起来。如果是这种情况,是否会仔细修改此文件会更改我的操作系统的行为,仅在重新启动时有效,假设它不会导致内核恐慌?(内核恐慌只是linux的事情吗?)
解决方案
如果我修改或删除会发生什么
/System/Library/Kernels/kernel
?
首先,您需要禁用 SIP(系统完整性保护)才能修改或编辑此文件,因为出于安全原因,默认情况下它甚至受到 root 用户的保护。
如果删除它,您的系统将不再启动。如果你用不同的 xnu 内核替换它,假设它与已安装的设备驱动程序和其他 kexts 以及操作系统用户空间充分匹配,那么理论上该内核将在下次启动。
请注意,您不需要删除/替换内核文件来启动不同的内核文件,一次可以安装多个。有关详细信息,请参阅 Apple 内核调试工具包 (KDK) 随附的文档,您可以从Apple Developer Downloads Area下载该文档。
我想,因为它是在运行时,所以在我尝试重新启动之前,一切可能都会好起来。
是的,内核在引导过程的早期就被引导加载程序加载到内存中;该文件不再使用,除了在设备驱动程序更改时生成预链接内核。
最后,我觉得我应该解释一下您实际上似乎正在尝试诊断/修复的内容:
但是与我个人机器上的 kernel_task 和温度相关的严重不便的性能问题使我有兴趣深入研究我的 Mac OS 的细节
kernel_task
运行的代码不仅仅是kernel
核心本身。具体来说,任何已加载的 kexts(参见kextstat
命令)——在现代 macOS 系统上有很多——都被加载到内核空间中,这意味着它们被计入kernel_task
.
内核 CPU 使用率的长期峰值听起来可能是由文件系统自我维护或卷加密/解密活动引起的。它们几乎肯定不是 xnu 内核本身的基本编程错误。(虽然我认为愚蠢的错误很容易犯。)
另一个可能的罪魁祸首是设备驱动程序。尤其是 GPU 驱动程序是非常复杂的软件,即使您的系统看似空闲,它们当然也很忙。
处理这个问题的第一步——如果确实存在的话——是找出内核对这些 CPU 周期的实际操作。因此,为此您需要进行一些分析和/或跟踪。在正在运行的内核上执行此操作很可能再次需要禁用 SIP。Xcode 附带的 Instruments.app 能够分析进程;我不确定是否仍然可以kernel_task
使用它进行概要分析,我认为它至少在早期版本中是可能的。另一个可能的选择是 DTrace。(有关于这个主题的整本书)
推荐阅读
- python-3.x - 如何在python中将多维numpy数组写入csv文件
- ruby-on-rails - Rails:如何处理命名空间模型之间的关联?
- html - HTML粘贴事件,将粘贴区域限制为div边框
- javascript - chrome中的pointerdown事件使所有进一步的事件仅与当前浏览器窗口相关
- sql - 如何使用最后一个字母数字键作为参考修剪数据
- php - Flashdata在codeigniter中不起作用
- javascript - 如何处理gmail弹出窗口?看截图
- angular - oncheckbox 检查事件使用角度 4 中的事件将数据从一个组件发送到另一个组件
- java - 我们不使用@override 注释会发生什么?
- node.js - 从 expressJs 发送其他域的文件