双系统启动的设计和实现—FireflyWiki

Firefly-RK3128采用Cortex-A7架构四核1.3GHz处理器,集成Mali-400MP2GPU,拥有优秀的运算与图形处理能力;板载千兆以太网口、2.4GHzWi-Fi和蓝牙4.0,展现出不俗的网络扩展和传输性能;同时可支持Android与Ubuntu双系统,并拥有丰富的硬件资源与扩展接口,所以它是一台扩展性特强的卡片电脑,但我们相信你的创意与灵感能给予它更完美的定义

本文讨论如何利用安卓系统自身的启动特性,加进Linux系统的启动支持,并实现双系统的切换。要达到这一点,有必要先了解一下安卓系统的启动流程。

安卓系统的启动模式有两种:正常模式和急救(recovery)模式。急救模式,其内核和根文件系统均独立于正常模式,功能简单,一般很少更新,用作系统修复和维护。也就是说,安卓系统本身就是支持双启动的。安卓系统的启动流程是:

1U-Boot初始化1.1U-Boot读取CPU寄存器,如果有recovery标志,则跳转到31.2U-Boot读取misc分区,如果含有recovery命令,则跳转到31.3正常启动模式,跳转到22正常启动模式2.1加载boot分区2.1.1如果boot分区含有内核和initramfs,则分别加载到内存特定位置,跳转到 2.3(略过kernel分区处理)2.1.2如果boot分区仅含有initramfs,则加载到内存特定位置。2.2加载kernel分区到内存特定位置。2.3跳转到43急救模式3.1读出recovery分区内含的内核和initramfs,分别加载到内存特定位置,跳转到44初始化内核启动参数,将执行权移交内核。注意,initramfs是固化了的小型根文件系统,内核启动后会将其解压至内存中,并执行其中的init程序进行初始化。也就是说,initramfs是第一个获得执行权的根文件系统,负责挂载真正的根文件系统(可以在各种各样的存储设备中,如U盘、TF卡、USB硬盘、NAND或eMMC闪存等)。

分析安卓系统的启动流程,一个比较简单的双启动方案就是:

加入Linux系统的根文件系统分区。

替换recovery分区成Linux系统的内核和initramfs。

改变misc分区的内容,就可设定开机启动的操作系统。

在Linux系统内实现安卓急救系统的部分功能。

如何进入Linux呢?因为我们将Linux放在recovery分区,因此,问题等价于如何进入安卓的急救模式。以下有几种方式:

拔掉USB线,按住开发板的recovery键开机(无论是初次上电、重启或按reset键开机都可以)。这是临时性的切换,下次开机不按,还是会进入Linux。

在安卓系统的设置里选择恢复出厂设置。实际上,恢复出厂设备这个功能已被阉割了,重启后会进入Linux。

在安卓系统的关机菜单(点底部工具栏的关机按钮进入)增加了一项切换系统的选择。当然,它是检测到linuxroot分区才会出现,也就是说单系统是不会出现的。

将SDK里的rkst/Image/misc.img刷进到misc分区。

2~4项都是通过写misc分区,达到切换到recovery,这里也即是Linux的目的。

我们先来看看纯安卓的存储分区情况。分区信息在parameter文件里的CMDLINE行:

FIRMWARE_VER:4.4.2MACHINE_MODEL:rk30sdkMACHINE_ID:007MANUFACTURER:RK30SDKMAGIC:0x5041524BATAG:0x60000800MACHINE:3066CHECK_MASK:0x80PWR_HLD:0,0,A,0,1#KERNEL_IMG:0x62008000#FDT_NAME:rk-kernel.dtb#RECOVER_KEY:1,1,0,20,0CMDLINE:console=ttyFIQ0androidboot.hardware=rk30boardandroidboot.console=ttyFIQ0board.ap_has_alsa=0init=/initinitrd=0x62000000,0x00800000mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),0x00008000@0x0000e000(kernel),0x00010000@0x00016000(boot),0x00010000@0x00026000(recovery),0x0001a000@0x00036000(backup),0x00040000@0x00050000(cache),0x00002000@0x00090000(kpanic),0x00180000@0x00092000(system),0x00002000@0x00212000(metadata),0x00200000@0x00214000(userdata),0x00020000@0x00414000(radical_update),-@0x00434000(user)CMDLINE是传递到内核的命令行,参数mtdparts就含有分区信息,其格式是:

0x00002000@0x00002000(uboot)大小偏移分区名称单位是512字节(即传统磁盘的扇区大小)。转换成表格比较直观些:

uboot:是用来存放第二阶段(stagetwo)U-Boot,如果开发板用的是eMMC分区,其U-Boot就不需要分阶段。

