首页 > 其他分享 >一个操作系统的设计与实现——第19章 IA32-e模式

一个操作系统的设计与实现——第19章 IA32-e模式

时间:2024-08-31 10:15:52浏览次数:13  
标签:IA32 表项 操作系统 19 模式 地址 64 页模式

19.1 64位段描述符与GDT

在32位操作系统中,我们使用的是平坦模型而非分段模型,从而,段描述符的段基址和段限长均成了摆设。在64位模式下,就连CPU也淘汰了分段模型,转而固定使用平坦模型。

64位代码段描述符如下图所示:

如图所示,由于固定使用平坦模型,段描述符中的段基址、段限长、粒度等位均被忽略或固定为0,此时的段描述符不再提供段基址,只能提供其是否存在、描述符类型、DPL等信息。

段描述符的第53位为L位,在保护模式中,这一位是段描述符中唯一的保留位,其正是为64位模式准备的,作用如下:

  • 如果这一位为0,段描述符是32位的
  • 否则,如果这一位为1,段描述符是64位的

对于数据段,dsesss均直接被忽略,fsgs的段基址可由特殊方法设定,其他信息,如段限长等亦被忽略。这里的"特殊方法"将在后续章节中讨论。然而,在实际测试中笔者发现:在bochs中,某些指令,如iretq等,并不会忽略数据段描述符,这可能是bochs的bug。因此,在我们的操作系统中仍然需要定义数据段描述符。

64位模式下的GDT仍然使用16位的表限长,但表的起始地址拓展到64位,也就是说,GDTR现在由一段2 + 8 == 10字节的内存组成。

19.2 三级分页模式

一个页表或页目录表的大小都是一页,其中存放了1024个32位的地址,需要一个10位的二进制数作为其索引值。现在,如果将地址的宽度拓展到64位,表的大小不变,则一个表中能存放的地址数量就减少到512个,只需要一个9位的二进制数作为其索引值。

考察二级分页模式的虚拟地址,其由两个10位的索引值和一个12位的页内偏移量组成。如果使用上述方法将索引值减少到9位,虚拟地址就空出了两位,这两位可以构成第三个索引值,从而将分页层级扩展到三级。这种分页模式,就称为PAE(Physical-Address Extension,物理地址扩展)模式,或通俗的称为三级分页模式。

三级分页模式的第三个索引值只有两位,只能用于一个长度为4的表,这个表就称为页目录指针表(Page Directory Pointer Table,PDPT),其中的表项就称为页目录指针项(Page Directory Pointer Table Entry,PDPTE)。PDPT是三级分页模式的起点,其物理地址需要安装到cr3中。PDPTE的存在位、权限位等与PDE/PTE相同。

三级分页模式是32位虚拟地址到64位物理地址的映射,因此,虽然虚拟地址还是32位的,只能表示4G内存,但通过反复切换cr3中的PDPT,(理论上)就能访问到整个64位物理地址空间了。

19.3 四级与五级分页模式

三级分页模式明显是个很别扭的过渡产物,在64位CPU中,虚拟地址也拓展到了64位,此时,可以将虚拟地址拆成12 + 9 + 9 + 9 + 9 + 9 + 7 == 64位,从而构造出六级分页模式。然而,这样的地址实在是太大了,远远超过了目前物理内存的实际大小,因此,出于成本和运行效率考虑,目前的CPU只支持四级或五级分页模式。

四级与五级分页模式中新增的表不再沿用PDPTE这样别扭的名称,而是简单的称为四级页表(Page Map Level 4,PML4)与五级页表(Page Map Level 5,PML5),其中的表项就称为四级页表项(Page Map Level 4 Entry,PML4E)与五级页表项(Page Map Level 5 Entry,PML5E)。PML4E、PML5E的存在位、权限位等与PDE/PTE相同。

IA32-e模式必须使用四级或五级分页模式,因此,我们的操作系统使用四级分页模式。PML4作为四级分页模式的起点,其物理地址需要安装到cr3中。

四级分页模式只使用12 + 9 + 9 + 9 + 9 == 48位虚拟地址,对于剩余的高位,CPU要求:虚拟地址的高16位必须与第47位一致,满足此要求的地址被称为规范地址(Canonical Address)。如果使用不规范的地址,CPU会抛出异常。

考察规范地址,可以发现其由以下两部分组成:

  • 0x0000_0000_0000_0000 ~ 0x0000_7fff_ffff_ffff
  • 0xffff_8000_0000_0000 ~ 0xffff_ffff_ffff_ffff

这两段地址的范围一样,并且都很大,因此,自然的适用于划分内核地址空间与任务地址空间,我们的操作系统正是这么做的。

