保护模式

✍ dations ◷ 2025-02-24 02:02:10 #X86架构

保护模式(英语:Protected Mode,或有时简写为 pmode)是一种80286系列和之后的x86兼容CPU的运行模式。保护模式有一些新的特性,如存储器保护,标签页系统以及硬件支持的虚拟内存,能够增强多任务处理和系统稳定度。现今大部分的x86操作系统都在保护模式下运行,包含Linux、FreeBSD、以及微软Windows 2.0和之后版本。

另外一种286和其之后CPU的运行模式是实模式,这是一种向前兼容且关闭了保护模式这些特性的CPU运行模式,用来让新的芯片可以运行旧的软件。所有的x86 CPU都是在实模式下引导,来确保传统操作系统的兼容性。为了使用保护模式的特性,要由程序主动地切换到保护模式。在现今的电脑上,这种切换通常是操作系统在引导时候完成的第一件任务。当CPU在保护模式下运行时,可以使用虚拟86模式来运行为实模式设计的代码。

尽管用软件的方式也有某些可能在实模式的系统下使用多任务,但保护模式下存储器保护的特色,可以避免有问题的程序破坏其他任务或是操作系统核心所拥有的存储器。保护模式也有中断正在运行程序的硬件支持,可以实现先占式多任务。

大部分可以使用保护模式的CPU也拥有32位寄存器的特性(例如80386系列和其后任何的芯片),导入了融合保护模式而成为32位处理的概念。80286芯片虽有支持保护模式,但是仍然只有16位寄存器。Windows 2.0和之后版本中的保护模式增强称为"386增强模式",是因为他们除了保护模式外,还需要32位的寄存器,并且无法在286上面运行(即使286支持保护模式)。

即使在32位芯片上已经打开了保护模式,但是为了仿照IBM XT系统存储器连续的设计特性,1 MiB以上的存储器并无法访问。这种限制可以由打开A20总线来回避。

在保护模式下,前面32个中断都是保留给CPU异常处理用。例如,中断0D(十进制13)是一般保护模式错误,而中断00是除以零。

286出现之前,x86的地址总线为20位,使用16位的段基址(段首地址的高16位)与16位的段内偏移量,段基址左移4位后与段内偏移量相加形成20位的物理地址,来对2(即1MiB)的地址空间寻址。1982年问世的286 CPU首次使用了保护模式寻址。286 CPU的地址总线为24位,寻址空间为2(即16 MiB)。而286 CPU的寄存器仍为16位。寻址时,段寄存器保存的数据不再是内存物理地址,而是称作选择器(selector),其中高13位指向描述符表(descriptor table)的条目;最低的两位数据定义了请求的权限,从0到3,0是最高权限,3是最低权限;剩下的一位表示是使用全局描述符表(GDT)还是局部描述符表(英语:Local Descriptor Table)(LDT)。描述符表的条目为8字节长,包括24位长的段起始物理地址、16位长的段长(因此段的长度范围从1 B到2 B,即不超过64 KiB)。每次内存操作所要访问的物理地址为描述符表相应条目给出的24位段起始物理地址再加上16位的偏移量。可见,286保护模式下的应用程序能访问的内存线性地址空间仅为64 KB,非常有限。所以程序员编写使用大内存的应用程序时还必须使用远指针、近指针,相当繁琐。这影响了286保护模式的推广使用。

1985年问世的80386开启了32位CPU时代。地址总线为32比特,寻址空间为2(即4 GiB)。386 CPU保护模式下有两种内存寻址方式:

386 CPU开创的分页内存管理,比286保护模式寻址具有更多的优点:

IA32的CPU通过两级:页目(page directory)与页表(page table)实现4 KiB的分页管理,这是最常见的IA32分页寻址方式。CR3寄存器保存了进程的页目的物理地址。页目与页表中每4字节为一个单元,是一个32位的值,当页目项第0位为1时,表明页表已经在物理内存中;当页表项第0位为1时,表明访问的数据已经在内存中。另外,当页目项第7位为1时,表明这是一个4M的页面,这值已经是物理页地址,用虚拟地址的低22位作为偏移量。

从应用程序角度,不再使用段地址寄存器(或称选择器),仅使用32位的偏移量,为2(即4 GiB)的连续线性寻址空间。

相关

  • 硬脂酸硬脂酸(IUPAC系统命名法:十八酸,英语:Stearic acid)是一种饱和脂肪酸。它是一种难溶于水的蜡状固体,化学式C18H36O2,可溶于乙醇和丙酮,易溶于乙醚、氯仿、四氯化碳、苯和二硫化碳等
  • 互联网服务提供商互联网服务供应商(英语:Internet Service Provider,简称ISP),又称因特网服务提供者、互联网服务提供商、网络服务供应商,即指提供互联网存取服务的公司。通常大型的电讯公司都会兼
  • 空气中被电离激发的原子回到非激发态的表象临界事故(英语:criticality accident)是核反应堆发生链式反应导致功率失常激增引起的事故。事故中浓缩铀或钚等裂变材料中的链式反应能产生强烈的中子辐射,对人类伤害极大,并且会
  • 史卡兹代尔斯科茨代尔(英语:Scottsdale;奥哈姆语:Vaṣai S-vaṣonĭ;雅基语:Eskatel)位于美国亚利桑纳州的中南部,总面积约为477.7 平方公里,2012年统计人口数约为223,514人。据其官方宣称为“
  • 贾格迪什·钱德拉·博斯贾格迪什·钱德拉·博斯爵士,CSI,CIE,FRS(孟加拉语:জগদীশ চন্দ্র বসু、Jôgodish Chôndro Boshu,1858年11月30日-1937年11月23日)是一位孟加拉物理学家、生物学家、
  • 穆罕默德-礼萨·巴列维穆罕默德-礼萨沙·巴列维(波斯语:محمد رضا شاه پهلوی‎;1919年10月26日-1980年7月27日)是伊朗的沙阿,1941年9月16日即位,1979年2月11日被伊朗伊斯兰革命推翻。他是
  • 双曲函数在数学中,双曲函数是一类与常见的三角函数(也叫圆函数)类似的函数。最基本的双曲函数是双曲正弦函数 sinh {\displaystyle \sinh } 轴对称
  • 新庄港新庄港是清治台湾时期由康熙帝于1694年设立于新庄镇,今已消失,大略位于新庄慈祐宫前的利济街至利济横移门。老一辈的人们俗称为旧港,而新港即为淡水港。由此延绵不绝的大稻埕河
  • 克鲁克县 (俄勒冈州)克鲁克县(英语:Crook County)是位于美国俄勒冈州中部的一个县。面积7,737平方公里。根据美国2000年人口普查,共有人口19,182人。县治普赖恩维尔 (Prineville)。成立于1882年10月
  • 吉米·赫塞尔登詹姆士·威廉·赫塞尔登(英语:James William Heselden,1948年3月28日-2010年9月26日),昵称为吉米·赫塞尔登(英语:Jimi Heselden),生于英国英格兰里兹,发明家与企业家。他发明了艾斯科