阅读:1333回复:9
高手请进,帮忙看一下!!
下面的一段代码在内核模式下运行,到底访问的是0x1b的物理地址还是0x1b的虚拟地址?
_asm{ push ds push eax xor eax,eax mov ds,ax mov eax,0x1b mov base,ds:[eax] pop eax pop ds } |
|
沙发#
发布于:2005-01-31 16:16
下面的一段代码在内核模式下运行,到底访问的是0x1b的物理地址还是0x1b的虚拟地址? ds == 0 是不行的 |
|
板凳#
发布于:2005-01-31 16:22
还有,我在内核模式下运行这段代码,机器就重起。是什么原因,高手能解释一下吗?
|
|
地板#
发布于:2005-01-31 16:24
ds == 0 是不行的 为什么,可否解释一下 |
|
地下室#
发布于:2005-01-31 17:18
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机
|
|
|
5楼#
发布于:2005-01-31 17:32
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机 学习ing 。。。 |
|
|
6楼#
发布于:2005-01-31 20:40
用softice的gdt命令看一下,哪些数据断可用
|
|
7楼#
发布于:2005-02-01 10:15
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机 修正一下,存取的是虚拟地址,在保护模式下,经过分段映射机制,变成线性地址,由于WINDOWS NT使用4G的直接映射,虚拟地址总等于线性地址,如果CPU如果未启动分页功能,线性地址就成为物理地址。但启动分页功能后,线性地址需要经过页表映射变为物理地址。 |
|
|
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 ); 把物理地址影射到线形地址空间来访问,或者你可以自己在页表中生成那么一项来自己实现. |
|
|
9楼#
发布于:2005-02-01 10:45
存取的是虚拟地址,在内核中也可以叫线性地址,ds=0,对应的是空描述符,x86 CPU最多可有8192个全局描述符,第一个是空的,所以不能存取,存取必然要重启计算机 不完全正确,只适用于X86-32,在X86-64中(AMD64,INTEL EM64T)中可以在驱动中通过NULL SELCTOR来访问内存的访问,详细的可以参考AMD64的手册 |
|
|