保護模式
| 本条目需要被修正為維基格式以符合质量标准。(2013年3月26日) |
保護模式(Protected Mode,或有時簡寫為 pmode)是一種 80286 系列和之後的 x86 兼容 CPU 的操作模式。保護模式有一些新的特性,設計用來增強 多任务 和系統穩定度,像是 記憶體保護,分頁 系統,以及硬體支援的 虛擬記憶體。大部分的現今 x86 作業系統 都在保護模式下運行,包含 Linux、FreeBSD、以及 微軟 Windows 2.0 和之後版本。
另外一種 286 和其之後 CPU 的操作模式是 真實模式,一種向前相容且關閉了保护模式這些特性的CPU运行模式。用來讓新的晶片可以執行舊的軟體。依照設計的規格,所有的 x86 CPU 都是在真實模式下開機,來確保傳統作業系統的向前相容性。在任何保護模式的特性可用前,他們必須要由某些程式手動地切換到保護模式。在現今的電腦,這種切換通常是由 作業系統 在開機時候必須完成的第一件工作的一個。它也可能當 CPU 在保護模式下運行時,使用 虚拟86模式 來執行設計运行在真實模式下的程式碼。
儘管用軟體的方式也有某些可能在真實模式的系統下使用多工,但保護模式下記憶體保護的特色,可以避免有問題的程式破壞其他工作或是 作業系統 核心所擁有的記憶體。保護模式也有中斷正在執行程式的硬體支援,可以把 execution content 交給其他工作,得以實現 先佔式多工。
大部分可以使用保護模式的 CPU 也擁有 32 位元暫存器 的特性 (例如 80386 系列和其後任何的晶片),導入了融合保護模式而成為 32 位元處理的概念。80286 晶片雖有支援保護模式,但是仍然只有 16 位元暫存器。Windows 2.0 和之後版本中的保護模式增強稱為 "386 增強模式",是因為他們除了保護模式外,還需要 32 位元的暫存器,並且無法在 286 上面執行 (即使 286 支援保護模式)。
即使在 32 位元晶片上已經打開了保護模式,但是 1 MB 以上的記憶體並無法存取,是由於一種仿照 IBM XT 系統設計特性的 memory wrap-around(記憶體連續) 的因素。這種限制可以由打開 A20 line 來迴避。
在保護模式下,前面 32 個中斷都是保留給 CPU 例外處理用。舉個例子,中斷 0D (十進制 13) 是 一般保護模式錯誤 而 中斷 00 是 除以零。
目录 |
286的保护模式寻址 [编辑]
286出现之前,x86的地址总线为20位,使用16位的段基址(段首地址的高16位)与16位的段内偏移量来对220(即1MiB)的地址空间寻址。1982年问世的286 CPU首次使用了保护模式寻址。286CPU的地址总线为24位,寻址空间为224(即16 MiB). 而286 CPU的寄存器仍为16位。寻址时,段寄存器保存的数据不再是内存物理地址,而是称作选择器(selector),其中高13位指向描述符表(descriptor table)的条目;最低的两位数据定义了请求的权限,从0到3,0是最高权限,3是最低权限;剩下的一位表示是使用全局描述符表(GDT)还是局部描述符表(LDT)。描述符表的条目为8字节长,包括24位长的段起始物理地址、16位长的段长(因此段的长度范围从1 B到216 B,即不超过64 KiB)。每次内存操作所要访问的物理地址为描述符表相应条目给出的24位段起始物理地址再加上16位的偏移量。可见,286保护模式下的应用程序能访问的内存线性地址空间仅为64 KB,非常有限。所以程序员编写使用大内存的应用程序时还必须使用远指针、近指针,相当繁琐。这影响了286保护模式的推广使用。
从386开始的IA32保护模式寻址 [编辑]
1985年问世的80386开启了32位CPU时代。地址总线为32比特,寻址空间为232(即4 GiB). 386 CPU保护模式下有两种内存寻址方式:
- 可以分页寻址,这是此后的x86上的Windows操作系统与Linux操作系统最广泛采用的方法;
- 也可以非分页寻址而采取与286保护模式兼容的寻址方式,采用32位的选择器(selector)寄存器与32位的偏移量寄存器寻址,这时描述符表的条目中保存的段起始物理地址为32位,而段长的数据宽度为20位,但可以设置段长的粒度为1 B或4 KiB,所以段的最大长度可以是1 MiB或者4 GiB。
386 CPU开创的分页内存管理,比286保护模式寻址具有更多的优点:
- 操作系统可以控制与限制进程对页面的访问权限
- 为应用程序创造一个连续的、独立的、线性的虚拟内存空间
- 页面可以移出主存,存入更慢速的次级外存如硬盘。这使得操作系统可以使用比物理内存更大的存储空间。
IA32的CPU通过两级页表:page directories与page tables实现4 KiB的分页管理,这是最常见的IA32分页寻址方式。从应用程序角度,不再使用段地址寄存器(或称选择器),仅使用32位的偏移量,为232(即4 GiB)的连续线性寻址空间。
参见 [编辑]
外部連結 [编辑]
|
||||||||||||||||||||||||||||||