您的位置:首页 > 其它

CMOS 内存和实时时钟

2010-02-10 20:09 225 查看
第15章 CMOS 内存和实时时钟 笔记

简介
系统带有一个小型的CMOS内存,其中保存着系统断电时的数据。该内存用来记录软盘的类型和数目、硬盘大小信息、内存大小以及其他重要的系统数据。CMOS芯片还含有一个实时时钟(RTC),用来保持当前时间。关掉电源时,RTC由计算机内部的电池供电。电池保持时钟处于活动状态,以及保留CMOS内存内容。如果在断电时电池无法正常供电,将丢失CMOS内容。在BIOS系统上电自检(POST)期间,大多数BIOS会识别出这一点。

实时时钟(RTC)的常用信息有十个寄存器用来访问RTC时间和数据。所有的时钟寄存器采用BCD (二进制编码的十进制)格式。

另外四个寄存器用来保存时钟、闹钟和CMOS内存的状态和控制信息。状态和控制寄存器称作寄存器A、B、C和D 。RTC有许多古怪之处,要求专门的编程来保证访问可靠。使用下面描述的RTC BIOS来避免这些令人头疼的问题,我极力推荐这样做.通过I/O端口70h装入任何数据或时间寄存器时,必须停止时钟。这一点可以防止在设置新的日期或时间期间更新寄存器。要停止时钟,可以将寄存器B的第7位设置为1。更新完成时,将寄存器B的第7位设置为0来激活时钟。

警告
中断 在访问CMOS寄存器时必须禁止所有的中断。访问一个CMOS寄存器时,端口70h用于选择使用哪个寄存器。然后通过端口71h读或写这个寄存器。如果在两个I/O端口访问之间出现了中断,并且中断处理程序会访问CMOS,你的代码将会读或写错误的寄存器。
除了禁止中断之外,还要禁止不可屏蔽中断(NMI)。NMI主要用于陷入RAM奇偶错误和数字协处理错误。在访问CMOS时很可能出现这些情况。不幸的是,NMI禁止是一个只写标志,所以前面的状态无法知道。每个人常用的方法是假定NMI是开放的,这就意味着在访问CMOS后总会开放NMI。
在观察访问一个CMOS寄存器的步骤时,你必须首先使用CLI指令禁止中断。选择CMOS寄存器时应禁止了NMI,恰巧由端口70H的位7控制NMI,这个端口和指定CMOS寄存器的端口相同。CMOS访问完成时,再次写端口70h,并清除位7,来重新开放NMI。
然后使用STI指令来开放一般的中断。在下面的程序READ_CMOS 和 WRITE_CMOS 中考虑了以上这些问题。

(有些chipset支持256 bytes的cmos ram,访问128bytes以后的空间需要开启chipset的始能register,有些chipset使用72h,73h访问扩展的空间如intel chipset,有些仍然使用70h,71h如sis chipset)

代码例15-1 读CMOS
;----------------------------------
;READ_CMOS
;读取指定CMOS寄存器的内容

;调用:al=要读取的CMOS地址

;返回:ah=寄存器的内容
; 开放NMI,如果禁止
read_cmos proc near
or al, 80h ;禁止NMI
cli ;禁止中断
out 70h,al ;要读取的寄存器
IODELAY
in al, 71h ;返回寄存器的内容
mov ah,al
mov al,0
IODELAY
out 70h,al ;开放NMI
sti ;开放中断
ret
read_cmos endp

代码例 15-2 写CMOS
;-------------------------------
; WRITE_CMOS
;
; 调用:al=要写入的CMOS寄存器
; ah=要写入的值
;
; 返回:NMI开放,如果禁止

write_CMOS proc near
cli ;禁止中断
or al,80h ;禁止NMI
out 70h,al ;al=要写的寄存器
mov al,ah
IODELAY
out 71h,al ;写寄存器
mov al,0
IODELAY
out 70h,al ;开放NMI
sti ;开放中断
ret
write_cmos endp

CMOS 求和校验
许多BIOS供应商,例如AMI和Phoenix,将从10h到2Dh的CMOS寄存器加起来,并将这个和值字保存在寄存器2Eh和2Fh中。寄存器2Eh保存着高位校验字节,而寄存器2Fh保存着低位校验字节。

网上有很多盛传的用debug 命令破解CMOS密码的方法,正是基于此原理,利用破坏CMOS的校验值来达到清除CMOS密码的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: