保护模式下的编程<一>

原创 2004年04月07日 14:16:00

                                         保护模式下的编程<><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

       本文介绍如何在保护模式下编程.虽然这种技术在现在的环境中很难用到,但是如果你想写操作系统,那还是要熟悉的.因为内存管理是操作系统的基础.

       保护模式下的编程我也是刚才学的,算个新人.写这遍文章是为了和大家讨论保护模式下编程的心得,如有不妥请指出来.谢谢

       386系列开始出现了保护模式,这就为支持多任务,能够快速地进行任务切换和保护任务环境提供了硬气支持. 真是一伟大的发明呀.呵呵.在保护模式下提供对不同任务的保护和同一个任务不同段的保护.我想象我拥有一个很大的内存,而程序中的代码和数据是分段存储,因此每个段就应该有个段的起始地址和段界限.,每个段应该有自己的属性.这样计算机才能控制那些操作能访问那些段,那些不能访问.所以每个段就应该有段起始地址 段界限 段属性.每一个任务都是有许多不同的段构成的.有些任务有共同的数据段或者代码段,为了节约内存空间.就需要将共同的代码段或者数据段共享.使得多个任务都能访问共享数据..这就要求系统决定那些段是共享的,那些段是私有的.所以每个段就一个特权级数,i386给段分4个级别,0 1 2 3,最常用的是0,他代表内核模式,3代表用户模式.12通常是不用的.

       因为可以同时运行多个任务,每个任务又有很多段,这样就给计算机对存取段的操作带来了麻烦,也不利后面的分页机制.因此用一个局部描述表(LDT)来描述一个任务,一个局部描述表,有许多段的描述符构成,所谓段的描述符:是一个占8个字节的空间,他用来一个存储段的起始地址,段界限和段属性。我门可以想象有个叫LDT这样表,他有许多描述符够成,每个描述符指向他对应的段。一个LDT可以构成一个段.每个系统还存在一个全局描述表(GDT),他是由共享段的描述符和许多指向局部描述表段的描述符构成的.(还有中断描述符,这里不做介绍)这样我门可以把内存中的所有段抽象出来,用几张表来表示.如图

                 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />                        

        我们已经把内存中的段用一个表给抽象出来了,那怎么从表中找到我想要的段呢,这就要通过一个叫段选择子家伙来帮忙了,他长16,底两位是用来表示特权级的,3位是用来确定是从GDT,还是从LDT中找我们需要的段,我们用TI来表示这位,TI=0指示从全局描述表GDT中读取描述符;TI=1指示从局部描述表LDT中读取描述符.段选择子的高13位就是描述符索引了.所谓描述符索引是指描述符在描述符表中的序号.这样我门通过段选择子来查找我们想要的段.是不是跟我们找书有点相同呀。呵呵.

       学过汇编的人都知道,CPU中包含有许多段寄存器,而每个段寄存器后面都有一个高速缓冲器,但我们把段的选择子存入段寄存器时,系统自动将对应的段描述符存入高速缓冲器.

然后系统根据描述符的信息去访问对应的段.这和实模式下的编程不同,在实模式下,段寄存器装的是段的地址,而在保护模式下,段寄存器中装的是段的选择子.

系统地址寄存器:

        系统地址寄存器包括:全局描述符表寄存器GDTR,局部描述符表寄存器LDTR,中断描述符表寄存器IDTR,任务状态段寄存器TR.,后两者这里不做介绍.全局描述表自己构成了一个段,我们用一个伪描述符描述他.他被装如GDTR,我门用一个结构描述他,如下.

                                                        pdesc      struc

                                                        limit     dw         0

                                                        base        dd      0

                                                        pdesc      ends

       局部描述符表寄存器LDTR规定当前任务使用的局部描述符表LDTLDTR类似于段寄存器,由程序员可见的16位的寄存器和程序员不可见的高速缓冲寄存器组成。在初始化或任务切换过程中,把描述符对应任务LDT的描述符的选择子装入LDTR,处理器根据装入LDTR可见部分的选择子,从GDT中取出对应的描述符,并把LDT的基地址、界限和属性等信息保存到LDTR的不可见的高速缓冲寄存器中。随后对LDT的访问,就可根据保存在高速缓冲寄存器中的有关信息进行合法性检查。

