Jolla Unofficial Chinese Blog

硬件自适应团队 - 第零天:启动中


一般来说,引导程序(bootstrapping)通常是指一个不依赖于外部输入的自持程序。在计算机科学中,这个术语(通常缩略为启动(booting))通常是指在计算机启动或普通重置后将基本软件载入内存的过程,尤其是载入操作系统以便让其对其它必须程序进行载入。

维基百科

这是关于Jolla平板硬件自适应项目的第一份博文。硬件自适应是指Sailfish系统对一台设备以及设备上驱动的兼容性。我们希望这篇博文能让你对我们如何设计平板的某些部分有一个前所未有的感知。这篇文章可能会有点长并包含许多技术细节,不过如果你对其中某些细节感兴趣,欢迎提问,我们会进一步阐述。

在我们的设计师、售后、市场调研者、程式管理员、基础架构师、测试人员、UI人员、核心和中间层开发者能真正着手开始工作之前,他们需要一份组装好Sailfish系统和接口的硬件来进行开发、准备测试、开始设计和体验。因为如果只能在一台既不能显示Sailfish系统界面,又不能拍照或者播放声音的设备上开发,那可真是无聊透顶。

比如他们需要让引导程序在设备上跑起来 ,让这个成真就是硬件自适应团队的职责了。注意这不是说我们的开发者目前就无法开发了(我们已经有Jolla手机、SDK模拟器等等),只是如果能在一开始的时候就在目标设备上进行开发并获得更直接的体验,会比空写好得多。

和ODM以及芯片供应商的协作

一如许多其它公司一样,我们正在和ODM商(一种按照客户公司要求制造特定设备掉公司)合作生产Jolla平板。当你拿到ODM的硬件的时候,你得到的不只是一块连硬盘都空空如也的空白设备,还有大量硬件适配的软件组件。

然而,现今的手机产业情况是,即时你能够获得一款超棒的硬件,并且搭配了稳定兼容的软件,这些软件往往是颇具安卓色彩的驱动。对于非安卓系统来说这可是件头疼的事儿:你当然可以获得一款适配你特定系统的定制驱动,不过那得耗一大笔钱,需要芯片提供商的支持,还得浪费大量的时间精力。而这些时间精力本应花在提升平板的体验上。

这也是Jolla平板遇到的问题:我们得到了一套适配硬件的安卓驱动。这些软件往往是闭源的,不会将源代码和Jolla和ODM共享,行业现状便是如此。想要以合适的价格获得一款搭配着完全开源驱动的硬件设备几乎是不肯能的事儿。

Sailfish系统的一大优势便是,它可以通过“libhybris”技术来驱动安卓兼容驱动。安卓驱动的基础结构总是紧密地聚合在一起。比如说,如果你想使用安卓的相机驱动,你就必需驱动软件的图新缓冲分配基础结构。换句话说,想要把拍摄的图像呈现在界面上,你需要使用安卓GPU驱动来渲染图形。

启动中

我们没法为这么多设备组件编写本地Sailfish系统本地驱动,尤其是调制解调器、GPU和相机。而且着手开始定制Sailfish系统适配某款特定的芯片?那可绝对不是我们想走的路。我们之前做过这样的尝试,效果并不好。我们只能希望Sailfish系统设备能够大卖,从而使得硬件提供商和ODM商转而适配Sailfish系统。

这也使得我们把精力集中在我们擅长的领域上:为我们的用户打造独特的用户体验,和芯片提供商和ODM商通力合作创建一个开源操作系统平台。我们尽量重用已经提供的硬件软件。我们知道这些驱动目前工作良好,一如它们本应如此。不然的话麻烦就大了。

这也意味着一旦这些组件出现问题,我们也能从ODM商和芯片供应商得到支持。我们已经在第一款产品中实现了相同的模型,那就是Jolla智能手机。而Jolla手机相当成功。

在上市Jolla手机后,我们和社区一起使得Sailfish系统在许多不同安卓设备上运行成功。这些通过一个称为“HADK”(硬件自适应开发工具)的文档实现。HADK是一个指导和函数集,通过一些接口设置和代码,帮助Sailfish系统调用安卓设备上内置的软件驱动。

要事第一

