CMOS,作为BIOS工程师而言,说的当然是计算机领域的CMOS。
1.CMOS在计算机领域是用来干嘛的?
在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。。
2.CMOS和BIOS区别?
有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片(RAM芯片),这块芯片用来保存BIOS的硬件配置和用户对某些参数的设定。CMOS作为可擦写芯片使用,用户通常不会关心CMOS的硬件问题,而只关心写在CMOS上的信息,也就是BIOS的设置问题
3.CMOS的供电电源?
CMOS可由主板的电池供电,即使系统掉电,信息也不会丢失。
4.CMOS 的用处?
因为可读写的特性,所以在电脑主板上用来保存BIOS设置完电脑硬件参数后的数据,CMOS ROM本身只是一块存储器,只有数据保存功能,这个芯片仅仅是用来存放数据的。
而对BIOS中各项参数的设定要通过专门的程序。BIOS设置程序一般都被厂商整合在芯片中,在开机时通过特定的按键就可进入BIOS设置程序,方便地对系统进行设置。因此BIOS设置有时也被叫做CMOS设置。
我们实际来看一下CMOS的空间是怎么样的,工具使用RW,官网可以免费下载,这是一个非常有用的工具
我们可以看到,0x50,0x09,0x08,0x07,0x04,0x02,0x00。这些地址的值合并起来就是2020年12月14日15:07:18
如果不用RW,我们也可以写一个程序去读取所有地址空间的值:
#include "stdio.h"
#include "dos.h"
#include "conio.h"
#define MAXSIZE 16
void main()
{
unsigned char addr=0;
int row,col;
printf("\n\t\t CMOS Read/Write Routine\n");
printf("\t Q or q :Quit Enter:Flash ");
printf("\t 00 01 02 03 04 05 06 07 08");
printf(" 09 0A 0B 0C 0D 0E 0F\n");
for(row=0;row<9;row++)
{
printf(" %X0 ",row);
for(col=0;col<MAXSIZE;col++)
{
outportb(0x70,addr);
value[row][col]=inportb(0x71);
if(value[row][col]<16){
printf("0%X ",value[row][col]);
}
else{
printf("%X ",value[row][col]);
addr++;
}
}
printf("\n");
}
addr=0;
for(row=9;row<MAXSIZE;row++)
{
printf(" %X0 ",row);
for(col=0;col<MAXSIZE;col++)
{
outportb(0x71,addr);
value[row][col]=inportb(0x72);
if(value[row][col]<16){
printf("0%X ",value[row][col]);
}
else{
printf("%X ",value[row][col]);
addr++;
}
}
printf("\n");
}
return ;
}
知道怎么读了,那么怎么写就很简单了:
outportb(INDEX_PORT,index);
outportb(DATA_PORT,data);
在BIOS的debug过程中,如果要通过CMOS写值去分析,那么就把上面这两句写在你怀疑的代码中,当然了,写这个之前,你还要添加相应的库。