计算机中的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计算机上的老配件 - 今日头条
本文完。