0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何把Linux移植到M1

Linux爱好者 来源:CSDN 作者:CSDN 2021-03-03 15:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

苹果 M1 芯片引发行业大热,芯片的发展也将影响着未来行业的走向。今天,随着本文一起来看看如何把 Linux 移植到 M1。

自 2014 年 iPhone 6 发布以来,苹果就在集中精力构建更快的芯片,相对于在一块芯片上加载更多核心,他们更加注重单线程性能的提高。他们内部的硬件设计团队采用了这种方法,并生产出了功能多样且独一无二的芯片,从而奠定了他们在架构特征方面的行业领先地位。

2020 年 11 月,苹果发布的新品台式机搭载了 M1 处理器,不少人都为该系统的出色性能而赞不绝口。

事实上,Linux 之父 Linus Torvalds 也曾在国外 Real World Technologies 网站的留言板答网友提出的“如何看待新的(M1 芯片)苹果电脑”问题时,回应称:

如果它运行 Linux ,我绝对希望拥有一台。

此前,CSDN 也曾报道过安全顾问 Hector Martin 正在众筹平台 Patreon 上启动了一项向 M1 Mac 移植 Linux 的项目(https://www.patreon.com/marcan),并且得到不少开发者的响应。而本文作者也一直在努力为安全研究人员提供有关操作系统和程序如何在苹果 ARM 处理器上运行的深刻见解。因此,当苹果决定允许在带有M1处理器的 Mac 上安装自定义内核时,他们决定尝试一番。

开始将 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 启动时的企鹅了。

需要更多输入

不幸地是,笔者团队并没能用上 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 桌面版了。

操作指南

下载 Ubuntu rootfs

在 Mac Mini M1 上引导 Linux 的第一步就是下载 Ubuntu POC 的 rootfs。我们采用了树莓派的镜像,因为它是 live 版本的 USB 启动镜像,所以只需要做出细微的修改即可。

解压缩镜像

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

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

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

sudoddif=ubuntu-20.10-preinstalled-desktop-arm64+raspi.imgof=/dev/rYOURUSBDISKbs=1m

连接到 Mac

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

引导至

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

安装自定义内核

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

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

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

登录

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

恢复 MacOS

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

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    462

    文章

    53606

    浏览量

    459922
  • 寄存器
    +关注

    关注

    31

    文章

    5590

    浏览量

    129186
  • Linux
    +关注

    关注

    88

    文章

    11635

    浏览量

    218127

原文标题:Linux 在 M1 上跑起来了

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于 DR1M90 的 Linux-RT 内核开发:从编译配置 GPIO / 按键应用实现(1

    本手册由创龙科技研发,针对 DR1M90,详述 Linux-RT 实时内核开发:含实时性测试(LinuxLinux-RT 对比、CPU 空载 / 满负荷 / 隔离状态测试)、内核
    的头像 发表于 12-02 10:38 572次阅读
    基于 DR<b class='flag-5'>1M</b>90 的 <b class='flag-5'>Linux</b>-RT 内核开发:从编译配置<b class='flag-5'>到</b> GPIO / 按键应用实现(<b class='flag-5'>1</b>)

    基于安路DR1M90 FPSoC的Linux系统全流程开发指南(4)

    本手册由创龙科技研发,针对安路飞龙 DR1M90,详述 Linux 系统开发流程:LinuxSDK 配置编译、BOOT.bin(FSBL+U-Boot)开发、Kernel 与 Rootfs 开发
    的头像 发表于 11-30 15:46 2039次阅读
    基于安路DR<b class='flag-5'>1M</b>90 FPSoC的<b class='flag-5'>Linux</b>系统全流程开发指南(4)

    基于安路DR1M90 FPSoC 的Linux 系统全流程开发指南(3)

    本手册由创龙科技研发,针对安路飞龙 DR1M90,详述 Linux 系统开发流程:LinuxSDK 配置编译、BOOT.bin(FSBL+U-Boot)开发、Kernel 与 Rootfs 开发
    的头像 发表于 11-26 17:01 165次阅读
    基于安路DR<b class='flag-5'>1M</b>90 FPSoC 的<b class='flag-5'>Linux</b> 系统全流程开发指南(3)

    基于安路DR1M90 FPSoC 的Linux 系统全流程开发指南(1

    本手册由创龙科技研发,针对安路飞龙 DR1M90,详述 Linux 系统开发流程:LinuxSDK 配置编译、BOOT.bin(FSBL+U-Boot)开发、Kernel 与 Rootfs 开发
    的头像 发表于 11-25 14:09 238次阅读
    基于安路DR<b class='flag-5'>1M</b>90 FPSoC 的<b class='flag-5'>Linux</b> 系统全流程开发指南(<b class='flag-5'>1</b>)

    移植蜂鸟需要在Linux环境下吗?

    《手把手教你设计CPU》书上运行Verilog仿真测试那章说为了重现仿真环境,最好在Linux环境下。不知道移植蜂鸟是否需要在Linux环境下,直接在Windows操作系统可否移植开发
    发表于 11-10 07:42

    M1 SMA整流二极管规格书

    M1 SMA/DO-214AC整流二极管,电流:1A 50V
    发表于 10-29 17:02 0次下载

    如何将 FreeMODBUS 从属 RTU 模式移植 M032 系列微控制器?

    如何将 FreeMODBUS 从属 RTU 模式移植 M032 系列微控制器
    发表于 08-19 07:20

    求助,关于K230 linux SENSOR 移植读取CIF的RAW数据的疑问?

    在K230 linux SENSOR 移植指南中给出了K230移植普通摄像头的教程,mipi读取的时ISP后的数据,但如果我想在k230里面移植自己的摄像头,通过mipi接口读取cif
    发表于 06-16 06:56

    用于 Cat M1/1/NTN 和 WCDMA HSDPA/HSUPA/HSPA(频段 1、2、4、5、8)和 CDMA(频段类别 0、1、6、15)的多模式、多频段功率放大器模块 skyworksinc

    、6、15)的多模式、多频段功率放大器模块真值表,用于 Cat M1/1/NTN 和 WCDMA HSDPA/HSUPA/HSPA(频段 1、2、4、5、8)和 CDMA(频段类别 0、1
    发表于 05-13 18:35
    用于 Cat <b class='flag-5'>M1</b>/<b class='flag-5'>1</b>/NTN 和 WCDMA HSDPA/HSUPA/HSPA(频段 <b class='flag-5'>1</b>、2、4、5、8)和 CDMA(频段类别 0、<b class='flag-5'>1</b>、6、15)的多模式、多频段功率放大器模块 skyworksinc

    将Deepseek移植i.MX 8MP|93 EVK的步骤

    此共享介绍了如何将 deepseek 移植i.MX93EVK使用 llama.cpp 的 Yocto BSP 本文档使用的主要测试模型是在 deepseek 模型的基础上进行提炼和量化的 Qwen
    发表于 03-26 06:08

    THS8135进行YUV输出,如何配置M1M2,还有SYNC_T这些信号?

    您好!我现在在使用THS8135的过程中遇到了点小麻烦,我想进行YUV输出,但是不知道如何配置M1M2,还有SYNC_T这些信号,出来的结果和想要的结果不一样
    发表于 02-14 06:26

    如何将RT-Thread移植NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2460次阅读
    如何将RT-Thread<b class='flag-5'>移植</b><b class='flag-5'>到</b>NXP MCUXPressoIDE上

    M1携手6D Technologies云原生BSS平台实现转型

    M1携手6D Technologies云原生BSS平台,成功实现数字化转型 印度班加罗尔2025年1月15日 /美通社/ -- 数字化转型解决方案的全球领导者6D Technologies欣然宣布
    的头像 发表于 01-15 15:42 746次阅读

    中软高科身份证读取及M1卡读写二合一机具开发文档

    中软高科这款机具除了二代身份证阅读功能,还可以对M1卡进行读写操作,从而实现身份证识读与M1制卡二合一。 机具照片 开发文档
    发表于 01-04 11:25

    THS8135不需要外部再引入SYNC/BLANK信号,M1/M2/CLK &amp; SYNC/SYNC_T/BLANK信号应该怎样处理?

    我们有如下应用,请教一下再这种场景下THS8135 的 M1/M2/SYNC/SYNC_T/BLANK pin如何设置(上下拉)。 将CVBS信号经AD转换后的数字信号,由THS8135 RCr
    发表于 12-31 07:31