NetBSD-1.0 时间设置的一个bug

    每次使用 date 命令设置主机时间,再次重启后时间就和设置的不一样了!查看启动时的日志:

对应的代码为 arch/i386/isa/clock.c 的 startrtclock 函数:

        /* Check diagnostic status */
        outb (IO_RTC, RTC_DIAG);
    if (s = inb (IO_RTC+1))
        printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS);

为什么 RTC 的诊断状态会不对呢?

经过调试和更高版本的NetBSD代码比对之后,发现问题的原因为同一个文件里的 resettodr 函数:

    rtclk.rtc_min = dectohexdec(n%60);
    rtclk.rtc_hr = dectohexdec(n/60);

    n = (time.tv_sec - diff) / (3600 * 24);    /* days */
    rtclk.rtc_dow = (n + 4) % 7;  /* 1/1/70 is Thursday */

    for (j = 1970, i = yeartoday(j); n >= i; j++, i = yeartoday(j))
        n -= i;

    rtclk.rtc_yr = dectohexdec(j - 1900);

    if (i == 366)
        month[1] = 29;
    for (i = 0; n >= month[i]; i++)
        n -= month[i];
    month[1] = 28;
    rtclk.rtc_mon = dectohexdec(++i);

    rtclk.rtc_dom = dectohexdec(++n);

红色粗体部分,直接设置年份为当前年份和 1900 年的差值。但是从 RTC 读取的时候,却又是:

    sec = hexdectodec(rtclk.rtc_sec);
    min = hexdectodec(rtclk.rtc_min);
    hr = hexdectodec(rtclk.rtc_hr);
    dom = hexdectodec(rtclk.rtc_dom);
    mon = hexdectodec(rtclk.rtc_mon);
    yr = hexdectodec(rtclk.rtc_yr);
    yr = (yr < 70) ? yr+100 : yr;

    n = sec + 60 * min + 3600 * hr;
    n += (dom - 1) * 3600 * 24;

    if (yeartoday(yr) == 366)
        month[1] = 29;

保存在 RTC 里的年份数值只是实际年份的后两位,所以修改代码为:

    rtclk.rtc_min = dectohexdec(n%60);
    rtclk.rtc_hr = dectohexdec(n/60);

    n = (time.tv_sec - diff) / (3600 * 24);    /* days */
    rtclk.rtc_dow = (n + 4) % 7;  /* 1/1/70 is Thursday */

    for (j = 1970, i = yeartoday(j); n >= i; j++, i = yeartoday(j))
        n -= i;

    rtclk.rtc_yr = dectohexdec( ( j - 1900 ) % 100 );

    if (i == 366)
        month[1] = 29;
    for (i = 0; n >= month[i]; i++)
        n -= month[i];
    month[1] = 28;
    rtclk.rtc_mon = dectohexdec(++i);

    rtclk.rtc_dom = dectohexdec(++n);

重编译并更新内核之后,问题解决。

转载于:https://www.cnblogs.com/StupidTortoise/p/4321069.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值