戏说BIOSCMOS

 

1. Introduction

CMOS全称为complementary metal oxide semiconductor, 翻译成中文就是互补金属氧化物半导体,它是由一颗小的纽扣电池供电的128/256 bytes ram(现在的chipset通常提供256 bytes或者更大的空间)。它主要用于存放RTC以及一些oem的系统配置信息,所以除了RTC等部分其它的很多信息都是undocumented& non-standard。RTC 标准的(documented&standard) ram bank如下表 1 所示:

Index

Name

00h

Seconds

01h

Seconds Alarm

02h

Minutes

03h

Minutes Alarm

04h

Hours

05h

Hours Alarm

06h

Day of Week

07h

Day of Month

08h

Month

09h

Year

0Ah

Register A

0Bh

Register B

0Ch

Register C

0Dh

Register D

0Eh-7Fh

114 Bytes of User RAM

表 1

2. Access Cmos

访问cmos通常是透过70h,71h这两个IO port实现的,有些chipset支援256 bytes的cmos ram,访问128bytes以后的空间需要开启chipset的始能register,有些chipset使用72h,73h访问扩展的空间如intel chipset,有些仍然使用70h,71h如sis chipset,因为这部分是非标准的,故后面的练习程序就不去读写这部分ram space。读写cmos的过程非常简单,读特定的index的内容只需要将index送给70h,然后就可以从71h读出对应的数据,具体过程如下述code所示:

;-------------------------------------------------------------

;     read_cmos

;     read the contents of a specific CMOS register

;     call with:      al = CMOS address to read

;     returns:        ah = Contents of register

;    used registers: ax

;-------------------------------------------------------------

read_cmos       proc    near

cli

or      al,80h ;disable NMI

out     70h, al

call    io_delay

in      al, 71h

call    io_delay

mov     ah, al

xor     al,al

out     70h,al ;enable        NMI

sti

ret

read_cmos       endp

写操作和读类似,只是要将待写入的数据送给71h即可代码如下所示:

;-------------------------------------------------------------

;    write_cmos

;    write the contents of a specific CMOS register

;    call with:      al = CMOS address to write

;                       ah = Contents of register

;    returns:       NULL

;    used registers: ax

;-------------------------------------------------------------

write_cmos       proc    near

cli

or      al,80h ;disable NMI

out     70h,al

call    io_delay

mov    al,ah

out     71h,al

call    io_delay

xor     al,al

out     70h,al ;enable        NMI

sti

ret

write_cmos       endp

另外有些细节需要注意:a.读写过程中都需要关掉中断以防止,中断处理程序访问CMOS以及RTC更新过程中可能会导致并发访问。b.NMI(non-maskable interrupt)是一种中断向量为2的中断,但是与常规中断不同的是它不能通过mask register屏蔽掉而且sti,cli指令也对它无效;NMI通常用于一些无法恢复的硬件错误,访问CMOS时也可能产生NMI,所以需要关掉。NMI可以通过70h bit7做开关。c.状态寄存器A bit7记录了RTC是否正在更新,如果正在更新则等到更新结束再去读RTC(我写的cmosdump因为偷懒没有检查这一个bitJ)。

3. Msg Based Event Driven

知道了以上的知识,我们就有能力写一个类似RU中dump cmos的工具了,下图1就是我写的cmosdump.exe:

我觉得访问cmos本身并不困难,画个UI倒是挺费劲的,一个劲狂call vbios;在完成这支tool的过程中我更深刻的体会到知识是相通的了,windows编程的经验在这里发挥了优势,为了能够动态更新,实时修改我就借鉴了windows下的“基于消息,事件驱动”的机制Mainloop->GetMsg->TranslateMsg->DispatchMsg一路下来好不快活!这部分的代码如下所示:

mainloop:

call    show_index

call    show_cmos

input_msg:

mov    ah,0

int      16h

cmp    ah,01h          ;esc

je       exit

cmp    ah,48h          ;up arrow

je       up

cmp    ah,50h          ;down arrow

je       down

cmp    ah,4bh          ;left arrow

je       left

cmp    ah,4dh          ;right arrow

je       right

call    input_byte

cmp    bl,1

jne     msg_loop

mov    ch,ah

mov    ah,0

int      16h

cmp    al,0dh           ;enter

je       enter

jmp    msg_loop

enter:

call    get_index

mov    ah,ch

mov    al,INDEX

call    write_cmos

msg_loop:

jmp    mainloop

up:

cmp    ROW,MINROW

jbe     roll_up

dec     ROW

jmp    bypass_up

roll_up:

mov    ROW,MAXROW

bypass_up:

call    set_cursor

jmp    mainloop

down:

cmp    ROW,MAXROW

jae     roll_down

inc     ROW

jmp    bypass_down

roll_down:

mov    ROW,MINROW

bypass_down:

call    set_cursor

jmp    mainloop

left:

cmp    COL,MINCOL

jbe     roll_left

sub     COL,3

jmp    bypass_left

roll_left:

mov    COL,MAXCOL

bypass_left:

call    set_cursor

jmp    mainloop

right:

cmp    COL,MAXCOL

jae     roll_right

