停更!!!
为什么呢?因为手机设备它的控制寄存器以及硬件原理图包括芯片数据手册,都是闭源的,这意味着不知道如何控制手机。
而且我的目标是 “软件控制硬件”,不一定非要实现操作系统,我新的打算是学习开发版,然后体验真正的裸机平台。这样更符合我们的目标,操作系统只是更方便地管理硬件资源。
1. 背景
1.1 目标
从零实现一款针对 onePlus 6/6T Android 手机操作系统。这是开篇,以后会定期更新进度,感兴趣的小伙伴,欢迎一起讨论!
我只是把这个项目当做练手,来达到理解的目的。我并不是要替代 Android AOSP,当然我也没这样的实力。
我们采用 Rust、内联 aarch64 ISA 汇编、参考 postmarketOS 源代码的方法,来一步一步实现。总之这个过程不会很轻松,要查阅很多资料。
既然是从零实现,那就不能和工业级别的 Linux、Android AOSP 相比,我们只实现功能,性能不去考虑。因为这需要太多的精力了!
1.2 预期的收获
最后,我希望通过这个项目,能有这些收获:
精通 Rust 语言,深刻理解一门系统级编程;
性能优化时,能考虑到机器的特点;
深刻理解软件如何控制硬件(SoC架构);
深刻理解 Android 手机的底层原理;
深刻理解 Android ASOP 的原理;
1.3 为什么从零实现
那为什么是从零实现?而不是看 Linux、Android AOSP 源代码,反而重复造轮子?
因为, 源代码阅读效率低,以下是具体原因:
庞大性: Linux 内核超过 3000 万行代码,AOSP 更甚。人脑无法同时处理如此巨大的信息量。
复杂性 (Complexity):
模块化与耦合: 内部高度模块化,但模块之间又存在复杂的依赖和交互。
抽象层次: 从汇编到 C 语言宏,从硬件寄存器操作到高级数据结构和算法,抽象层次众多。
并发与同步: 大量锁、信号量、原子操作等同步机制,理解多线程/多核环境下的代码流非常困难。
兼容性 (Compatibility):
架构兼容: 支持各种 CPU 架构(x86, ARM, MIPS, RISC-V 等),代码中充斥着 #ifdef 和不同的实现。
设备兼容: 支持海量硬件设备,每个驱动都有不同的初始化和操作方式。
历史遗留: 许多代码是为了兼容旧硬件、旧标准或修复历史 Bug 而存在的,理解起来非常费劲。
入口点与启动流程 (Entry Point & Boot Flow):
多级引导: Linux 内核的启动流程复杂,涉及汇编、C 语言的多个阶段,还会依赖 Bootloader 传递的参数。
平台差异: 不同 CPU 架构的启动入口和早期初始化代码完全不同。
设计哲学与约定 (Design Philosophy & Conventions):
大型项目有其独特的设计哲学、命名约定、编码风格和错误处理机制。这些如果没有人指导,很难快速领悟。
调试环境复杂: 许多底层代码只能在特定调试环境下(如 JTAG/SWD)才能有效调试,这本身就增加了学习难度。
无法理解意图:最重要的是