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密码的目的。
简介
系统带有一个小型的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 内存和实时时钟
- 读取CMOS内存中的时钟
- MSP430单片机之RTC-实时时钟
- 关于实时时钟模块DS1302使用心得
- 实时时钟的演示:.毫秒级计时输出;串口输出速率:9600bps.中断的使用。
- 用 Canvas 绘制实时时钟
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- 实时时钟芯片DS1302编程小结
- 单片机(七)__ds1302实时时钟
- psacct监视用户执行的命令,如cpu时间和内存战胜,实时进程记账
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- 实时时钟芯片 DS1302使用手册
- Ubuntu 标题栏实时显示网速CPU内存
- 【iCore1S 双核心板_ARM】例程十一:RTC实时时钟实验——显示时间和日期
- h264实时编解源代码,不仅有vfw,还有内存和cpu占用多少显示,vc6.0编译环境
- 【菜鸟入门】stm32 之 实时时钟
- python 实时得到cpu和内存的使用情况方法
- 【汇编】TSR内存驻留程序实现与删除及热键设置——以实现时钟为例
- 51单片机DS1302实时时钟驱动程序
- stm32 rtc 实时时钟