misc:非常有用的一个分区,下面会介绍到,用来控制启动模式的。

resource:存放内核的开机图片和设备树(DeviceTree)信息。

kernel:存放安卓的内核

boot:存放安卓的正常系统启动的初始内存文件系统(initramfs)。注意,如果在OTA方式下,boot分区跟recovery分区一样,含有内核和初始内存文件系统,此时kernel分区不作使用。

recovery:存放安卓急救模式所使用到的内核和初始内存文件系统。

backup:RK设计的用来存放备份固件的分区,FireNow系统开发板没有用到。

cache:安卓的缓存分区

kpanic:安卓的kernelpanic分区(?)

system:安卓的系统分区(挂载于/system)

metadata:RK的元数据分区,使用情况不详

userdata:安卓的数据分区(挂载于/data)

radical_update:RK的升级分区,使用情况不详

user:安卓的内部存储分区(挂载于/mnt/sdcard)

我们需要增加一个名为‘linuxroot’的新分区,用来存放Linux的根文件系统。为了使分区保持兼容,我们选择了替换radical_update分区,容量给够3G:

这样,修改后的parameter文件,其CMDLINE更改为:

$hexdump-Crkst/Image/misc.img0000000000000000000000000000000000000000|................|*00004000626f6f742d7265636f76657279000000|boot-recovery...|0000401000000000000000000000000000000000|................|*000040407265636f766572790a2d2d776970655f|recovery.--wipe_|00004050616c6c00000000000000000000000000|all.............|0000406000000000000000000000000000000000|................|*0000c000可见,前16K(0x4000)字节都是0,然后是一个“boot-recovery”命令,后面又跟着“recovery”,“–wipe_all”这些动作和参数,因此初次升级固件,系统会进入recovery模式,格式化所需的分区,之后才重启进入安卓系统。将misc分区清空,系统启动时就会加载boot和kernel分区,从而进入Android;而往misc分区写入“boot-recovery”命令,系统启动时就会加载recovery分区,从而进入Linux系统。开发时,可以用烧写工具烧写misc分区,从而控制进入哪个系统。

1.判断misc分区是否有特殊的标志内容“firefly-linux”,如果没有,则转6。2.判断backup分区是否含有安卓急救系统的initramfs,如果没有,则转6。3.提取backup分区的initramfs,解压至/root目录中。4.将/proc,/sys,/dev等重要的系统目录移到/root中(mount–n–omove)。5.执行execchroot/root/init命令,将/root目录切换成新的根目录,并执行里面的init程序,从而引导安卓系统本身的急救系统。操作完成。6.走原有流程,正常加载Linux系统。操作完成。采用这样的修改,用Linux系统的initramfs有选择地去加载安卓的急救系统,便可以达到要求。Linux系统的initramfs的init程序是shell脚本,修改和调试起来非常方便安卓系统的急救程序无需任何修改。剩下要做的,就要修改安卓系统的切换系统菜单项,将入切换到Linux系统的特殊标志内容“firefly-linux”写到misc分区即可。如此修改,可以最大程序上兼容原有系统:

很简单,写个脚本/usr/local/bin/b2android.sh将misc分区清空,然后重启即可:

