首页 > 其他分享 >一个操作系统的设计与实现——第18章 欢迎回来

一个操作系统的设计与实现——第18章 欢迎回来

时间:2024-08-31 10:16:19浏览次数:9  
标签:标号 操作系统 -- 18 欢迎 64 寄存器 32 CPU

18.1 引言

我们已经实现了一个运行在保护模式下的操作系统,然而,读者朋友也许不会满足:如今早已是多核CPU,64位操作系统的时代,而我们的操作系统仅仅是单核CPU,32位的。因此,从本章开始,我们将在32位单核操作系统的基础上,将其升级为一个64位多核操作系统。

18.2 准备工作

我们仍然使用bochs虚拟机作为操作系统的运行和调试环境。但其编译命令需要增加一些选项:

  • 对于bochs./configure --prefix=... --enable-x86-64 --enable-smp && make -jN && make install
  • 对于bochsdbg./configure --prefix=... --enable-debugger --enable-x86-64 --enable-smp && make -jN && make install

新增的--enable-x86-64选项用于启用64位模式;--enable-smp选项用于启用多处理器模式。

此外,bochsdbg-rc参数是一个很实用的功能,其可以使bochsdbg在启动时自动执行一串调试命令,建议读者根据需要自行配置这个参数。

18.3 64位寄存器

64位CPU的通用寄存器宽度是64位的,不仅如此,其还新增了8个通用寄存器r8 ~ r15,并拓展了现有寄存器的用法:现在,所有的寄存器都有8、16、32、64位版本。这些寄存器如下表所示:

64位版本 32位版本 16位版本 8位版本
rax eax ax al/ah
rbx ebx bx bl/bh
rcx ecx cx cl/ch
rdx edx dx dl/dh
rsi esi si sil
rdi edi di dil
rbp ebp bp bpl
rsp esp sp spl
r8 r8d r8w r8b
r9 r9d r9w r9b
r10 r10d r10w r10b
r11 r11d r11w r11b
r12 r12d r12w r12b
r13 r13d r13w r13b
r14 r14d r14w r14b
r15 r15d r15w r15b

64位CPU有一个特殊设定:当向一个32位寄存器传送时,其高32位将被自动清零。也就是说,不需要也不存在这样的指令:movzx 64位寄存器, 32位寄存器;然而,movsx 64位寄存器, 32位寄存器与此设定不矛盾,故仍然存在。

标志寄存器也拓展至64位,被称为rflags。然而,由于其低32位都还没用完,因此拓展出的高32位均为保留位。

指令指针寄存器也拓展至64位,被称为rip

18.4 64位立即数

由于机器语言层面的限制,CPU对64位立即数的支持非常差,以至于只需要以下规则就能描述:

  • mov 64位寄存器, 64位立即数唯一支持64位立即数的指令
  • 其他指令如果强行使用64位立即数,也只会取其低32位

也就是说,很多非常依赖立即数的指令,如内存访问,加减法,位运算等,都不能使用64位立即数,而是需要先使用mov指令进行周转。

18.5 RIP相对寻址

64位CPU新增了一种内存访问模式,被称为RIP相对寻址。具体来说:在nasm语法中,[标号][abs 标号]表示的是普通的内存寻址模式,此时,标号的值就是内存地址;[rel 标号]表示的是新增的RIP相对寻址,此时,该指令会被编译器转换为[rip + 标号相对于rip的偏移量]。这样做的好处在于:64位模式下,直接使用[标号]是有风险的,因为标号很有可能是一个超过32位的立即数,不过,由于标号往往离rip比较近,相对偏移量较小,故不会超过32位的限制。

在nasm中,可以通过声明[default rel]将所有的[标号]都视为[rel 标号]

需要注意的是,RIP相对寻址只适用于[标号]这种形式,其他形式,如:[寄存器 + 标号][64位立即数]等,都是不适用于RIP相对寻址的,这是因为这些指令都无法确定地址与rip的相对偏移量。

本章讨论了64位CPU的寄存器和内存寻址,64位CPU的其他特点将在后续章节中讨论。从下一章开始,我们将正式开始实现64位操作系统。

标签:标号,操作系统,--,18,欢迎,64,寄存器,32,CPU
From: https://www.cnblogs.com/yingyulou/p/18389910

相关文章

  • 一个操作系统的设计与实现——第19章 IA32-e模式
    19.164位段描述符与GDT在32位操作系统中,我们使用的是平坦模型而非分段模型,从而,段描述符的段基址和段限长均成了摆设。在64位模式下,就连CPU也淘汰了分段模型,转而固定使用平坦模型。64位代码段描述符如下图所示:如图所示,由于固定使用平坦模型,段描述符中的段基址、段限长、粒度等......
  • 一个操作系统的设计与实现——第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......
  • 宠物勺子秤芯片解决方案CSU8RP1186
    宠物勺子秤,一种1kg量程的便携式计量勺,主要是用来计算喂食的宠物食物重量,控制宠物饮食来保证宠物体重。这款宠物勺电子秤,采用CSU8RP1186主控开发完成,这款高性能单片机,,集成了24Bit高精度ADC,工作电压(2.4~3.6V),自带4×12的LCD驱动可满足大部分LCD显示需求,若是需要做LED显示芯片可......
  • Winobj 是一个由微软提供的工具,用于查看和浏览 Windows 操作系统中的对象命名空间。它
    Winobj是一个由微软提供的工具,用于查看和浏览Windows操作系统中的对象命名空间。它允许你查看系统中的各种对象,如文件系统对象、注册表键、符号链接等,帮助深入了解系统的内部结构。Winobj是由微软开发的一个工具,起源于微软的内部开发和调试需求。它最初是为了帮助开发人员和......
  • opc da 服务器数据 转IEC61850项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 应用条件 24 查看OPCDA服务器的相关参数 25 配置网关采集opcda数据 46 用IEC61850协议转发数据 67 网关使用多个逻辑设备和逻辑节点的方法 98 在服务器上运行仰科OPCDA采集软件 109 案例总结 121 案例说明在OPCDA服务器上......
  • Spring框架中如何实现国际化(i18n)?
    在Spring框架中实现国际化(i18n)主要涉及以下几个步骤:1.准备资源文件首先,你需要为不同语言准备资源文件。这些资源文件通常放在类路径下的特定目录中,如src/main/resources/下的messages.properties文件。对于不同的语言和地区,你可以创建对应的.properties文件,例如me......
  • luoguP5369 [PKUSC2018] 最大前缀和
    题目n<=20题解想了半天3位状态的折半,然后发现空间开不下(时间也不太行)所以放弃思考,直接枚举答案答案是a中的一个集合,设为S;记集合S的和为sum[S]考虑当S确定时,有多少种方案能使答案恰好为sum[S]。为了处理多种sum相同的情况,记S为从前往后考虑,第一次出现最大ans的集合;记剩余部......
  • 苹果 iOS / iPadOS 18 beta8和iOS / iPadOS 18.1 beta3版本更新
    苹果今日向iPhone和iPad用户推送了 iOS/iPadOS18开发者预览版Beta8 更新(内部版本号:22A5350a)和iOS/iPadOS18.1开发者预览版Beta3 更新(内部版本号:22B5034e),本次更新距离上次发布Beta/RC间隔8天。此次更新的iOS18Beta8已无限接近正式版,更新文件并未提到......