10.3 Switching to Protected Mode 

切换到保护模式

Setting the PE bit of the MSW in CR0 causes the 80386 to begin executing in protected mode. The current privilege level (CPL) starts at zero. The segment registers continue to point to the same linear addresses as in real address mode (in real address mode, linear addresses are the same physical addresses).

设置CR0中的MSW的PE位将导致80386开始在保护模式下执行。当前特权级别(CPL)开始时为0。段寄存器继续指向一个和实地址模式下相同的线性地址(在实地址模式中,线性地址与物理地址相同)。

Immediately after setting the PE flag, the initialization code must flush the processor's instruction prefetch queue by executing a JMP instruction. The 80386 fetches and decodes instructions and addresses before they are used; however, after a change into protected mode, the prefetched instruction information (which pertains to real-address mode) is no longer valid. A JMP forces the processor to discard the invalid information.

设置PE标志后,初始化代码必须通过执行一个JMP指令来刷新处理器的指令预取序列。80386取到并编码指令并在使用前进行寻址;然而,在进入保护模式后,预取的指令信息(与实地址模式有关)不再有效。JMP强制处理器抛弃无效的信息。

10.4 Software Initialization for Protected Mode 

保护模式的软件初始化

Most of the initialization needed for protected mode can be done either before or after switching to protected mode. If done in protected mode, however, the initialization procedures must not use protected-mode features that are not yet initialized.

大部分保护模式需要的初始化即可在切换到保护模式之前做,也可以在切换后做。如果在保护模式中做,初始化程序必须不使用保护模式的特性,因为他们还没有被初始化。

10.4.1 Interrupt Descriptor Table 中断描述符表

The IDTR may be loaded in either real-address or protected mode. However, the format of the interrupt table for protected mode is different than that for real-address mode. It is not possible to change to protected mode and change interrupt table formats at the same time; therefore, it is inevitable that, if IDTR selects an interrupt table, it will have the wrong format at some time. An interrupt or exception that occurs at this time will have unpredictable results. To avoid this unpredictability, interrupts should remain disabled until interrupt handlers are in place and a valid IDT has been created in protected mode.

IDTR即可在实地址模式装入也可以在保护模式中装入。然而,保护模式下中断表的格式与实地址模式下的不同。切换保护模式和修改中断表格式不能同时进行;因此,如果IDTR选择一个中断表,它在某个时段将有一个错误的格式,这是不可避免的。在这个时刻发生的中断或异常将引发不可预知的结果。为避免这种不可预知的问题,中断应当保持关闭状态,直到中断处理程序被放置,并且一个有效的IDT已经在保护模式下创建好。

10.4.2 Stack 栈

The SS register may be loaded in either real-address mode or protected mode. If loaded in real-address mode, SS continues to point to the same linear base-address after the switch to protected mode.

SS寄存器即可以在实模式下也可以在保护模式下装入。如果在实模式下装入,在切换到保护模式后,SS继续指向同一个线性基址。

10.4.3 Global Descriptor Table 全局描述符表

Before any segment register is changed in protected mode, the GDT register must point to a valid GDT. Initialization of the GDT and GDTR may be done in real-address mode. The GDT (as well as LDTs) should reside in RAM, because the processor modifies the accessed bit of descriptors.

保护模式中任何段寄存器在被修改前,GDT寄存器必须指向一个有效的GDT。GDT和GDTR要在实模式中初始化。GDT(此外LDT也一样)应当保存在RAM中,因为处理器会修改描述符中的访问位。

10.4.4 Page Tables 页表

Page tables and the PDBR in CR3 can be initialized in either real-address mode or in protected mode; however, the paging enabled (PG) bit of CR0 cannot be set until the processor is in protected mode. PG may be set simultaneously with PE, or later. When PG is set, the PDBR in CR3 should already be initialized with a physical address that points to a valid page directory. The initialization procedure should adopt one of the following strategies to ensure consistent addressing before and after paging is enabled:

页表和CR3中的PDBR可以实模式中或保护模式中初始化;然而,CR0的分页启用位(PG)直到处理器工作在保护模式中下才能设置。当设置PG时,CR3中的PDBR应当已经使用物理地址初始化过,并且指向一个有效的页目录。初始化程序应当采取下面的策略之一来确保分页启用之前与之后连续处理:

  • The page that is currently being executed should map to the same physical addresses both before and after PG is set.

设置PG之前与之后,当前执行的页应当映射到同一个物理地址。

  • JMP instruction should immediately follow the setting of PG.

设置PG后,应当马上个JMP指令。

10.4.5 First Task 第一个任务

The initialization procedure can run awhile in protected mode without initializing the task register; however, before the first task switch, the following conditions must prevail:

在没有初始化任务寄存情况下,初始化程序可以在保护模式中执行片刻;然而,切换到第一个任务之前,下列条件必须满足:

  • There must be a valid task state segment (TSS) for the new task. The stack pointers in the TSS for privilege levels numerically less than or equal to the initial CPL must point to valid stack segments.

