ghshgh
驱动牛犊
驱动牛犊
  • 注册日期2002-05-22
  • 最后登录2003-11-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1321回复:4

关于虚拟机

楼主#
更多 发布于:2002-03-27 14:24
你好!
最近学习VM有几个问题一直弄不清楚,想请大家请教一下!
1。发生中断时CPU的几个寄存器的值被存到堆栈中,IRET通过堆栈的值
确定被中断程序的执行线路。为什么书上说通过VM的REG可以修改被中断程序的执行线路?
2。为什么在候捷译的那本关vxd的书上说一个VM同时有V86模式和保护模式两个线程?一个VM不是同时有多个V86模式或保护模式线程吗?
总之关于VM的寄存器我有很多问题都不是很清楚,能不能详细全面给我说一下。

谢谢!!!
谢谢!!!
谢谢!!!
谢谢!!!
 

最新喜欢:

flyfoxflyfox
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-28 09:22
    虚拟机是Windows操作系统对系统资源的一种抽象,使得运行在前系统中的每一个线程都认为它独自全部或部分占有系统资源,从而实现多责任。同时,每个DOS线程(V86)都对应一个VM,而所有的Win32中的所有线程共享一个VM―System VM。之所以这样设计是因为Windows是一个多任务的操作系统,而DOS是一个单任务的操作系统。
    每个虚拟机都保存了一种数据结构叫做Client Register Structure,客户寄存器结构,它真实地记载了当前线程的寄存器的值,也是它使得每个任务的状态得以在任务切换进度得以保存。
    下面是一个完整的CRS
Client_Reg_Struc STRUC

Client_EDI DD ?
Client_ESI DD ?
Client_EBP DD ?
Client_res0 DD ?
Client_EBX DD ?
Client_EDX DD ?
Client_ECX DD ?
Client_EAX DD ?
Client_Error DD ?
Client_EIP DD ?
Client_CS DW ?
Client_res1 DW ?
Client_EFlags DD ?
Client_ESP DD ?
Client_SS DW ?
Client_res2 DW ?
Client_ES DW ?
Client_res3 DW ?
Client_DS DW ?
Client_res4 DW ?
Client_FS DW ?
Client_res5 DW ?
Client_GS DW ?
Client_res6 DW ?
Client_Alt_EIP DD ?
Client_Alt_CS DW ?
Client_res7 DW ?
Client_Alt_EFlags DD ?
Client_Alt_ESP DD ?
Client_Alt_SS DW ?
Client_res8 DW ?
Client_Alt_ES DW ?
Client_res9 DW ?
Client_Alt_DS DW ?
Client_res10 DW ?
Client_Alt_FS DW ?
Client_res11 DW ?
Client_Alt_GS DW ?
Client_res12 DW ?

Client_Reg_Struc ENDS
    同时,当特定的VXD被调用时,线程的CRS指针被放在EBP寄存器中,CRS指出了该线程所有的必须的数据结构存放地点。

   Best regards !

Tom_lyd
matt
驱动中牛
驱动中牛
  • 注册日期2001-07-24
  • 最后登录2016-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-28 09:27
建议你先把\"保护模式\"好好看看。
System Internals http://sys.xiloo.com
ghshgh
驱动牛犊
驱动牛犊
  • 注册日期2002-05-22
  • 最后登录2003-11-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-29 13:56
上上面的那位兄弟,谢谢你的回答!但是你没有回答我要问的问题
好像crs并不是存的它真实地记载了当前线程的寄存器的值。他好像是在中断时保存的值,当中断发生时VMM会保存这些值。我问的是:
1。发生中断时CPU的几个寄存器的值被存到堆栈中,IRET通过堆栈的值
确定被中断程序的执行线路。为什么书上说通过VM的REG可以修改被中断程序的执行线路?
2。为什么在候捷译的那本关vxd的书上说一个VM同时有V86模式和保护模式两个线程?一个VM不是同时有多个V86模式或保护模式线程吗?
yanghui
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2009-10-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-29 16:43
Tom_lyd已说的很清楚了,只要修改了CRS结构中的Client_ESP/Client_EIP等的值,就能改变被中断程序的执行路径,因为这涉及到一个内核态/用户态的转换,内核(VMM)会将用户态程序的寄存器值保存CRS结构中,作为从内核到用户态切换回来用,改之就会对应用程序有影响,你说的只是中断发生时对现场的保护(EFLAGS,EIP...),并没有涉及到内核/用户态的切换,当然,也可以改,但很危险,你可用SOFT-ICE跟踪一下,执行到IRET时,看看ESP指向内存中的数据,执行完IRET时,ESP的变化情况,再尝试修改ESP指向内存中的数据,然后再执行IRET指令,又会有什么不同....
游客

返回顶部