add    COL,3

jmp    bypass_right

roll_right:

mov    COL,MINCOL

bypass_right:

call    set_cursor

jmp    mainloop

exit:

call    clr_screen

mov    ax,4c00h

int      21h

以上就是cmosdump.exe的核心架构J,完成以后觉得使用asm好别扭啊,可能是c/c++写的太多了,有点适应不过来了,以后还是要多写asm,增强驾驭asm的能力,让我的asm和c/c++一样熟练。最后开放cmosdump.exe完整的source code供有兴趣的朋友参考,source code和可执行文件在这里下载。

Enjoy it!

That’s all!

Peter

戏说BIOS之CMOS相关推荐

  1. BIOS与CMOS区别

    BIOS与CMOS区别   在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的一些说法,许多人对BIOS和CMOS经常混为一谈.本文主要阐述对BIOS设置和CMOS设置在基本 ...

  2. 学习BIOS与CMOS区别

    在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的一些说法,许多人对BIOS和CMOS经常混为一谈.本文主要阐述对BIOS设置和CMOS设置在基本概念上的区分与联系. BIO ...

  3. 计算机主板上的bios与cmos的关系是,bios cmos 关系是什么?有什么区别?

    bios大家应该都听说过,那么cmos呢?很多朋友会问这是个啥嘛,是bios的升级版吗?bios cmos 关系到底是什么?这个问题很多电脑初学者都有疑问,IT视窗小编今天整理了bios cmos 关 ...

  4. 戏说BIOS之Clock Generator

    戏说BIOS之Clock Generator   1. Introduction Clock Generator是主板上面一颗极为重要的IC,说它极为重要一点都不为过,因为Clock generato ...

  5. 计算机组装与维护三—— 认识BIOS与CMOS 、设置常用BIOS、清除CMOS参数

    计算机组装与维护三 一.认识BIOS与CMOS 二.设置常用BIOS 三.清除CMOS参数 一.认识BIOS与CMOS BIOS (Basic Input and 0utputSystem) 称为基本 ...

  6. 计算机主板上的BIOS与CMOS的,很多爱电脑的朋友都不太了解主板BIOS与CMOS,我们先来了解一下...

    大家好,我是波仔,非常高兴来跟大家一起分享电脑知识,今天我们来了解一下主板的BIOS与CMOS. 认识BIOS 与 CMOS BIOS(Basic Input-Output System,基本输入/输 ...

  7. BIOS 与 CMOS 概述

    BIOS 与 CMOS 概述 BIOS (Basic Input Output System,基本输入/输出系统)是电脑中最基础的.也是最重要的程序. 它存放在一个不需要电源的芯片中.为计算机提供最低 ...

  8. BIOS和CMOS【系统启动专文一】转载自IT之家 (wkdubhe1987)

    BIOS和CMOS 1.BIOS概述 在我们的电脑中,都有一块黑色的小芯片.但是请千万不要小看它,如果它损坏或者数据错误乱套的话,恭喜,如果不会"救回"这个小芯片,那么这台电脑可以 ...

  9. 【转】bios与CMOS有什么区别

    正确的解释应该是: BIOS是软件.是程序! CMOS是芯片.是硬件! 实际上我们是通过BIOS这个程序,去设置CMOS里的参数的. CMOS是一块芯片,集成在主板上,里面保存着重要的开机参数,而保存 ...

最新文章

  1. 高招攻略 领英助你清晰解读大数据专业
  2. find 和 findindes
  3. 随机数排列JAVA_随机数生成器,按排序顺序
  4. 在 ASP.NET 中实现会话状态的基础
  5. slow log php,善用php-fpm的慢执行日志slow log,分析php性能问题
  6. Python之HTML的解析(网页抓取一)
  7. 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
  8. Docker 快速安装 Mysql
  9. MySQL循环结构例题_Mysql:循环结构
  10. EMNLP'21 | Dialogue System 对话系统
  11. virtualbox 装win95 win98
  12. 奇妙的数字-2015省赛C语言A组第三题
  13. SQLite3-轻量级数据库
  14. webservice解析xml文件
  15. Spark问题3之SparkException:Error notifying standalone scheduler's driver endpoint
  16. java过滤汉字和英文,java判断及过滤汉字
  17. Android8.0 WIFI ap Tethering 相关知识
  18. 电脑设置鼠标光标颜色或大小时,点击之后窗口闪退
  19. idea windows找不到文件chrome
  20. 你试过吗?图像(细胞)分割

热门文章

  1. Python 常用笔记
  2. espnet使用方法_使用espnet与tacotron 2和fastspeech进行文本语音转换
  3. 一政网:公务员报考的岗位中,哪些不限专业?
  4. html回合战斗源码,unity回合制游戏战斗demo源码
  5. 电脑店u盘安装linux,电脑店如何使用u盘安装ubuntu
  6. Mac电脑删除第三方软件工具CleanMyMac X
  7. 设计之下:搜狐新闻客户端的用户体验设计
  8. c语言程序设计编程题库,C语言程序设计习题库.doc
  9. TXL C语言语法说明
  10. Python-Django毕业设计餐厅订餐系统(程序+Lw)