milewang
驱动牛犊
驱动牛犊
  • 注册日期2004-11-11
  • 最后登录2005-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1332回复:9

高手请进,帮忙看一下!!

楼主#
更多 发布于:2005-01-31 16:14
下面的一段代码在内核模式下运行,到底访问的是0x1b的物理地址还是0x1b的虚拟地址?
_asm{

push ds
push eax
xor eax,eax
mov ds,ax
mov eax,0x1b
mov base,ds:[eax]
pop eax
pop ds
}
wuyanfeng
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2011-05-06
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望127点
  • 贡献值0点
  • 好评度103点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-31 16:16
下面的一段代码在内核模式下运行,到底访问的是0x1b的物理地址还是0x1b的虚拟地址?
_asm{

push ds
push eax
xor eax,eax
mov ds,ax
mov eax,0x1b
mov base,ds:[eax]
pop eax
pop ds
}

ds == 0 是不行的
milewang
驱动牛犊
驱动牛犊
  • 注册日期2004-11-11
  • 最后登录2005-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-31 16:22
还有,我在内核模式下运行这段代码,机器就重起。是什么原因,高手能解释一下吗?
milewang
驱动牛犊
驱动牛犊
  • 注册日期2004-11-11
  • 最后登录2005-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-31 16:24
ds == 0 是不行的

为什么,可否解释一下
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-31 17:18
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-31 17:32
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机


学习ing 。。。
在交流中学习。。。
freshwt
驱动牛犊
驱动牛犊
  • 注册日期2002-08-19
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-31 20:40
用softice的gdt命令看一下,哪些数据断可用
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-02-01 10:15
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机

修正一下,存取的是虚拟地址,在保护模式下,经过分段映射机制,变成线性地址,由于WINDOWS NT使用4G的直接映射,虚拟地址总等于线性地址,如果CPU如果未启动分页功能,线性地址就成为物理地址。但启动分页功能后,线性地址需要经过页表映射变为物理地址。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2005-02-01 10:43
首先你的目的是什么??
我想应该是0x1b的物理地址,也就是说你这段程序应该在实模式下运行,DOS下应该可以,但你应该用16位指令.
在WINDOWS下如果要访问可以通过MmMapIoSpace
The MmMapIoSpace routine maps the given physical address range to nonpaged system space.

PVOID
  MmMapIoSpace(
    IN PHYSICAL_ADDRESS  PhysicalAddress,
    IN ULONG  NumberOfBytes,
    IN MEMORY_CACHING_TYPE  CacheType
    );
把物理地址影射到线形地址空间来访问,或者你可以自己在页表中生成那么一项来自己实现.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2005-02-01 10:45
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机


不完全正确,只适用于X86-32,在X86-64中(AMD64,INTEL EM64T)中可以在驱动中通过NULL SELCTOR来访问内存的访问,详细的可以参考AMD64的手册
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部