Linux如何移植到Apple Silicon M1 Mac mini
Linux如何移植到Apple Silicon M1 Mac mini,当你的苹果手机,iPad平板,Mac笔记本等苹果设备坏了之后是不是首先想到的就是去苹果官方维修店维修呢?但对于小部分动手能力强的朋友来说,就坏一个小零件就要找官方维修店大可不必,Linux如何移植到Apple Silicon M1 Mac mini,况且苹果维修店的维修费太高了,还不如自己动手修呢!可是往往有这种想法的人最终还是会找到官方维修店,因为你很难买到苹果的正品零件.下面跟随果邦阁的小编来仔细的阅读一下下面的文章,希望对你有所帮助.
Linux如何移植到Apple Silicon M1 Mac mini 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发行版提供了可能性.