戏说BIOS之CMOS
戏说BIOS之CMOS
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相关推荐
- BIOS与CMOS区别
BIOS与CMOS区别 在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的一些说法,许多人对BIOS和CMOS经常混为一谈.本文主要阐述对BIOS设置和CMOS设置在基本 ...
- 学习BIOS与CMOS区别
在日常操作和维护计算机的过程中,常常可以听到有关BIOS设置和CMOS设置的一些说法,许多人对BIOS和CMOS经常混为一谈.本文主要阐述对BIOS设置和CMOS设置在基本概念上的区分与联系. BIO ...
- 计算机主板上的bios与cmos的关系是,bios cmos 关系是什么?有什么区别?
bios大家应该都听说过,那么cmos呢?很多朋友会问这是个啥嘛,是bios的升级版吗?bios cmos 关系到底是什么?这个问题很多电脑初学者都有疑问,IT视窗小编今天整理了bios cmos 关 ...
- 戏说BIOS之Clock Generator
戏说BIOS之Clock Generator 1. Introduction Clock Generator是主板上面一颗极为重要的IC,说它极为重要一点都不为过,因为Clock generato ...
- 计算机组装与维护三—— 认识BIOS与CMOS 、设置常用BIOS、清除CMOS参数
计算机组装与维护三 一.认识BIOS与CMOS 二.设置常用BIOS 三.清除CMOS参数 一.认识BIOS与CMOS BIOS (Basic Input and 0utputSystem) 称为基本 ...
- 计算机主板上的BIOS与CMOS的,很多爱电脑的朋友都不太了解主板BIOS与CMOS,我们先来了解一下...
大家好,我是波仔,非常高兴来跟大家一起分享电脑知识,今天我们来了解一下主板的BIOS与CMOS. 认识BIOS 与 CMOS BIOS(Basic Input-Output System,基本输入/输 ...
- BIOS 与 CMOS 概述
BIOS 与 CMOS 概述 BIOS (Basic Input Output System,基本输入/输出系统)是电脑中最基础的.也是最重要的程序. 它存放在一个不需要电源的芯片中.为计算机提供最低 ...
- BIOS和CMOS【系统启动专文一】转载自IT之家 (wkdubhe1987)
BIOS和CMOS 1.BIOS概述 在我们的电脑中,都有一块黑色的小芯片.但是请千万不要小看它,如果它损坏或者数据错误乱套的话,恭喜,如果不会"救回"这个小芯片,那么这台电脑可以 ...
- 【转】bios与CMOS有什么区别
正确的解释应该是: BIOS是软件.是程序! CMOS是芯片.是硬件! 实际上我们是通过BIOS这个程序,去设置CMOS里的参数的. CMOS是一块芯片,集成在主板上,里面保存着重要的开机参数,而保存 ...
最新文章
- 高招攻略 领英助你清晰解读大数据专业
- find 和 findindes
- 随机数排列JAVA_随机数生成器,按排序顺序
- 在 ASP.NET 中实现会话状态的基础
- slow log php,善用php-fpm的慢执行日志slow log,分析php性能问题
- Python之HTML的解析(网页抓取一)
- 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
- Docker 快速安装 Mysql
- MySQL循环结构例题_Mysql:循环结构
- EMNLP'21 | Dialogue System 对话系统
- virtualbox 装win95 win98
- 奇妙的数字-2015省赛C语言A组第三题
- SQLite3-轻量级数据库
- webservice解析xml文件
- Spark问题3之SparkException:Error notifying standalone scheduler's driver endpoint
- java过滤汉字和英文,java判断及过滤汉字
- Android8.0 WIFI ap Tethering 相关知识
- 电脑设置鼠标光标颜色或大小时,点击之后窗口闪退
- idea windows找不到文件chrome
- 你试过吗?图像(细胞)分割
热门文章
- Python 常用笔记
- espnet使用方法_使用espnet与tacotron 2和fastspeech进行文本语音转换
- 一政网:公务员报考的岗位中,哪些不限专业?
- html回合战斗源码,unity回合制游戏战斗demo源码
- 电脑店u盘安装linux,电脑店如何使用u盘安装ubuntu
- Mac电脑删除第三方软件工具CleanMyMac X
- 设计之下:搜狐新闻客户端的用户体验设计
- c语言程序设计编程题库,C语言程序设计习题库.doc
- TXL C语言语法说明
- Python-Django毕业设计餐厅订餐系统(程序+Lw)