谷动谷力

 找回密码
 立即注册
查看: 2237|回复: 0
打印 上一主题 下一主题
收起左侧

OpenHarmony恢复启动子系统之上电启动及创建设备节点

[复制链接]
跳转到指定楼层
楼主
发表于 2022-9-13 12:06:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
OpenHarmony恢复启动子系统之上电启动及创建设备节点
系统上电加载内核后,按照以下流程完成系统各个服务和应用的启动:
  • 内核加载init进程,一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。
  • init进程启动后,会挂载tmpfs,procfs,创建基本的dev设备节点,提供最基本的根文件系统。
  • init也会启动ueventd监听内核热插拔设备事件,为这些设备创建dev设备节点;包括block设备各个分区设备都是通过此事件创建。
  • init进程挂载block设备各个分区(system,vendor)后,开始扫描各个系统服务的init启动脚本,并拉起各个SA服务。
  • samgr是各个SA的服务注册中心,每个SA启动时,都需要向samgr注册,每个SA会分配一个ID,应用可以通过该ID访问SA。
  • foundation是用户程序管理框架及基础服务;由该进程负责应用的生命周期管理。
  • 由于应用都需要加载JS的运行环境,涉及大量准备工作,因此appspawn作为应用的孵化器,在接收到foundation里的应用启动请求时,可以直接孵化出应用进程。


启动子系统上下文结构图

上电之后,一般在boot引导程序启动内核,在内核的cmdline 配置init进程的位置。

# cat /proc/cmdline                                    
mem=640M console=ttyAMA0,115200 mmz=anonymous,0,0xA8000000,384M clk_ignore_unused rootdelay=10 hardware=Hi3516DV300 init=/init root=/dev/ram0 rw blkdevparts=mmcblk0:1M(boot),15M(kernel),20M(updater),10M(misc),3307M(system),256M(vendor),-(userdata) initrd=0x84000000,0x290e00
(左右移动查看全部内容)

  • mem 用来告诉内核当前系统的内存有多少;
  • console 指定控制台使用的串口,波特率;
  • root 根文件系统的位置,内核挂载根文件系统时会用到;
  • blkdevparts= 指明存储设备的分区情况;


mmz :多媒体内存,海思才有的;内核加载的最后,会调用init进程。init进程是内核加载后第一个用户态进程。

init进程启动后,首先挂载tmpfs,procfs 等文件目录,创建基本的dev设备节点,提供最基本的根文件系统。


小型系统SystemPrepare 只是打印了些信息,下面都是标准系统才有的。

  • 挂载基本文件


mount /tmpfs /dev 0755
mount /tmpfs /mnt 0755
mount /devpts /dev/pts 0
mount /proc /proc  hidepid=2
mount /sysfs /sys  0
mount /selinuxfs /sys/fs/selinux 0
(左右移动查看全部内容)

跟硬件相关的挂载:

cat /vendor/etc/fstab.Hi3516DV300
fstab file
#                                                                                     /dev/block/platform/soc/10100000.himci.eMMC/by-name/system               /usr       ext4     ro,barrier=1  wait,required
/dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor              /vendor        ext4     ro,barrier=1  wait,required
/dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata               /data       ext4     nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600
/dev/block/platform/soc/10100000.himci.eMMC/by-name/misc /misc none none wait,required
(左右移动查看全部内容)

  • 创建设备结点:


/dev/kmsg
/dev/null
/dev/random
/dev/urandom
(左右移动查看全部内容)

  • LogInit

打开串口log打印。

创建结点/dev/kmsg,并打开,log写入这里。通过dmesg 可以查看log。目的是通过串口打印log方便调试。

通过命令cat /proc/sys/kernel/printk_devkmsg 可以查看/dev/kmsg 是否打开。

  • 如果是升级模式,启动第二阶段初始化

从 /etc/fstab.required 或/system/etc/fstab.require 获取挂载设备列表。

如果这两个挂载文件都不存在,则退出第二阶段。到此结束,继续第一阶段。

启动uvent,根据fstab.required挂载分区

然后执行:

chroot /usr
/bin/init --second-stage


+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-11-25 07:44 , Processed in 0.222876 second(s), 44 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表