CMOS 内存和实时时钟

第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密码的目的。

你可能感兴趣的:(CMOS 内存和实时时钟)