LDTR寄存器包含当前任务的LDT的选择子。所以,装入到LDTR的选择子必须确定一个位于GDT中的类型为LDT的系统段描述符,也即选择子中的TI位必须是0,而且描述符中的类型字段所表示的类型必须为LDT’(杨季文主编的<<80X86汇编语言程序设计教材>> (待续....)

 

 

 

 

 

 

 

 

 

保护模式编程

随着80386微处理器体系结构的重大变化,它的指令系统也得到了增强和补充,x86的发展进入了保护模式阶段。首先,介绍一下新增加的一些指令: 一、新增高级语言指令 1. PUSHA/POPA...
  • yunsongice
  • yunsongice
  • 2010年10月06日 23:29
  • 1610

保护模式编程——保护的详尽意义:通过调用门转移特权级

保护模式及其编程——保护机制 摘要:在汇编语言的编程和操作系统的编写过程中,我们经常能听说到“保护模式”这个名词。为什么要叫“保护模式”呢?保护 二字的含义何在?本文主要探讨,“保护模式”下面各种具体...
  • trochiluses
  • trochiluses
  • 2014年02月20日 22:14
  • 2949

进入保护模式(三)

(十)保护模式下的栈 76 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 77 mov cx,00000000000_11_000B ...
  • bfboys
  • bfboys
  • 2016年09月01日 09:38
  • 574

汇编学习笔记之实模式/保护模式区别

2.1 模式种类     从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在保护模式。  ...
  • u012151242
  • u012151242
  • 2016年03月01日 10:35
  • 905

解决插件在IE增强保护模式下无法运行的问题

这篇博客本来去年底就应该写的了,但是yi
  • vaintwyt
  • vaintwyt
  • 2014年12月20日 15:56
  • 8939

保护模式——从分段到分页

保护模式——从分段到分页    其实很早以前就想写这个关于分页模式的了,可是自己还是有点东西没弄的太明白,今天也是终于写出来了,关于上一篇讲分段机制的,一博友还夸了我一下,另我有点...
  • haiross
  • haiross
  • 2016年03月28日 09:58
  • 854

保护模式编程——保护的详尽意义:通过调用门转移特权级

保护模式及其编程——保护机制 摘要:在汇编语言的编程和操作系统的编写过程中,我们经常能听说到“保护模式”这个名词。为什么要叫“保护模式”呢?保护 二字的含义何在?本文主要探讨,“保护模式”下面各种具体...
  • trochiluses
  • trochiluses
  • 2014年02月20日 22:14
  • 2949

[Intel汇编-NASM]进入保护模式全过程

org 0x7C00 ; 该命令表示程序将被装在到偏移地址为0x7C00的地方 ; 该命令效果是全局的,但只...
  • Lirx_Tech
  • Lirx_Tech
  • 2015年01月26日 16:57
  • 1506

DG保护模式--3种

三种:最大保护、最大性能、最高可用。 1.最大保护: 如果主数据库失败,这个保护模式可以保证没有任何数据丢失。事务在完成提交之前,事务恢复需要的redo数据必须写到主数据库的联机redo日...
  • ghostliming
  • ghostliming
  • 2016年02月11日 20:56
  • 1929

关于从保护模式切换到实模式的相关说明

关于为什么不能从32位的保护模式直接跳转到实模式,而要先跳转到16位的保护模式,再从16位的保护模式跳转到实模式的理解 ;****************注意在此用normal选择子对段寄存器进行...
  • lingqi1818
  • lingqi1818
  • 2014年06月16日 09:50
  • 476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:保护模式下的编程<一>
举报原因:
原因补充:

(最多只允许输入30个字)