Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357735
  • 博文数量: 38
  • 博客积分: 1935
  • 博客等级: 上尉
  • 技术积分: 724
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-23 16:34
文章存档

2010年(4)

2009年(33)

2008年(1)

分类:

2009-05-03 23:58:48

  当程序中使用指令 call / jmp,以及通过 int 引发中断例程的执行,这将都是对目标的 code segment 进行访问,当通过权限的检查后程序将会跳转到目标的 code segment 进行执行。
  在 code segment 的访问过程中涉及到权限级别的改变,stack 的改变等问题。


访问目标 code segment 的几种情形:

1、call / jmp offset 
  在段内直接 call / jmp,不改变目标 code segment

2、call / jmp code_selector:offset 
  直接 call / jmp 目标 code segment

3、call / jmp callgate_selector:offset 
  使用 call gate 的 call / jmp 形式

4、call / jmp tss_selector:offset  
  使用 TSS gate 的直接 call / jmp 形式,使用了 TSS 任务切换机制

5、call / jmp taskgate_selector:offset
  通过 task gate 使用 TSS 任务切换机制

6、int n
  使用 int 指令调用 interrupt / trp 例程,或者 task gate 提供的任务切换机制

7、使用 syscall / sysret、 sysenter / sysexit 指令快速调用系统服务例程

8、ret 或 iret
  利用 ret 以及 iret 指令构造另一种访问 code segment 的途径。


  以上是程序中主动发起访问目标 code segment 大多数方法,在继续执行之前,processor 会进行一系统的检查,包括相关的权限检查、type 检查、limit 检查等,通过了检查后,加载到 cs:rip 后继续执行。
阅读(1206) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

storen2015-01-09 13:08:24

学习了