暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OpenHarmony中如何启动“喂狗服务”?

鸿蒙技术社区 2022-01-14
869

watchdog 的实现用于监视系统的运行,包括内核态 watchdog 模块和用户态 watchdog 服务程序。


内核态 watchdog 模块通过 /dev/watchdog 这个字符设备与用户态通信。


用户态程序一旦打开 dev/watchdog 设备,就会在内核中启动 N 秒的喂狗定时器,此后,用户态程序需要保证在 N 秒之内向这个设备写入数据),每次写操作会导致重新设定定时器。


如果用户态程序在 N 秒之内没有写操作,喂狗定时器到期会导致一次系统 CPU 复位重启。


通过这种机制可以保证系统核心进程大部分时间都处于运行状态,即使特定情形下进程崩溃,因无法正常定时“喂狗”,CPU 硬件复位,系统重启;重新恢复系统的正常运行。


内核态配置


代码在 OpenHarmony 的位置:

device\hisilicon\hispark_taurus\sdk_linux\soc\src\interdrv\common\wtdg\hi_wtdg.c


配置选项:

device\hisilicon\hispark_taurus\sdk_linux\soc\src\mpp\cfg.mak
export CONFIG_HI_WDG=y


device\hisilicon\hispark_taurus\sdk_linux\soc\src\mpp\cbb\include\autoconf.h
#define CONFIG_HI_WDG 1


编译脚本 BUILD.gn:

device\hisilicon\hi3516dv300\BUILD.gn
group("hi3516dv300_group") 
{
  deps = [
    "build:rc_files",
    "build/rootfs:init_configs",
    "sdk_linux/mpp:sdk_linux_mpp_group",
    "//device/hisilicon/hispark_taurus:hispark_taurus",
  ]
}


“//device/hisilicon/hispark_taurus:hispark_taurus”,配置了编译喂狗代码生成 hi3516cv500_wdt.ko 内核模块,打包进入 vendor 镜像的 /vendor/modules/hi3516cv500_wdt.ko

模块 KO 的插入:

device\hisilicon\hi3516dv300\build\rootfs\init.Hi3516DV300.cfg


插入 ko 之后,就是有 dev/watchdog 设备文件。

用户态配置


代码位置:

base\startup\init_lite\watchdog\init_watchdog.c


BUILD.gn 编译脚本:

 import("//build/ohos.gni")
  ohos_executable("watchdog_service") {
    sources = [ "init_watchdog.c" ]
    include_dirs = [ "//base/startup/init_lite/services/log" ]
    deps = [ "//base/startup/init_lite/services/log:init_log" ]
    defines = [ "LINUX_WATCHDOG" ]
    install_enable = true
    part_name = "init"
  }


从编译脚本分析,生成 watchdog_service 可执行文件,并打包在 system/bin 目录下。


init 进程脚本配置:

base\startup\init_lite\services\etc\init.cfg
   "jobs" : [{
            "name" : "pre-init",
            "cmds" : [
                "write /proc/sys/kernel/sysrq 0",
                "mkdir /acct/uid",
                "chown root system /dev/memcg/memory.pressure_level",
                "chmod 0040 /dev/memcg/memory.pressure_level",
                "mkdir /dev/memcg/apps/ 0755 system system",
                "mkdir /dev/memcg/system 0550 system system",
                "start ueventd",
                "start watchdog_service",
                "mkdir /data",
                "mount_fstab /vendor/etc/fstab.${ohos.boot.hardware}",
                "load_persist_params "
            ]


“start watchdog_service”,启动 watchdog_service 服务,服务配置:

{
            "name" : "watchdog_service",
            "path" : ["/system/bin/watchdog_service""10""2"],
            "disabled" : 1,
            "uid" : "root",
            "gid" : ["shell""log""readproc"]
        },

👇扫码报名下周三的鸿蒙直播课👇

👇点击关注鸿蒙技术社区👇
了解鸿蒙一手资讯


求分享

求点赞

求在看

文章转载自鸿蒙技术社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论