Talkweb开发者社区
直播中

拓维信息

4年用户 34经验值
私信 关注
[经验]

OpenHarmony喂狗源码解读之用户态源码

  • 一、用户代码分析
    • 1.程序等待ko加载创建字符设备
    • 2.喂狗程序
  • 二、喂狗流程




一、用户代码分析1.程序等待ko加载创建字符设备
  1. WaitAtStartup("/dev/watchdog");
  2. #define WAIT_MAX_COUNT 10
  3. static void WaitAtStartup(const char *source)
  4. {
  5.     unsigned int count = 0;
  6.     struct stat sourceInfo;
  7.     unsigned int waitTime = 500000;
  8.     do {
  9.         usleep(waitTime);
  10.         count++;
  11.     } while ((stat(source, &sourceInfo) < 0) && (errno == ENOENT) && (count < WAIT_MAX_COUNT));
  12.     if (count == WAIT_MAX_COUNT) {
  13.         INIT_LOGE("wait for file:%s failed after %f.", source, WAIT_MAX_COUNT>>1);
  14.     }
  15.     return;
  16. }


程序起来等待喂狗KO加载创建/dev/watchdog 5s的时间
2.喂狗程序
  1. int interval = 0;
  2.     if (argc >= 2) { // Argument nums greater than or equal to 2.
  3.         interval = atoi(argv[1]);
  4.     }
  5.     interval = (interval > 0) ? interval : DEFAULT_INTERVAL;

  6.     int gap = 0;
  7.     if (argc >= 3) { // Argument nums greater than or equal to 3.
  8.         gap = atoi(argv[2]); // 2 second parameter.
  9.     }
  10.     gap = (gap > 0) ? gap : DEFAULT_GAP;

  11.     INIT_LOGI("watchdoge started (interval %d, margin %d), fd = %dn", interval, gap, fd);

  12.     // 两个入参之和为用户态喂狗超时时间
  13.     int timeoutSet = interval + gap;
  14.     int timeoutGet = 0;
  15.     int ret = ioctl(fd, WDIOC_SETTIMEOUT, &timeoutSet);
  16.     if (ret) {
  17.         INIT_LOGE("Failed to set timeout to %dn", timeoutSet);
  18.     }
  19.     ret = ioctl(fd, WDIOC_GETTIMEOUT, &timeoutGet);
  20.     if (ret) {
  21.         INIT_LOGE("Failed to get timeoutn");
  22.     } else {
  23.         // 用户态设置喂狗超时时间为大于gap 用户态喂狗间隔时间为
  24.         // 获取内核的超时间 - gap,如果小于gap 用户态喂狗超时时间为1s
  25.         interval = (timeoutGet > gap) ? (timeoutGet - gap) : 1;
  26.     }
  27.     while (1) {
  28.         ioctl(fd, WDIOC_KEEPALIVE);
  29.         sleep(interval);
  30.     }
  31.     close(fd);
  32.     fd = -1;
  33.     return -1;
  34. }


二、喂狗流程
  1. 加载喂狗KO ——> 创建/dev/watchdog
  2. ——> 注册内核函数接口open,ioctl,release
  3. ——> 创建内核喂狗线程hidog,并以30.01s喂狗
  4. ——> 用户态等待/dev/watchdog创建
  5. ——> 设置和获取超时时间,并计算用户态喂狗时间间隔
  6. ——> 以计算的喂狗时间间隔喂狗


如果用户态设置的喂狗时间超过30s,那么用户态喂狗程序退出不会影响内核线程喂狗,系统不会重启。

更多回帖

发帖
×
20
完善资料,
赚取积分