THE END
1.基于BS模式的人事管理系统的设计与实现经管...相似文件换一批 国民经济行业分类与国际标准行业分类(ISIC R...15.33 KB0个论坛币 如何用Stata实现...https://bbs.pinggu.org/thread-12477699-1-1.html
2.基于BS的项目管理系统的设计与实现为此,企业需要加强项目管理,建立有效的项目管理体系B/S在项目管理系统设计的基础上,功能强,能够满足现代企业对项目管理的要求。关键词:B/S;项目管理;系统设计项目管理是使项目能够按照预定的成本、质量和进度进行生产,通过计划、组织等活动完成资源的配置和使用,并详细分析成本、质量和风险,以满足项目实施的最终目标。https://www.77hub.com/zs/3916.html
3.医院BS架构信息管理系统设计与应用:研究医院业务管理流程, 为了改变传统的信息管理制约医院服务水平整体不高的现状, 也为了降低医院从业人员的劳动强度, 提高工作效率, 使医院真正实现各个部门办公同步进行。提出了BS架构的医院信息管理系统开发与应用的理念。系统设计从医院信息管理系统的需求分析入手, 并以门诊管理为代表, 详细讲述系统的详细设计和具体...https://www.iteye.com/resource/sohopeter-12233282
4.《SoC底层软件低功耗系统设计与实现李晓杰Linux内核性能优化...当当火把图书专营店在线销售正版《SoC底层软件低功耗系统设计与实现 李晓杰 Linux内核 性能优化 BSP 底层软件 CPU 芯片 芯片设计》。最新《SoC底层软件低功耗系统设计与实现 李晓杰 Linux内核 性能优化 BSP 底层软件 CPU 芯片 芯片设计》简介、书评、试读、价格、图片等相关http://product.dangdang.com/11479094632.html
5.基于BS方式的即时通讯软件的设计与实现毕业作品(24页)基于B/S方式的即时通讯软件的设计与实现摘 要即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,而各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能。随着互联网的发展,即时通讯的运用将日益广泛,即时通讯软件业方兴未艾。本文首先描述了即时通讯业的发展和现状,然后初步...https://max.book118.com/html/2021/0629/7101105011003140.shtm
6.毕业设计毕设题目汇总(三)个人文章西部自驾游信息管理平台的设计与实现 基于B/S架构的园区车辆出入管理系统的设计与开发 基于wpf的学生管理系统的设计与实现 基于WPF的人事管理系统的设计与实现 基于区块链的去中心化密钥管理服务设计和实现 计算机网络管理及计费系统的设计与实现 基于Web的物流管理系统设计及实现 基于BS架构的信息管理系统设计与实现 ...https://segmentfault.com/a/1190000038169083?utm_source=sf-similar-article
1.基于BS的论文管理系统的设计与实现《基于BS的论文管理系统的设计与实现》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 开发语言:Java 框架:ssm 技术:jsp JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea ...https://blog.csdn.net/qiufangtaowvnyyidtf/article/details/143685030
2.基于BS校园二手商品交易管理系统的设计与实现本文的在基于B/S模式的基础上,应用JSP软件开发工具,通过深入研究大学校园的二手市场需求,设计与实现了一个校园二手信息发布平台。二手商品信息发布平台实现了具有以下功能:发布二手商品信息,学生可以根据自己的生活需求,将自己闲置的物品放在该平台上以较低价格出售,买家看到出售信息后可以根据上述信息主动联系买家,然后...https://d.wanfangdata.com.cn/thesis/D01142881
3.ASP基于BS结构的二手交易系统的设计与实现(源代码+设计说明书).zip本项目“ASP基于BS结构的二手交易系统”是一个综合性的在线平台,旨在为用户提供一个方便、安全且易于操作的二手商品买卖环境。系统通过ASP编程语言和相关技术栈构建,包括HTML/CSS前端页面设计、JavaScript动态交互实现以及后端数据库管理等。项目的核心功能涵盖了用户管理、商品发布与搜索、购物车与订单管理、支付接口集成、...https://www.coder100.com/index/index/content/id/4250631
4.基于springboot宠物领养管理系统的设计与实现宠物领养计划基于springboot宠物领养管理系统的设计与实现 宠物领养计划,项目编号:BS-PT-052项目说明:  本项目主要实现对流浪动物的救助和收养功能。前端用户可以注册并登陆,在系统前端页面可以实现对流浪动物相关知识的学习以及在线进行动物的收养操作。同时还为平台的运https://blog.51cto.com/u_13424/10874078
5.BS1071本医疗健康档案大数据采集清洗数据分析可视化的设计与实现,系统主要采用java,springboot,动态图表echarts,vue,mysql,mybatisplus,医疗健康档案数据分析,html,css,javascript等技术实现,主要通过互联网采集爬虫获取互联网医疗健康档案,对健康档案数据进行数据分析整合,数据处理成JSON格式,通过前端javascript解析JSON完成数据可视化...https://cloud.tencent.com/developer/article/2329946
6....项目源码技术教学ssm+vue708基于BS的库存管理软件设计与实现...ssm+vue708基于BS的库存管理软件设计与实现 源码 论文【项目源码下载】来源: www.bisheonline.net 发布日期:2024-11-12 点击率:000000021 价格:30.00元>>>查看系统运行视频<<< 开发技术 java mysql ,ssm框架 开发语言:Java 框架:ssm 技术:vue JDK版本:JDK1.8 服务器:tomcat7,8,9 数据库:mysql 8 数据库工...https://www.bisheonline.net/onebs.php?id=2173
7.管理系统毕业论文通用12篇3 系统设计与开发 3.1 系统研发的目的 毕业生毕业论文(设计)管理系统充分利用网络的优势,实现论文管理的网络化,使原本繁琐的选题问题简单,快捷,奏效。解放教辅人员和学生。学生能够根据教师所提交的题目,在联网的计算机上随时选择,更改自己的论文题目。教师可以在任意联网的计算机上论文信息,并实现选择其论文的学生信息的...https://dzjj.xueshu.com/haowen/4485.html