386计算机读取CMOS完整日期的讨论

计算机中的BIOS/CMOS,其中,CMOS是块芯片,里面有“一个时钟”和64个字节的存储单元(高版本的芯片存储更大些,不在这里讨论了),

在“不掉电”的情况下(关机后,有电池供电),能提供“实时钟”和计算机硬件的一些基础信息(比如内存大小、硬盘参数等)的存储,

CMOS每次只能读取一个字节,通过70H端口指定需要读取单元的位置(地址),71H端口读取出该单元的内容,

我们这里只讨论其中的日期部分,

在CMOS存储单元的9,8,7三个单元中,

分别存储的是:“年,月,日”,占用3个字节,是“BCD”码的存放格式,

用DEBUG工具,就可以直接读取到,

操作如下:

C:\DEBUG <cr>

-O 70,9

-I 71

-O 70,8

-I 71

-O 70,7

-I 71

就能够读出来了,返回的是每个单元的内容,BCD码格式,

今天,读取出来是,25,6,12

也就是25年6月12日,


粗看,确实是2位的年,没有“世纪的年”部分,

但是,查看资料,根据CMOS芯片技术信息描述,

在存储单元的50(32H)位置(位置不连续,所以容易被忽视),

有个“CenturyYear”,是“世纪的年”,

用同样方式读出,

C:\DEBUG <cr>

-O 70,32

-I 71

显示是20,

这样,2个位置的年,合并起来,就是2025年6月12日,

是“完整年”的,4位的年。


用BIOS提供的中断调用 INT 1AH,来测试,

C:\DEBUG <cr>

A

MOV AH,4

INT 1A

INT 3

G=100

返回的寄存器中,是BCD码格式,是可以直接看到数字了,其中,

CH是世纪年,CL是2位的年,DH是月,DL是日,


通过BIOS的软中断调用,也是能正确的读出完整的年,4位的年。

对于,曾经发生的,2000年前,热闹非凡的“千年虫”问题,

主要是因为某些“应用程序”或者“数据库字段”没有去设置存储4位年的字段、也没读取世纪的“大年”造成的,

也就是99年之后,变成00年了,

修复的办法,需要修改有关年的程序和字段长度为4,变成4位的年。

这台386机器的BIOS日期有效范围是1901到2099年,左下角部分有说明,


但是,如果设置成1980年以前的任何年份,DOS启动后,自动给设置成1980年,

我也查看了DOS的“年”,支持的是1980到2099,输入其它说“非法错”,

使用DOS的“系统调用”(软中断 INT21),测试,读出年份,

C:\DEBUG <cr>

A

MOV AH,2A

INT 21

INT 3

G=100

返回的寄存器中,CX是年(是16进制格式,不是BCD码,需要换算成十进制),DH是月,DL是日,


使用DOS的命令,

C:\DATE <cr>

也是正确的年份,4位的年份。

但是,另外,另外,另外,

还有一个问题,就是Unix/Linux的时间问题,

Unix/Linux的时间,是1970年+“32位”的秒,

这个“32位”的秒,到2038年的时候,满了,

不加干预的情况下,会造成另一个类似“千年虫”的问题,

到那个时候,如果升级到了“64位秒”就没问题了,

如果到了那个时候,还继续使用“32位描述秒”的机器和应用程序、数据库等,一定会有“大奖”给你,网上有很多讨论,在此不再赘述。

我在这台386机器的硬盘中的另一个分区,安装了一个32位的老版本Linux,到2038年的时候,肯定会出现这个问题,

“32位秒”的时间满了,溢出了,下一步要如何处理,看我的空闲时间和兴趣了,

最后,如果,如果,如果,

到了2099年,这台386的机器还能够活着的话,BIOS、DOS都会出现时间溢出问题,怎么办呢?

那个时候的“我”,

是“骨灰级别”的顽童呢,

还是,或者,应该,“就是一堆骨灰”呢。:-(

相关文一,


https://m.toutiao.com/is/mU3CEJPbY2o/?= 我的80386的机器还可以运行 - 今日头条

相关文二,


https://m.toutiao.com/is/DuH639gVV3U/?= 我的386计算机上的老配件 - 今日头条



本文完。

原文链接:,转发请注明来源!