Fork me on GitHub

大牛在M1 Pro版苹果MacBook Pro上成功启动 Linux,附支持M1 Mac教程

开发人员在 M1 Pro 版苹果 MacBook Pro 上成功启动 Linux,先前Linux已正式支持M1 Mac(附教程

​​Apple Silicon 版 Linux 研发团队 Asahi Linux 在 Twitter 上发布推文表示,其开发人员 @marcan42 目前已经成功将 Linux 系统导入 M1 Pro 芯片版本的 MacBook Pro 并成功启动,但该开发人员也表示目前只是进入了启动界面而已,离完全攻克还有很长的路要走。

 

图片

当地时间 11 月 1 日 @marcan42 发布的图片上显示 M1 Pro 芯片版本 MacBook Pro 的屏幕上出现了 Linux 操作系统在启动时出现的命令行,随后在第二天他表示有信心将在第三天攻克 USB 启动以及 Linux 对 PCIe 和 NVMe 的支持。而在当地时间 11 月 3 日 @marcan42 表示虽然还没有获取到 PCIe 的使用权限但系统已经可以从 USB 启动并使用 shell。

 

图片

图片

@marcan42 表示,虽然目前距离最终目标还有很长一段路要走,但可以确定的是,目前 SMP 对称多处理功能、IRQ / IPI 中断、帧缓冲控制台、DART、USB 和 USB 供电、I2C、以及 GPIO 均可在 M1 Pro 芯片版本的 MacBook Pro 上使用,后续 Asahi Linux 团队将会把精力放到 PCIe 上,并设法驱动电脑自带的 SD 读卡器以及 Wi-Fi 无线网卡。

经过长远的发展,Linux如今的生态比以往丰富了很多。不少游戏有Linux版本,却没有macOS版本,前者的游戏生态要好上不少。

不过,技术大神想要在M1 Pro版MacBook Pro上使用Linux,更多是极客精神的探索,对普通人的意义没那么大。买得起M1 Pro MacBook Pro的用户,也不差钱再买一台容易装Linux的电脑,即便是MacBook Pro无法满足的游戏需求,索尼PS5,微软Xbox等无疑是更好的选择。

另外,新MacBook Pro的异形屏结构,Linux必然是没有适配的。届时,顶端两边不显示,或者顶部中间的内容被“刘海”挡住,都是十分难受的体验。许多程序的菜单栏都在顶部,选项很容易被刘海挡住,用户只能非全屏运行,使用起来还得适应一下下。

 

 

图片

图片

Linux 5.13对苹果M1芯片的初始支持已被合并到Linux SoC代码树中,预计 Linux Kernel 5.13 将带来 M1 芯片支持。

图片

从commit信息可以看到,在Linux内核实现对M1初始支持的开发者是Arnd Bergmann和Hector Martin. 他们的commit已在以下设备通过测试:

Mac mini (M1, 2020)

MacBook Pro (13-inch, M1, 2020)

MacBook Air (M1, 2020)

1.开始将 Linux 移植 M1

M1 的许多组件都是与苹果的移动 SoC 共享的,因此可以从这个地方入手。但是,在编写 Linux 驱动程序时发现, 实际上苹果的 SoC 非常不标准。由于笔者的虚拟环境非常灵活,能够适应多种模型,但在 Linux 上,64 位 ARM 主要依赖于一系列定义良好的组件和固件接口,但 M1 几乎没有使用任何这类的组件或固件接口。

首先,苹果的 CPU 采用了不同的方式来引导操作系统内核。引导加载程序(称为 iBoot)加载一个 Mach-O 格式的可执行目标文件,该文件支持压缩,并封装在一种经过 ASN.1 签名的 IMG4 格式中。与之相比,正常的 64 位 ARM 上的 Linux 则由一个普通的二进制镜像引导(支持压缩,也支持几种容器格式),或者在 UEFI 平台上由 Windows 风格的“PE”可执行文件引导。

CPU 核心启动之后,真正的问题来了。在其他 64 位 ARM 系统上,这一步通常是通过 PSCI 接口调用固件(一些系统采用了轮询表,但依然需要固件)。但在 M1 上,CPU 核心从一个 MMIO 寄存器指定的地址处开始(MMIO 寄存器由内核镜像设置成某个特定的偏移量,然后由引导程序锁定),然后直接开始运行内核。

除此之外,苹果还设计了自己的中断控制器 Apple Interrupt controller(简称 AIC),这个控制器与任何主流 ARM GIC 标准都不兼容。不仅如此,其定时器中断并没有像通常的 ARM 那样连接到每个 CPU 中断上,而是路由到 FIQ 上。FIQ 是一个很难理解的架构特性,在老式的 32 位 ARM 处理器上经常使用。很显然,Linux 内核并不支持通过 FIQ 发送中断,所以我们必须自己实现。

系统内的多个处理器互相通信需要一组处理器间中断(IPI)。在旧的苹果 SoC 上,这些中断的处理方式与 IRQ 相似,即执行 MMIO 并访问 AIC。但在新的处理器上,苹果使用了一组处理器核心寄存器来分发并通知 IPI,而且也路由到了 FIQ 上。所以 FIQ 的支持非常重要。

在处理了一些其他的硬件特性之后,笔者团队添加了一个预加载器,作为启动处理器核心的跳板,这样就可以设置帧缓冲区,并看到 Linux 启动时的企鹅了。

2.需要更多输入

不幸地是,笔者团队并没能用上 M1 Mac 上的 UART 线,所以只能通过其他方式来添加键盘(甚至鼠标)。M1 Mac Mini 有三种方式来实现这一点:M1 芯片上内置的 USB 宿主(提供 Thunderbolt/USB 接口),PCIe 上的 xHCI USB 宿主(提供 A 类接口),以及蓝牙。

团队并没有打算深入研究苹果的蓝牙,但大家注意到它使用了一种非标准的 PCIe 协议,而且不仅需要使用 M1 芯片上的 PCIe 接口,还需要为该协议编写自定义的内核驱动程序。这不是个理想的选择。

也就是说,只能选择 PCEe 并使用标准的内核 xHCI 驱动,或者使用内置的 USB 控制器。苹果很早以前就在其芯片里使用了 Synopsys DWC3 双角色 USB 控制器,而且该控制器有 Linux 内核驱动。不幸的是,苹果又给该控制器添加了自定义的逻辑,所以这里也需要大量工作。

M1 的 PCIe 和内置的 DWC3 USB 控制器都使用 IOMMU,称为 DART。苹果一直在改进其 DART 设计,因此 IOMMU 的功能很齐全。最新版甚至支持子页面内存保护,这是在其他控制器中从未有过的。

为了将 M1 中的 USB 端口连接到 Mac Mini 背后的 USB C 口连接器上,团队需要使用 I2C 上的芯片(意味着需要提供 GPIO 和 I2C 驱动程序),这两者都使用了自定义固件。

在研究了几天 USB 后,大家终于能够连接到外部的 USB 集线器上并成功地连上了键盘、鼠标和闪存盘,从此就可以运行正常的 Linux 桌面版了。

图片

3.操作指南

3.1 下载 Ubuntu rootfs

在 Mac Mini M1 上引导 Linux 的第一步就是下载 Ubuntu POC 的 rootfs。

WX关注【优爱酷】查看完整文章获取资源下载链接

我们采用了树莓派的镜像,因为它是 live 版本的 USB 启动镜像,所以只需要做出细微的修改即可。

3.2 解压缩镜像

你需要至少 16 G 的外置 USB。执行下列命令解压缩镜像:

tar-xjvfubuntu-20.10-preinstalled-desktop-arm64+ raspi.img.bz2

然后,使用磁盘工具找到外部 USB 的名称。最后,执行下列命令将镜像复制到 USB 上:

sudo dd if=ubuntu-20.10-preinstalled-desktop-arm64+raspi.img of=/dev/rYOURUSBDISK bs=1m

3.3 连接到 Mac

通过 USB C 口适配器,将 USB 插入 Mac Mini M1 上。目前不支持 A 口。

3.4 引导至 1TR

为了引导至 1TR(真正的恢复操作系统),请关闭 Mac Mini M1,然后按住电源键,直到看到“loading options”。加载完成之后,从顶端的菜单中选择终端选项。

3.5 安装自定义内核

下一步就是安装自定义内核。笔者团队编写了一个脚本来减轻你的负担。只需要运行:

/bin/bash -c "$(curl -fsSL https://downloads.corellium.info/linuxsetup.sh)"

该脚本会询问用户名和密码。看到“Kernel installed”提示后就可以重启了。

3.6 登录

系统引导之后就会提示你登录。用户名为“pi”,密码为“raspberry”。root密码也是“raspberry”。

3.7 恢复 MacOS

如果想恢复至 MacOS,只需在 1TR 中打开终端,执行 bputil -n 即可。

posted @ 2021-11-04 14:11  优爱酷  阅读(1362)  评论(0编辑  收藏  举报