双系统启动的方式不止一种。
一、对于双系统的启动镜像来说:
1、Linux系统和Android系统的uboot、kernel镜像相同而文件系统(rootfs)不同;
2、Linux系统和Android系统的uboot镜像相同而kernel镜像和文件系统(roofts)不同。
这两种情况都可以实现对双系统的启动和切换。
二、双系统启动和相互切换的实质是设置标志位,在启动时读取标志位信息从而启动相应的系统!下面是两种实现方式。
1、启动(重启)时,单独分出一个分区存储标志位(保证两个系统都能对这一块分区操作);
在应用程序中向分区写入标志位,然后重启在uboot阶段自动scan读取这个分区中的标志位(对应启动相应的系统)。
2、在文件系统分区写入一个.txt文件(文件存储标志位);
在uboot中scan读取该.txt文件的中的内容(标志位),然后决定启动相应的系统。
三、本次主要讨论Linux系统和Android共uboot的情况,实现方式为单独分出一个分区存储标志位。已实现。
1、要实现双系统的启动和相互切换,需要对uboot启动过程、bootargs引导参数有相应的了解。
2、首先,将uboot,Android系统的kernel和file system,Linux系统的kernel和file system烧写到emmc中,如下图所示。
注意:烧写的物理位置应与下面讲到的bootargs引导参数相对应,否则系统启动会失败!!!
图中为主要烧写部分,其他的烧写按照自己思路稍微调整。
设置flags分区,存储我们的启动标志位。
3、对uboot的修改:
(1)将bootargs引导参数写入uboot中,并且制作command命令,至于怎样将制作的command命令放在".u_boot_cmd"段: ,用下面例子讲解。
例子:
 a)在common文件夹下创建cmd_sunplus.c;
     b)在cmd_sunplus.c中添加“sunplus_linuxemmcboot 和sunplus_androidemmcboot”命令的响应函数的实现。具体的实现代码如下:

//====================================================================
int do_sunplus_linuxemmcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int ret = 0;
    /*①
     设置bootargs引导参数
    //这里BOOT_TYPE_LINUX_EMMC为    "console=ttyAMA0,115200 root=/dev/mmcblk0p8 rootfstype=ext4 rootwait blkdevparts=mmcblk0:1M(boot),1M(bootargs),4M(baseparam),4M(pqparam),4M(logo),3058M(unused),8M(kernel),96M(rootfs),1M(flags),-(others) coherent_pool=1M"
     */
setenv("bootargs", BOOT_TYPE_ANDROID_EMMC );
    /*②
      从emmc中读取kernel到内存中:起始地址为0x600000(内核文件存储的实际物理地址),长度为0x4000,读到起始地址为0x1000000的内存中
   */
ret = run_command("mmc read 0 0x1000000 0x600000 0x4000" , 0);
if(ret == -1) {
printf("read kernel failed.\n");
sp_failed();
}
    /* ③
     启动Linux的kernel
    */
printf(GREEN"Boot to linux.\n"NONE);
run_command("bootm 0x1000000" , 0);
printf("bootm linux sys failed.\n");
return ret;
}
U_BOOT_CMD(
sunplus_linuxemmcboot,    1,    0,    do_sunplus_linuxemmcboot,
"[sunplus app func]:boot up linux from emmc",
"\n"
);
int do_sunplus_androidemmcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int ret = 0;
    /*①
     设置bootargs引导参数
    //这里BOOT_TYPE_ANDROID_EMMC为    "console=ttyAMA0,115200 blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),20M(logo),20M(logobak),40M(fastplay),40M(fastplaybak),40M(kernel),20M(misc),8M(userapi),8M(hibdrv),8M(qbflag),300M(qbdata),800M(system),1024M(userdata),500M(cache),50M(private),50M(sdcard),218M(unused),1M(flags),-(others) coherent_pool=1M"
     */
setenv("bootargs", BOOT_TYPE_ANDROID_EMMC );
    /*②
      从emmc中读取kernel到内存中:起始地址为0x4B000(内核文件存储的实际物理地址) ,长度为0x5000,读到起始地址为0x1FFBFC0的内存中
   */
ret = run_command("mmc read 0 0x1FFBFC0 0x4B000 0x5000" , 0);
if(ret == -1) {
printf("read kernel failed.\n");
sp_failed();
}
    /* ③
     启动Android的kernel
   */
printf(GREEN"Boot to android.\n"NONE);
run_command("bootm 0x1FFBFC0" , 0);
printf("bootm android sys failed.\n");
return ret;
}
U_BOOT_CMD(
sunplus_androidemmcboot,    1,    0,    do_sunplus_androidemmcboot,
"[sunplus app func]:boot up android from emmc",
"\n"
);
//====================================================================   
 c)将common/cmd_sunplus.c编译进u-boot.bin,在common/Makefile中加入如下代码:
COBJS-$(CONFIG_BOOT_SUNPLUS) += cmd_sunplus.o
     d)在include/configs/hi3798mx.h(代码相应位置)加入如代码:
#define CONFIG_BOOT_SUNPLUS 
     e)重新编译下载U-Boot就可以使用sunplus_linuxemmcboot 和sunplus_androidemmcboot 命令了