在四级或五级分页模式下,如果将PDE的第7位置1,则可打开2M大页模式。此时,PDE不再指向页表,而是直接指向一个2M大页的起始地址,由虚拟地址中剩余的12 + 9 == 21位构成页内偏移量。在我们的操作系统中,这个功能被多次使用。

19.4 进入IA32-e模式

硬件需要保持兼容性,因此,即使是64位的CPU,也要和以前一样,从实模式开始,先进入保护模式,再进入64位模式。

64位模式是个统称,其有两个子模式:兼容模式与IA32-e模式。兼容模式可在不回退到保护模式的前提下执行保护模式的代码,其也用于保护模式到IA32-e模式的过渡;IA32-e模式即为真正的64位模式。

想要进入IA32-e模式,就需要先进入保护模式,但无需打开二级分页模式。然后,通过以下步骤进入IA32-e模式:

  1. 安装四级分页模式所需的所有表,并将PML4的物理地址安装到cr3
  2. cr4的第5位置1,这一步用于打开PAE模式,从而将页表中的地址视为64位的
  3. IA32_EFER的第8位置1,这一步用于打开IA32-e模式。这一步的实现细节将在下文中讨论
  4. cr0的第31位置1,打开四级分页模式
  5. 跳转到64位代码段

请看本章代码19/Mbr.s

第1~24行,进入保护模式。

第26~33行,将[0x100000, 0x200000)[0x90000, 0x92000)这两段内存清零。这些内存的用途如下表所示:

地址 作用
[0x100000, 0x101000) PML4
[0x101000, 0x200000) 内核地址空间的255个PDPT
[0x90000, 0x91000) 低端2M内存使用的页目录表
[0x91000, 0x92000) 保留给后续章节使用的页目录表

第35行,安装第一个PML4E,其用于过渡到分页模式,不与其他任务共享。

第37~46行,安装内核地址空间的255个PML4E。内核地址空间平分了一半的虚拟地址,因此本应有256个PML4E,但最后一个PML4E指向PML4本身,因此不参与循环。预先安装255个PML4E的目的是共享内核,其原理与二级页表一致,这里不再赘述。

第48行,安装最后一个PML4E,其指向PML4本身。这样做的目的是为内存管理做准备,其原理与二级页表一致,这里不再赘述。

第49行,在内核地址空间的第一个PDPT中安装第一个PDPTE,其指向0x90000处的页目录表。

第50行,在0x90000处的页目录表中安装第一个PDE,其指向起始地址为0的2M大页。我们的操作系统只使用2M物理内存,刚好可以被一个2M大页覆盖。

第52~53行,将PML4的物理地址安装到cr3中。

第55~57行,将cr4的第5位置1,打开PAE模式。

第59~62行,将IA32_EFER的第8位置1,打开IA32-e模式。

IA32_EFER是一个型号特定寄存器(Model-Specific Register,MSR),这里的EFER即扩展功能启用寄存器(Extended Feature Enable Register)。型号特定指的是仅在部分型号的CPU上才有,例如IA32_EFER在不支持IA32-e模式的CPU上可能就是没有的。MSR有很多个,以至于难以对其进行命名。因此,诸如IA32_EFER这样的名字只是方便书面记录,不能用在代码中,代码中实际使用的是MSR的编号,并使用rdmsr/wrmsr指令对其进行读写。具体来说:

  • rdmsr/wrmsr固定使用ecx设定MSR的编号
  • 每个MSR都是64位的,rdmsr/wrmsr固定使用edx:eax组合描述它
  • IA32_EFER的编号是0xc0000080

第64~66行,打开分页模式。

第68行,跳转到64位代码段。

第70行,将后续代码以64位模式编译。

第74行,重新加载GDTR。在实模式下,lgdt会读取6字节的内存,而在64位模式下,lgdt指令会读取10字节的内存,因此,重新加载GDTR可将GDT抬升到高地址。

第76行,将rsp抬升到高地址。

第78行,挂起CPU。

第80~87行,定义GDT。0号表项为空表项,这是GDT的要求;1~2号表项分别为保护模式下的0特权级代码段与数据段;3~4号表项分别为64位0特权级代码段与数据段;5~6号表项分别为64位3特权级数据段与代码段。4~6号表项在本章中未使用,保留给后续章节使用。细心的读者会发现:3~4号表项是先代码段,后数据段;但5~6号表项是先数据段,后代码段,这种别扭的写法是有意而为之的,将在后续章节中讨论。

第89~92行,定义GDTR。GDTR会被加载两次,第一次只使用前6字节,第二次则会使用完整的10字节。

