Category Archives: Operating System

实模式切换到保护模式

代码是从于渊的书上抄过来的,不过书的注释简单得实在不行,加上汇编都差不多给回学校了,看了好几遍才把这些代码看透。看到虚拟机的屏幕上输出个”P”感觉不错 :) 。 从实模式到保护模式一般的过程为: 建立起合适的全局描述符表。 用lgdt加载GDTR,使GDTR指向GDT。 打开A20地址线。PC及其兼容机的第20根地址线较特殊,计算机系统中一般安排一个“门”控制该地址线是否有效。为了访问地址在1M以上的存储单元,应先打开控制地址线A20的“门”。这种设置与实方式下只使用最的1M字节存储空间有关,与处理器是否工作在实方式和保护方式无关,即使在关闭地址线A20时,也可进行保护方式。 置cr0的PE位。PE位为1表示运行在保护模式,为0表示运行在实方式。 跳转,进入保护模式。

Posted in Operating System | 1 Comment

一致代码段与特权级

一、一致代码段与非一致代码段 “一致”的意思大约是这样,当转移的目标是一个特权级更高的一致代码段时,当前的特权级会被延续下去,而向特权级更高的非一致代码段的转移则会引起常规的保护异常,除非使用调用门或者任务门。一致代码段往往是用在内核共享的段,这些段是允许应用程序去访问的,而不需要内核转移到应用程序中来访问这些共享的资源。对于一致代码段,有以下规则: 特权级高的程序不允许访问特权级低的数据。比如,核心态不允许调用用户态的数据。 特权级低的程序可以访问到特权级高的数据,但是访问程序的特权级不会发生变化。比如,用户态访问内核态共享的资源时,不会变成内核态。 而对于非一致代码段,则有着不同的规则: 只允许同级访问。 绝对禁止不同级程序访问。即内核态不能访问用户态,用户态也不能访问内核态。 之所以这么做是为了系统的安全性考虑,分离内核和用户程序,使内核不能被用户程序干涉,同时避免使用户态程序修改内核态的逻辑,导致在内核态下执行用户程序的代码。上面所说的是代码段,而数据段则全都是非一致的,这意味着不可能被低特权级的代码访问到。然而,与代码段不同的是,数据段可以被更高特权级的代码访问到,而不需要使用特定的门。规则总如如下: 特权级 低->高 特权级 高->低 特权级 同级之间 适用于何种代码 一致代码段 Yes No Yes 不访问受保护的资源和某些类型的异常处理的系统代码 非一致代码段 No No Yes 避免低特权级的程序访问而被保护起来的系统代码 数据段 (总是非一致) No Yes Yes

Posted in Operating System | Leave a comment

保护模式

一、保护模式简述 在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享以能保证代码及数据的安全和保密、及任务的隔离。 80386采用称为描述符(descriptor)的数据来描述段的位置、大小和使用情况。虚拟存储器的地址(逻辑地址)由指示描述符的选择子(selector)和段内偏移两部分构成,这样的地址集合称为虚拟地址空间,但要注意的是,这与实模式下的段值+偏移量来获取物理地址是不同的。在保护模式下,由选择子和段内偏移计算出来的只是虚拟地址,需要将虚拟地址转换成实际的物理地址。 地址映射转换示意

Posted in Operating System | Leave a comment