(2)在boot源码的Main.c中,找到main_loop()函数。
要实现双系统启动,需要在boot启动阶段扫描咱们定义的标志位,然后启动相应的系统。下图是main_loop()函数的扫描标志位操作在如图所示位置加入扫描标志位分区,既能率先扫描分区,又能达到控制Ctrl+C到boot命令下
4、编译boot,烧写完成之后启动系统。
启动完成后,在Linux系统下,flags(标志位分区)是/dev/mmcblock0p9第九分区,在/dev/mmcblock0p9设备文件中写入“android”,重启即可切换到Android系统。同理,在Android系统下,flags(标志位分区)在/dev/block/mmcblock0p23第23分区,在/dev/block/mmcblock0p23设备文件中写入“linuxaa”,即可切换到Linux系统。
两个系统虽然是不同的设备文件名,但都是操作的同一块物理地址(起始地址为0x63400)。
这样就完成了双系统的启动。
本文只是一种思路,有更好的请广大码友指教!

实现Linux/Android双系统启动和重启切换的一个思路相关推荐

  1. 如何实现linux+windows双系统启动

    设置你的计算机根据需要启动 Windows 10 或 Ubuntu 18.04. 尽管 Linux 是一个有着广泛的硬件和软件支持的操作系统,但事实上有时你仍需要使用 Windows,也许是因为有些不 ...

  2. 如何实现 Linux + Windows 双系统启动

    原博客:https://linux.cn/article-10314-1.html 设置你的计算机根据需要启动 Windows 10 或 Ubuntu 18.04. 尽管 Linux 是一个有着广泛的 ...

  3. 电脑双系统启动顺序的切换方法

    转自:http://blog.csdn.net/u010695380/article/details/9065487 自从电脑装了双系统,有时候开机一个不小心就进了win7,结果就是不得不重新开机.还 ...

  4. linux win10双系统启动顺序,Windows 10 和 Ubuntu 20.04 双系统 GRUB2 默认启动项的更改...

    测试环境系统:Windows 10和Ubuntu 20.04 许多喜欢使用GNU/Linux发行版的用户由于各种原因不能放弃Windows.因此,许多人选择双启动(或多启动).如果您在安装了Windo ...

  5. iphone4装android,iPhone4可安装Android实现双系统启动.pdf

    iPhone 4 可安装 Android 实现双系统启动iPhone 4 可安装 Android 实现双系统启动 苹果的 iOS 以其封闭性而著称 相比 Android 这种开放性系统 iOS 很难移 ...

  6. 让iphone可装android双启动,iPhone 4可安Android实现双系统启动

    苹果的iOS以其封闭性而著称,相比Android这种开放性系统,iOS很难移植到其他设备上,不过Android就已经成功的入侵到iPhone手机之中.使用iPhoDroid工具就可以很容易的将iPho ...

  7. 让iphone可装android双启动,只需几步 iPhone可装Android双启动

    苹果的iOS以其封闭性而著称,相比Android这种开放性系统,iOS很难移植到其他设备上,不过Android就已经成功的入侵到iPhone手机之中.使用iPhoDroid工具就可以很容易的将iPho ...

  8. 让iphone可装android双启动,只需几步 iphone 4可安装Android双启动

    苹果的iOS以其封闭性而著称,相比Android这种开放性系统,iOS很难移植到其他设备上,不过Android就已经成功的入侵到iPhone手机之中.使用iPhoDroid工具就可以很容易的将iPho ...

  9. Colemak布局的实现 Window+Linux+Android

    Colemak布局的实现 Window+Linux+Android title: 'Colemak布局的实现' subtitle: '一个极客的键盘布局' tags: entertainment so ...

最新文章

  1. 网络分布式软件bonic清除
  2. 华为明年发布鸿蒙系统手机,华为鸿蒙系统2.0正式发布,明年将运用在手机上
  3. python编程语言是什么-什么是编程语言,什么是Python解释器
  4. poj 1966(顶点连通度)
  5. GridView合并列下的行单元格的方法
  6. java workerdone_【架构】Java并发编程——线程池的使用
  7. IDEA 运行spingboot时出现Process finished with exit code -1073741819 (0xC0000005)
  8. 如何掌握Java内存(并保存程序)
  9. LeetCode 20. 有效的括号(栈)
  10. mysql5.7循环,python3.4用循环往mysql5.7中写数据并输出的实现方法
  11. Command对象应用--增加问卷调查
  12. matlab disp输出换行,matlab输出语句disp
  13. Java毕业设计——员工管理系统
  14. MovieLens电影推荐系统
  15. Android平板软件推荐,新人看过来 安卓平板装机必备软件推荐
  16. 小米手机开启Root权限
  17. Java学习笔记(24)——正则表达式
  18. Holy Grail
  19. storm - 简介
  20. Linux挂载命令mount 详解

热门文章

  1. UMAP分析步骤初解
  2. JAVA JSP幼儿园事务管理系统JSP早教中心网站系统 JSP幼儿园网站JSP幼儿园管理系统
  3. fcitx日语输入法添加
  4. java matlab混合编程_java和matlab混合编程
  5. matlab:神经网络分类预测鸢尾花(iris)
  6. MyBatisPlus实操Demo
  7. python做游戏脚本被监测_一个监视CSDN论坛押宝游戏状态的python脚本
  8. 总结了 200 道 BAT 机器学习面试题,值得收藏 (附参考答案)
  9. SylixOS下影子终端工具
  10. vue双向绑定经典案例