让我们看看这款平板:一款两千( 2048×1536)电容显示屏,一颗英特尔Z3735F处理器;四核1.83ghz ,一颗英特尔HD图形GPU,2GB的CPU内存,可以运行64位软件。一个microSD卡槽,32GB内部存储(居然比我的开发者设备还多)和一些按钮(电源键、音量增减键等)。以及一颗5百万后置摄像头和一颗2百万前置摄像头。

在做其它事儿之前,我们根据ODM的说明编译了配套软件(基于安卓4.4)。1起初我们在Windows下启动,不过我们最终发现这台设备支持“快速启动(fastboot)”,一个可以将镜像应用到设备的实用工具。2只要长按音量减和电源键就可以进入。

令人欣慰的是,设备启动了起来。检测硬件接口真不是件好玩儿的差事儿。如果发现硬件接口并未如期工作,进而发现软件或者硬件已经损坏或丢失,这可真是糟糕。我们通过HADK*列出的那些测试应用检查硬件的每个部分,这些应用可以节省一大把时间。幸好,所有测试都顺利通过。另外我们还发现长按电源键强制关机也没有问题。这个功能有时候超级有用。

我们发现的第一个问题是这个设备拥有64位的Linux内核,却运行着32位的软件栈(用户空间)。貌似是因特尔安卓4.4 64位设备的标准。这意味着我们不得不使用移植过的32位x86 Sailfish系统。你没法在同一进程中混合32位和64位的核。

另外,我们还发现设备的启动系统UEFI和安全启动(SecureBoot)使用了暗文加密,启动进程的所有元素都有暗文加密签证,下至启动器、内核和内核模块都未幸免。这个话题比较敏感,不过这么说吧:对于来自ARM的我们来说,UEFI和安全启动(SecureBoot)是个新东西。

平衡可编程性和隐私/安全性

Jolla的前身在于我们使用“可编程(hackable)”的设备(也就是可以运行其它系统的设备)来构建我们自己的系统。否则今天我们根本不可能存在。我们相信,从技术上讲,Jolla以外的人也可以在我们的设备上运行其它备选Linux操作系统。

启动中

我们知道我们可以构建一个签证过的Linux启动器,然后载入一个未签证的镜像,而且测试发现确实可行。但是载入一个未签证的启动镜像可能会导致一些安全隐患。

这是一些技术上的基本要素:

  • 允许在启动时通过组合键来开启/禁用进入UEFI设置/UEFI命令行 – 从而在这里设置你自己的UEFI PK/db/dbx等等关键字
  • 允许从Sailfish系统中重启进入UEFI设置
  • 使用UEFI PK/db/dbx中某个部件签署过的efilinxefilinx可以检查Linux内核和初始化内存磁盘(启动镜像)的签证
  • 目前我们并未使用UEFI shim载入器,所以没有MOK功能
  • 内核可以使用CONFIG_MODULE_SIG内核选项
  • 目前没有fastboot oem unlock功能,想要启动闪存镜像则必需使用安全启动设置的键给镜像签证。不过你可以修改efilinux

也欢迎你们一起来讨论如何配置设备的安全选项,从而更好地平衡可编程性和隐私/安全性。没有什么是定死了的,不过可能会有一些硬件或技术上的强制限制。移动设备经常称为被攻击的目标,人们常常在这大千世界因为移动设备而蒙受损失。所以安全性非常重要。如果你使用IRC,欢迎和我们以及其它Sailfish移植者一起来讨论,地址在irc.freenode.net #sailfishos-porters。来一起讨论吧!我相信我们可以一起找出安全性强同时技术可行的解决方案。

通过HADK的介绍,加上这次对设备的理解,我们已经准备好像你们介绍我们的基础结构,从而使得Sailfish系统适配这台设备以及设备上的软硬件。不过这得另开一篇博文了。

希望你喜欢这篇博文,虽然真是长死了!


  1. 原文为:we built the (Android 4.4 based) software delivery using instructions from the ODM and flash the result to the device 

  2. 原文为:Initially we flashed under Windows, but eventually we found out that the device supports a “fastboot” mode, which is a mode and an associated utility to flash images to a device 


Carsten Munk

Jolla首席研究工程师。经常从一些奇奇怪怪的东西中获得Sailfish系统新特性和革新的灵感。热衷于开源透明的开发。


Translated by

TylerTemp

TylerTemp是一只Python程序员。你可以在这些地方找到我哦:      

如果你喜欢我的作品,你可以买我一杯啤酒,让我做的更好:  |  Flattr this