1.Apple
当苹果在2020年11月发布带有M1处理器的台式机产品时,许多技术界人士对这些系统的出色性能感到惊讶。但是那些一直关注苹果电话芯片组发展的人们都知道,苹果公司遵循的进化道路将产生强大的64位ARM处理器。
自Corelium 6于2014年发布以来,我们一直在Corellium上追踪Apple移动生态系统,该版本具有两个64位内核。从那时起,苹果一直将精力集中在构建更快的芯片上,而不是在芯片上投入更多的内核,而是更喜欢提高单线程性能。他们内部的硬件设计团队采用了这种方法,并产生了具有广泛功能集的独特部件,从而在架构功能方面处于业界领先地位。
在CPU内核和外围设备方面,这也使Apple芯片与所有其他64位ARM硬件完全不同。我们的Corellium虚拟化平台一直在为安全研究人员提供有关Apple ARM处理器上的操作系统和程序工作方式的无与伦比的见解。但是,在开发虚拟化系统的过程中,我们还获得了有关正在建模的硬件的知识,并且可以通过对真实硬件进行测试来最好地完善这些知识-我们只能在出现checkm8时才能做到这一点,使我们可以将程序加载到Apple智能手机上的漏洞。这直接导致了Sandcastle项目,我们在2020年初为A10处理器构建了内核端口。
因此,当Apple决定允许在具有M1处理器的Mac上安装自定义内核时,我们很高兴尝试构建另一个Linux端口,以加深我们对硬件平台的了解。在为安全性研究产品创建处理器模型时,我们正在并行处理Linux端口。
2.启动端口
M1的许多组件与Apple移动SoC共享,这为我们提供了良好的起点。但是,在编写Linux驱动程序时,非常明显的是非标准Apple SoC的真实情况。我们的虚拟环境在可以容纳的模型方面非常灵活;但是在Linux方面,64位ARM领域主要依靠一套定义明确的构建块和固件接口-在M1上几乎没有使用。
首先,Apple CPU以不同的方式引导操作系统内核。引导加载程序(通常称为iBoot)以称为Mach-O的格式加载可执行的目标文件,可以选择将其压缩并包装为基于签名的基于ASN.1的包装器格式,称为IMG4。为了进行比较,普通的Linux在64位ARM上以平面二进制映像(可选地压缩并以少数几种容器格式之一)开始,或者在UEFI平台上以Windows风格的“ PE”可执行文件开始。
但是,真正的惊喜始于更多的CPU内核。在其他64位ARM系统上,这是通过通过称为PSCI的接口调用固件来完成的(少数系统使用轮询表,但固件仍由轮询表负责)。但是在M1上,CPU内核从MMIO寄存器指定的地址(设置为内核映像中的特定偏移量,然后由引导加载程序锁定)开始,然后简单地开始运行内核。
如果这还不够的话,Apple设计了自己的中断控制器,即Apple中断控制器(AIC),它与两种主要的ARM GIC标准都不兼容。不仅如此:计时器中断(通常与ARM上的每CPU常规中断连接)被路由到FIQ(一种强大的体系结构功能),在旧的32位ARM时代更为常见。自然,Linux内核不支持通过FIQ路径传递任何中断,因此我们必须添加它。
当您尝试使系统中的多个处理器相互通信时,必须提供一组处理器间中断(IPI)。在较旧的Apple SoC上,通过执行对AIC的MMIO访问,与IRQ的处理方式类似。但是在较新的版本上,Apple使用一组处理器核心寄存器来调度和确认IPI,它们又以FIQ的形式提供。因此,FIQ支持确实非常重要。幸运的是,我们在安全研究产品中对虚拟模型的研究已经为我们做好了准备。
在解决了一些额外的硬件问题之后,添加了一个预加载器,该预加载器充当Linux的包装器,并为启动处理器内核提供了蹦床,我们可以设置一个帧缓冲区,并看到代表该处理器八个内核的八只企鹅M1。
3.需要输入!
不幸的是,由于我们没有用于M1 Mac的UART电缆,因此我们不得不寻找另一种添加键盘(甚至鼠标)的方法。在M1 Mac Mini上实现此功能的方法基本上有以下三种:M1芯片中的内置USB主机(用于Thunderbolt / USB端口),PCIe上的xHCI USB主机(用于A型端口)和蓝牙。
虽然我们不会详细介绍Apple蓝牙,但我们会注意到它使用了我们的虚拟化产品支持的基于非标准PCIe的协议,不仅需要在M1芯片上提供PCIe端口,而且还为此协议编写了定制的内核驱动程序。这似乎是快速完成此任务的最坏选择。
这意味着我们可以选择使用PCIe和使用标准内核xHCI驱动程序,还是使用内置USB控制器。苹果已经在其芯片中使用Synopsys DWC3双角色USB控制器已有一段时间了,并且它具有Linux内核驱动程序。不幸的是,Apple还习惯于在控制器周围添加自定义逻辑,因此最终需要做很多工作。
M1上的PCIe和内置DWC3 USB控制器都使用IOMMU(称为DART)。苹果一直在以一致的,不断发展的方式完善其DART设计,从而产生了出色的,功能齐全的IOMMU。最新版本甚至还支持子页面内存保护,这在其他地方很少见。(上个月,我们在IOMMU和其他类似设备上发表了一篇博客文章。)
要将M1内的USB端口实际连接到Mac Mini背面的USB C型连接器,我们必须与I2C上的芯片进行交互(这意味着GPIO和I2C驱动程序),该芯片具有定制的固件。在构建虚拟模型时,我们已经看到了这些协议的协议。如果您对系统有鸟瞰的话,这也就不足为奇了。
经过几天的研究,我们终于能够连接一个外部USB集线器并连接一个键盘,鼠标和一个闪存驱动器,从而为运行普通的桌面Linux发行版提供了可能性。
原创文章,作者:校长,如若转载,请注明出处:https://www.yundongfang.com/Yun32446.html