BIOS实战之CMOS

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写值去分析,那么就把上面这两句写在你怀疑的代码中,当然了,写这个之前,你还要添加相应的库。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值