新任务必须有一个有效的任务状态段(TSS)。TSS中的栈指针必须指向一个有效的栈段,该TSS的特权级别在数值上必须小于或等于初始CPL。

  • The task register must point to an area in which to save the current task state. After the first task switch, the information dumped in this area is not needed, and the area can be used for other purposes.

任务寄存器必须指向一个用来保存当前任务状态的区域。在切换到第一个任务后,取出这个区域的信息不是必须的,这个区域可以用做其他目的。

【译】x86程序员手册39-10.3切换到保护模式的更多相关文章

  1. 【译】x86程序员手册26-7.5任务切换

    7.5 Task Switching 任务切换 The 80386 switches execution to another task in any of four cases: 80386在以下四 ...

  2. 【译】x86程序员手册01

    Intel 80386 Reference Programmer's Manual 80386程序员参考手册 Chapter 1 -- Introduction to the 80386 第1章 - ...

  3. 【译】x86程序员手册10 - 第4章系统架构

    1.1.2 Part II -- Systems Programming 系统编程 This part presents those aspects of the architecture that ...

  4. 【译】x86程序员手册38-10.2实在址模式下的软件初始化

    10.2 Software Initialization for Real-Address Mode   实地址模式的软件初始化 In real-address mode a few structur ...

  5. 【译】x86程序员手册31- 第9章 异常和中断

    Chapter 9 Exceptions and Interrupts 第9章 异常和中断 Interrupts and exceptions are special kinds of control ...

  6. 【译】x86程序员手册11- 4.1系统寄存器

    4.1 Systems Registers 系统寄存器 The registers designed for use by systems programmers fall into these cl ...

  7. 【译】x86程序员手册09-第3章程序指令集

    注:觉得本章内容与理解操作系统不直接相关,所以本章并未看完,也就没有翻译完,放在这里中是为了保证手册的完整.有兴趣的人可以去原址查看. https://pdos.csail.mit.edu/6.828 ...

  8. 【译】x86程序员手册03 - 2.1内存组织和分段

    2.1 Memory Organization and Segmentation 内存组织和分段 The physical memory of an 80386 system is organized ...

  9. 【译】x86程序员手册02 - 基本的程序模式

    Chapter 2 -- Basic Programming Model: 基本的程序模式 Introduces the models of memory organization. Defines ...

随机推荐

  1. 创建GitHub技术博客全攻略【转】

    本文转载自:http://blog.csdn.net/renfufei/article/details/37725057/ 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比 ...

  2. POJ - 1470 Closest Common Ancestors(离线Tarjan算法)

    1.输出测试用例中是最近公共祖先的节点,以及这个节点作为最近公共祖先的次数. 2.最近公共祖先,离线Tarjan算法 3. /* POJ 1470 给出一颗有向树,Q个查询 输出查询结果中每个点出现次 ...

  3. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  4. AppiumLibrary用户关键字

    *** Settings *** Library AppiumLibrary Library AutoItLibrary Library os *** Keywords *** xpath应该匹配次数 ...

  5. 设计模式-COMMOND PATTERN (ACTIVE OBJECT PATTERN是一种特殊的COMMOND PATTERN)

    复用控制逻辑. 理解方式:Controller 获取到Light TeleVision Computer中的一个的对像,通过Icommond接口作用于它. ACTIVE OBJECT模式: class ...

  6. [App Store Connect帮助]七、在 App Store 上发行(1)App 发行流程概述

    在 App Store 上发行 App 的一般流程如下. 第 1 步:选择您的构建版本 每个 App 都可以有多个版本,且每个版本也可以有多个构建版本.若要在 App Store 上发行您的 App, ...

  7. python之logging模块简单用法

    前言: python引入logging模块,用来记录自己想要的信息.print也可以输入日志,但是logging相对print来说更好控制输出在哪个地方.怎么输出以及控制消息级别来过滤掉那些不需要的信 ...

  8. c语言程序设计案例教程(第2版)笔记(一)—零散、输入输出、最小公倍数、选择排序、冒泡排序

    零散知识点: 非格式化输入输出:getchar().putchar() 格式化输入输出   :scanf().printf() 字符串输入输出   :gets() 或 scanf().puts() 或 ...

  9. 《windows核心编程系列》十五谈谈windows线程栈

    谈谈windows线程栈. 当系统创建线程时会为线程预订一块地址空间区域,注意仅仅是预订.默认情况下预定的这块区域的大小是1MB,虽然预订这么多,但是系统并不会给全部区域调拨物理存储器.默认情况下,仅 ...

  10. 环境变量解释以及在Linux下的环境变量设置

    一.环境变量解释 环境变量是什么? 引用百度百科里面的解释:环境变量是操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows系统中的path环境变量,当要求 ...