注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

15章习题二  

2013-04-25 09:48:47|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

修改本章源程序,使之能够顺序完成以下工作:
① 从程序管理器任务切换到任务A,显示一条消息;
② 再从任务A转换到任务B,显示一条消息;
③ 从B直接返回到程序管理器任务.

题目分析:

任务A在显示消息以后,要转换到任务B去执行,而任务B在显示消息以后,直接返回到任务管理器,
任务A与任务B的执行流程是不相同的,所以不能是同一个程序的副本.

我们可以把书中的用户程序源代码修改一下做为任务A,依旧存放在硬盘50扇区,因为任务B是直接
返回程序管理器任务,所以书中的用户程序源代码可以不用修改直接做为任务B,但我们把任务B放
在55扇区.

要从任务A直接转换到任务B,那么任务A可以使用call far tss选择子 或者 jmp far tss选择子
的方式来切换到任务B,在任务A中是无法直接获得任务B的tss选择子的,任务B是由任务管理器来
进行加载的,tss选择子保存在任务B的TCB中,任务A是无法访问的,但我们可以由任务管理器把任
务B的TSS选择子存放在任务A的用户程序头部,这样任务A就可以通过访问自己的头部来获得任务
B的TSS选择子,从而切换到任务B.

接下来,我们还要注意以下细节:

程序管理器在加载用户程序任务时,创建的TSS选择子,其DPL是0,在任务切换时,要求CPL,RPL与DPL
在数值上满足CPL<=DPL,RPL<=DPL,任务A的CPL是3,而任务B的TSS描述符的DPL是0,这样是不允许的,
所以我们要修改内核代码,创建TSS描述符时,把DPL改为3.


使用call far 还是 jmp far ?

如果在程序管理器任务中使用call far 切换到任务A执行,则任务A也得用call far 切换到任务B
执行,然后任务B通过调用门进入0特权级的代码执行时,会使用iretd返回到任务A,任务A再使用
iretd返回到程序管理器任务.

如果要求B直接返回程序管理器任务,而不是返回到任务A,再由任务A返回到程序管理器任务,那么只
能使用jmp far方式.

程序管理器通过jmp far 切换到任务a执行,任务a通过jmp far切换到任务b执行,任务B通过调用门
进入0特权级的代码,然后通过jmp 方式回到程序管理器任务.


程序代码修改:
--------------------------------------------------------------------------------------
用户程序任务A:
=====================================================================================
把 call far [fs:TerminateProgram] 返回程序管理器任务的语句修改为切换到任务B的语句:

jmp far [fs:0] ;由程序管理器任务在切换到任务A之前把任务B的TSS选择子填写到任务A的头部
;0x4的位置.

用户程序任务B:
=====================================================================================
无需任何修改,直接用书中的用户程序源代码. 把编译后的文件写到硬盘55扇区.


内核代码修改:
=====================================================================================
子例程load_relocate_program,创建TSS描述符部分,在802行左右.

把 mov ecx,0x00408900 (;TSS描述符,特权级0) 修改为:
mov ecx,0x0040e900 ;把TSS描述符特权级修改为3

程序管理器加载任务A与任务B部分:

在加载任务A以后,去掉切换到任务A的语句 call far [es:ecx+0x14] ,继续加载任务B.

加载任务B时,push dword 50 修改为push dword 55,因为任务B存放在硬盘55扇区

加载任务B以后,添加以下语句:

mov eax,[tcb_chain] ;EAX指向任务A的TCB
mov ebx,[es:eax+0x06] ;EBX=任务A加载基地址
mov cx,[es:ecx+0x18] ;CX=任务B的TSS选择子
mov [es:ebx+0x4],cx ;把任务B的TSS选择子填写到任务A的头部0x4字节处.
jmp far [es:eax+0x14] ;跳转到任务A执行

  评论这张
 
阅读(36)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017