读取CMOS内存中的时钟
2011-06-10 16:24
162 查看
一、CMOS内存信息详解
一般的PC/AT、286、386、486等微机均配有CMOS芯片,CMOS&127;芯片包含了一个实时钟
和64个字节的CMOS内存。在CMOS内存中,0-0DH为实时钟的有关信息,0E-&127;3FH包含
计算机的硬件配置信息,如常规内存的大小、扩展内存的大小、&127;软盘的类型、固定
盘的类型及其物理参数、显示器的类型等,这些参数与计算机能否正常工作具有密切的
关系,另外还有计算机的开机口令和其它辅助设置信息。表1列出了CMOS内存各字
节的用途。
二、读写CMOS内存的方法
CMOS内存的地址口和数据口的口地址分别为70H和71H。在对CMOS内存进行写操作时,首先
将要写入的CMOS内存的地址送到口地址70H,&127;再将要写入的数据送口地址71H。在对
CMOS内存进行读操作时,首先将要读出的CMOS内存的地址送到口地址70H,再从口地址71H
读出数据到AL寄存器。
三、Linux下的c程序如下
一般的PC/AT、286、386、486等微机均配有CMOS芯片,CMOS&127;芯片包含了一个实时钟
和64个字节的CMOS内存。在CMOS内存中,0-0DH为实时钟的有关信息,0E-&127;3FH包含
计算机的硬件配置信息,如常规内存的大小、扩展内存的大小、&127;软盘的类型、固定
盘的类型及其物理参数、显示器的类型等,这些参数与计算机能否正常工作具有密切的
关系,另外还有计算机的开机口令和其它辅助设置信息。表1列出了CMOS内存各字
节的用途。
偏移量 (十六进制) | 偏移量 (十进制) | 字段长度 (字节) | 功能描述 |
00h | 0 | 1 | 用BCD描述的当前秒(00-59) |
01h | 1 | 1 | 用BCD描述的报警时钟秒 |
02h | 2 | 1 | 用BCD描述的报警当前分钟(00-59) |
03h | 3 | 1 | 用BCD描述的报警时钟分钟 |
04h | 4 | 1 | 用BCD描述的报警当前小时(00-23) |
05h | 5 | 1 | 用BCD描述的报警时钟(以小时为单位) |
06h | 6 | 1 | 用BCD描述的当前日期(星期几)(00-06) |
07h | 7 | 1 | 用BCD描述的当前日期(日)(00-31) |
08h | 8 | 1 | 用BCD描述的当前月(00-12) |
09h | 9 | 1 | 用BCD描述的当前年(00-99) |
0Ah | 10 | 1 | 状态注册码A |
0Bh | 11 | 1 | 状态注册码B |
0Ch | 12 | 1 | 状态注册码C |
0Dh | 13 | 1 | 状态注册码D |
0Eh | 14 | 1 | 诊断状态 |
0Fh | 15 | 1 | 系统关闭代码 |
10h | 16 | 1 | 软盘驱动器类型 |
11h | 17 | 1 | 高级BIOS设置选项 |
12h | 18 | 1 | 硬盘O/I类型(0-15) |
13h | 19 | 1 | 键盘输人速率与延迟 |
14h | 20 | 1 | 安装设备 |
15h | 21 | 1 | 从低位字节计数的基本内存,以1K计数 |
16h | 22 | 1 | 从高位字节计数的基本内存,以1K计数 |
17h | 23 | 1 | 从低位字节计数的扩展内存,以1K计数 |
18h | 24 | 1 | 从高位字节计数的扩展内存,以1K计数 |
19h | 25 | 1 | 硬盘扩展类型0(0-255) |
1Ah | 26 | 1 | 硬盘扩展类型1(0-255) |
1Bh | 27 | 8 | 硬盘0的用户定义类型信息 |
24h | 36 | 8 | 硬盘1的用户定义类型信息 |
2Dh | 45 | 1 | 高级BIOS设置选项 |
2Eh | 46 | 1 | 高位字节CMOS校验和 |
2Fh | 47 | 1 | 低位字节CMOS校验和 |
30h | 48 | 1 | 从低位字节计数的POST报告扩展内存 |
31h | 49 | 1 | 从高位字节计数的POST报告扩展内存 |
32h | 50 | 1 | BCD码公元数(00-90) |
33h | 51 | 1 | 通电自检信息标志 |
34h | 52 | 2 | 高级BIOS设置选项 |
36h | 54 | 1 | 指定芯片组的BIOS设置选项 |
37h | 55 | 7 | 加电口令(通常加密) |
3Eh | 62 | 1 | 从高位字节计数的扩展CMOS校验和 |
3Fh | 63 | 1 | 从低位字节计数的扩展CMOS校验和 |
CMOS内存的地址口和数据口的口地址分别为70H和71H。在对CMOS内存进行写操作时,首先
将要写入的CMOS内存的地址送到口地址70H,&127;再将要写入的数据送口地址71H。在对
CMOS内存进行读操作时,首先将要读出的CMOS内存的地址送到口地址70H,再从口地址71H
读出数据到AL寄存器。
三、Linux下的c程序如下
#include <unistd.h> #include <malloc.h> #include <stdio.h> #include <time.h> #include <sys/io.h> #define CMOS_READ(addr)({/ outb(0x80|addr,0x70);inb(0x71);}) #define BCD_TO_BIN(val) ((val)=((val)&15)+((val)>>4)*10) int main() { iopl(3); struct tm * time; time=(struct tm *)malloc(sizeof(struct tm)); do{ time->tm_sec=CMOS_READ(0); time->tm_min=CMOS_READ(2); time->tm_hour=CMOS_READ(4); }while(time->tm_sec!=CMOS_READ(0)); BCD_TO_BIN(time->tm_sec); BCD_TO_BIN(time->tm_min); BCD_TO_BIN(time->tm_hour); printf("%d-%d-%d",time->tm_sec,time->tm_min,time->tm_hour); return 0; }
相关文章推荐
- 读取CMOS时钟并显示
- CMOS 内存和实时时钟
- CMOS 内存和实时时钟
- 王爽《汇编语言》第十四章读取CMOS时钟练习解答
- 【autoHotkey】 使用ahk读取内存判断魔兽争霸是否处于聊天状态
- MFC读取游戏内存数据
- 简单读取TOMCAT的内存使用情况
- PE文件从文件加载到内存,再从内存读取,然后存盘到文件
- C#内存流示例----->用内存流来读取图片
- 从XML中读取数据到内存的实例
- Java读取注册表信息到内存中
- FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析
- C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- 从文件中读取数组到内存
- 【原创】SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- C++升级到C#,内存数据读取问题
- windows7 Sql server 2012 尝试读取或写入受保护的内存。这通常指示其他内存已损坏的修复
- iphone怎样把音频文件写入本地文件,然后从本地文件读取到内存,进行播放音频?
- C#调用c++的dll报错:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏“