![为什么我们必须移植 ROM](https://linux22.com/image/1569166/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BB%AC%E5%BF%85%E9%A1%BB%E7%A7%BB%E6%A4%8D%20ROM%20.png)
我们可以在各种机器上安装 Windows,但当有人尝试在另一台 Android 设备上刷写 ROM 时,它却无法工作。我认为这是因为内核和系统优化仅与特定的 SOC、电池兼容。BIOS 通过 ACPI 表向 Windows 告知不同设备的功能,并且它适用于各种硬件。Android 设备上没有通常意义上的硬件抽象层,这有什么原因吗?这只是制造商的利益吗?
答案1
为什么 Android 设备上没有通常意义上的硬件抽象层
经济上的原因:
Android 设备通常是基于 ARM 的单板设备,所有硬件均嵌入其中,并且该硬件在设备的整个生命周期内都不会改变。用户通常只需购买新设备即可。
Android 是一种“嵌入式”操作系统。运行 Android 的硬件通常不支持或运行任何其他操作系统。
ACPI 是一个复杂且难以实施的标准。
对于手机等产品而言,上市时间对公司而言比开发其他公司使用的标准更重要。Windows 希望销售适用于各种基于 Intel 的硬件供应商的操作系统,因此显然更愿意采用标准(英特尔和微软都参与了 ACPI 的设计)。
技术原因:
Windows 在启动和运行过程中非常依赖固件(BIOS 或 UEFI)。Linux 可以配置为在加载固件后完全不依赖固件,对于 ARM 平台来说,这可能是典型的情况。
- 因此,可以在 Linux 中使用更简单(且不太友好)的方案,无论是设备树之类的东西,还是仅在内核中内置驱动程序,这些驱动程序知道其硬件在平台上的位置,而无需进行任何发现。
但当尝试在另一台 Android 设备上刷写 ROM 时,却无法正常工作
Android 设备中的引导加载程序通常配置为仅加载经过签名的图像 - 如果包含操作系统的图像未经过签名,它将无法工作。
引导加载程序本身通常非常特定于硬件,并且为特定主板构建。(您不能将某个型号的笔记本电脑的 BIOS 用于其他型号的笔记本电脑,也不能期望它能在其他型号的笔记本电脑上运行 - 作为 OEM,您必须为新平台构建新的 BIOS)。如果 ROM 映像包含引导加载程序,而您尝试在错误的平台上运行它,它可能无法运行。
许多 Android 设备中的硬件设备的 Linux 驱动程序不是开源的。包括显示器、Wifi、蜂窝等。因此它们无法与更高版本的内核配合使用。这可能是不同 ROM 无法工作的主要原因,因为内核版本更高、更好,但没有可用的较新驱动程序(没有源代码就无法构建驱动程序)。
传递给启动内核的命令行选项可能至关重要 - 例如,这些选项可能会告诉内核避免访问某些会导致系统锁定的内存范围。