第94~96行,填充MBR并设定MBR魔数。

19.5 编译与测试

请看本章代码19/Makefile

第2行,使用dd命令创建一个虚拟硬盘,这比使用bximage命令更方便。

第3~4行,编译MBR,并将其写入虚拟硬盘的0号扇区。

启动bochs,可以观察到操作系统已经进入无限循环状态。

至此,我们已经进入IA32-e模式,接下来,就可以加载内核了。

标签:IA32,表项,操作系统,19,模式,地址,64,页模式
From: https://www.cnblogs.com/yingyulou/p/18389912

相关文章

  • 一个操作系统的设计与实现——第20章 加载64位内核,64位显卡驱动与内存管理系统
    20.164位ELF格式在64位模式下,由于内存地址变宽,ELF格式中的内存地址也要跟着变宽。这并不是一个麻烦的问题,因为ELF格式的整体结构没有发生变化,仍然由一个文件头,加上若干程序头表组成。对于64位ELF格式的文件头,我们需要关注的信息如下表所示:偏移量字节数含义0x188程......
  • 一个操作系统的设计与实现——第21章 高级可编程中断控制器
    21.1什么是高级可编程中断控制器我们已经使用过型号为8259A的可编程中断控制器(ProgrammableInterruptController,PIC)。在单CPU计算机中,中断的处理相对简单:所有的外设和CPU都连接在PIC上即可。然而,如果计算机中不止一个CPU,情况就会变得复杂起来。以双CPU为例:键盘中断会被每个C......
  • wbemtest.exe 是 Windows 操作系统中的一个实用程序,用于测试和调试 Windows Managemen
    wbemtest.exe起源于Windows操作系统的WMI(WindowsManagementInstrumentation)框架。它首次引入于Windows2000,作为一个图形化工具,帮助用户和开发者测试和调试WMI查询、操作和配置。其目的是简化与WMI服务的交互,提供一个直观的界面用于管理和排查系统管理数据。wbemte......
  • DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期
    DaVinciResolveStudio19.0正式版(macOS,Windows)-剪辑、调色、特效和音频后期制作BlackmagicDesignDaVinciResolveStudio请访问原文链接:https://sysin.org/blog/davinci-resolve/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgDaVinciResolve19免费!......
  • Windows Server 2019 中文版、英文版下载 (updated Aug 2024)
    WindowsServer2019中文版、英文版下载(updatedAug2024)WindowsServer2019Version1809请访问原文链接:https://sysin.org/blog/windows-server-2019/,查看最新版。原创作品,转载请保留出处。本站将不定期发布官方原版风格月度更新ISO。WindowsServer2019直接上链......
  • 2024/8/19~24总结
    树上合并总的来说,树上合并类问题主要用于解决树上统计种类数、最大值一类的问题。最朴素的树上合并思路为分别统计每个子树的答案合并再加上父亲节点本身的答案。一般采用启发式合并,将小子树合并进大子树中如树上数颜色题意:给定一颗有根树,每个节点有颜色,求每棵子树的......
  • Windows10使用MSYS2和VS2019编译FFmpeg详解
    1环境准备1.1 安装VisualStudio2019这个步骤相对比较简单,不再详细说明。1.2安装msys2首先需要安装msys2环境以及相关的编译依赖项,官方网址为:https://www.msys2.org/在官网下载好安装程序后,直接按照提示安装即可。安装好后需要将下载库的地址更换为国内源,否则下载......
  • Versal 自适应 SoC,XCVM2502-1MSEVSVC2197、XCVM2502-1LSEVSVC2197、XCVM2502-1LLIVSVI
    Prime 系列概述VersalPrime系列是一款高度集成、多核、异构计算平台,适用于数据中心网络、存储和有线通信等多种应用。它通过在优化了连接性的设备中实现低延迟的内联加速,为这些应用提供突破性的性能。 应用:存储加速数据中心网络加速5GxHaul无源光网络通......
  • 通过图形界面安装oracle 19c client
    服务器配置检查1)检查/tmp目录,至少需要400MB空间2)检查swap分区 256MB:3timesthesizeofRAM Between256MBand512MB:2timesthesizeofRAM Between512MBand2GB:1.5timesthesizeofRAM Between2GBand16GB:EqualtothesizeofRAM Morethan......
  • Oracle 19c OCP 082认证考试题库(第6题)- 2024年修正版
    【优技教育】Oracle19cOCP082题库(第6题)-2024年修正版考试科目:1Z0-082考试题量:90通过分数:60%考试时间:150min本文为(CUUG原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。原文地址:http://www.cuug.com/index.php?s=/home/article/detail/id/3388.html第6......