热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

保护模式下的编程<一>

保护模式下的编程<一>本文介绍如何在保护模式下编程.虽然这种技术在现在的环境中很难用到,但是

                                         保护模式下的编程<>

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

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

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

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

                 

                        

        我们已经把内存中的段用一个表给抽象出来了,那怎么从表中找到我想要的段呢,这就要通过一个叫段选择子家伙来帮忙了,他长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汇编语言程序设计教材>> (待续....)

 

 

 

 

 

 

 

 

 


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 解决PR倒放后视频卡顿的方法及操作步骤
    本文介绍了解决PR倒放后视频卡顿问题的方法,通过标记入点和出点,并进行渲染,可以有效解决视频卡顿的情况。详细的操作步骤包括:继续播放视频,标记入点和出点,选择渲染效果,等待渲染完成,清除标记等。通过理论与实践的结合,可以更好地帮助大家解决PR倒放后视频卡顿的问题。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 测绘程序设计Excel度分秒转换模板附代码超实用版
    本文介绍了测绘程序设计Excel度分秒转换模板附代码超实用版的相关知识,包括准备工作、编写表达式和注意事项。在实际工作中,将GPS实测的经纬度度转换为度分秒是常见需求,本文提供了在Excel中快速进行转换的方法,以提高工作效率。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
author-avatar
詹旭萌鸡蛋_544
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有