ichabod
驱动牛犊
驱动牛犊
  • 注册日期2004-12-08
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1956回复:12

请问win2k下如何访问4GB内存的顶端?

楼主#
更多 发布于:2004-12-13 22:16
rt,也就是要访问BIOS地址译码的位置,DOS下是可以用FlatRealMode访问的,但在Win2K下有诸多问题。有哪位大侠之前做过类似工作或是知道的还望不吝赐教,在此先谢过了
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
沙发#
发布于:2004-12-14 09:56
访问....

读很容易...
写就不容易了...因为bios会设置某段rom读发是读rom.写却是写ram...或者其他...

所以用通常的方式读写...并不一定保证你就是读的真正的bios...

不过呢...是有办法作到的...
就是现在比较流行的winflash一类的程序....

通过读写一个特殊的port(其实是两个)能读取跟写入bios...

首先你要找到这个port...
方式很简单...搜索f0000 到 fffff的物理内存...寻找@$AWDFLASH的字符串....找到了以后从字符串开始的2A offset的地方的word就是这个port值

读的时候...
esi = 物理地址
edx = port
al = 0x28

out edx,al
out 0xeb,al
eax,ecx,edx,ebx 从低到高4个dword放结果...

写的时候
ebx,ecx,eax 高16位,edx 高16位,esi从低到高放4个dword
dx = port
ax = 0x2f
out dx,ax

以上
ichabod
驱动牛犊
驱动牛犊
  • 注册日期2004-12-08
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-22 17:01
更想知道通用的做法,君上所述方法仅适用于AWARD的BIOS,对AMI的就不能那样用了啊.
ichabod
驱动牛犊
驱动牛犊
  • 注册日期2004-12-08
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-22 17:06
我知道SOFTICE的PEEK命令可以查看4GB顶端BIOS容量/2的物理地址,而且这部分地址没有对应的线性地址(PHYS命令).
或者我的问题换个方式问:哪位达人可以告知SOFTICE的PEEK是怎样实现的,或者给个思路也行.有劳各位.
linhf
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2006-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-22 21:55
先进入ring0,然后。。。。。
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
5楼#
发布于:2004-12-23 19:04
以上方法对于ami得bios有部分也是通用得....

读取物理地址很容易...
不外忽就是加入一个地址映射而已....
但是这并不能保证访问到得物理地址一定就是bios得rom..
明白么..很可能被shadow到了你得内存ram....
都知道bios设置里面能指定shadow得吧....

但是...你要知道....
不管是谁...softice也好..windows也要...
要做到真正得读写到bios....
必须要跟北桥南桥以及mttr打交道...
必须要设置他们关上上面得shadow功能
这种方法得局限就是
每个型号得主板都可能要有一份代码...
想在不考虑北桥南桥得基础上读写到bios
还是我上面给得那个方法管用...
ichabod
驱动牛犊
驱动牛犊
  • 注册日期2004-12-08
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-26 20:32
访问4GB地址顶端的一种方法是用MmMapIoSpace,通常BIOS有一部份是可以之间访问的,要做到完全访问当然要参照南桥的说明打开保护才行
问题解决,自己re自己一下
tiamo兄的方法不适用于老的芯片老的Bios,但对比较新的Bios还是很好用的(很通用的),多谢答复
daigaohui
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-06 15:19
我在dos下读BIOS ROM映射的memory,结果发现bin file真的是有问题。用winhex比较,发现是中间有好几段读到的内容有误。是不是就是shadow没有关闭啊?我查了芯片组的datasheet,但是找不到相关的寄存器啊?请兄台指点
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-06 16:18
可以制作一个核心驱动,BIOS的位置一般如果在BIOS中设置shadow的话,他被映射到物理内存e0000-fffff的位置,如果用SOFTICE察看GDT描述符表时,好像有3个映射到这块地址,可以利用它来传送数据。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
daigaohui
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-06 19:01
我想做的目前仅仅是在dos protect mode下读取bios rom中的数据,我所做的就是读FFF80000~FFFFFFFF之间的数据。但是读出数据中有几个数据块跟rom中的数据不符合,我用ru读,里面的数据都跟rom一致,为什么我读就有不对了呢,是不是还需要注意什么啊?
ichabod
驱动牛犊
驱动牛犊
  • 注册日期2004-12-08
  • 最后登录2007-08-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-07 09:13
hi,daigaohui,可以将问题讲得更清楚一些吗?你说有几个数据块不同,那是几个?分别在什么位置上?ru是什么?
daigaohui
驱动牛犊
驱动牛犊
  • 注册日期2004-02-12
  • 最后登录2008-11-12
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-07 10:08
问题已经解决了,是我定义的数组太大了的缘故造成的。ru是ami出的debug工具啦。不过现在我的只能在ami的环境中使用,在Award下就全错了,郁闷
mimosa
驱动牛犊
驱动牛犊
  • 注册日期2004-12-10
  • 最后登录2008-09-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-03-10 11:27
请问ichabod和tiamo兄,你对于AMI bios 在win2000下的高端地址读写都解决了么,那种通过SMI端口(28,29)好像只有针对AWARD的bios才有效果吧,而且还必须是严格遵循smbios规范才可以,对有ami该如何操作,小弟还想请教一二!
游客

返回顶部