在64位linux上从32位模式切换到64位(长模式)

2023-11-27

我的程序在 x86_64 CPU(64位操作系统,ubuntu 8.04)上以32位模式运行。是否可以在用户模式下暂时切换到64位模式(长模式)?如果是这样,怎么办?

背景故事:我正在编写一个与32位模式程序链接的库,因此它在启动时必须是32位模式。但是,我想使用更快的 x86_64 指令以获得更好的性能。所以我想切换到 64 位模式做一些纯计算(没有操作系统交互;不需要 64 位寻址)并在返回调用者之前返回到 32 位。

我发现有一些相关但不同的问题。例如,

  • 在 64 位程序中运行 32 位代码
  • 在 32 位操作系统中运行 64 位代码

我的问题是“在 32 位程序、64 位操作系统中运行 64 位代码”


与其他答案相反,我断言原则上简短的答案是YES。这可能不会以任何方式得到官方支持,但它似乎有效。在这个答案的最后,我展示了一个演示。

在 Linux-x86_64 上,32 位(根据 GDB 源代码,X32 也是如此)进程得到CS寄存器等于0x23— GDT 中定义的 32 位环 3 代码段的选择器(其基址是0)。 64 位进程有另一个选择器:0x33— 长模式(即 64 位)环 3 代码段的选择器(基础ES, CS, SS, DS在 64 位模式下无条件地视为零)。因此,如果我们使用目标段选择器进行远跳转、远调用或类似的操作0x33,我们将相应的描述符加载到阴影部分CS并将最终形成 64 位段。

这个答案底部的演示使用jmp far跳转到 64 位代码的指令。请注意,我选择了一个特殊的常量来加载rax,因此对于 32 位代码,该指令看起来像

dec eax
mov eax, 0xfafafafa
ud2
cli ; these two are unnecessary, but leaving them here for fun :)
hlt

如果我们在 CS 影子部分中执行具有 32 位描述符的操作,则这一定会失败(将在ud2操作说明)。

现在这是演示(用 fasm 编译)。

format ELF executable
segment readable executable

SYS_EXIT_32BIT=1
SYS_EXIT_64BIT=60
SYS_WRITE=4
STDERR=2

entry $
    mov ax,cs
    cmp ax,0x23 ; 32 bit process on 64 bit kernel has this selector in CS
    jne kernelIs32Bit
    jmp 0x33:start64 ; switch to 64-bit segment
start64:
use64
    mov rax, qword 0xf4fa0b0ffafafafa ; would crash inside this if executed as 32 bit code
    xor rdi,rdi
    mov eax, SYS_EXIT_64BIT
    syscall
    ud2

use32
kernelIs32Bit:
    mov edx, msgLen
    mov ecx, msg
    mov ebx, STDERR
    mov eax, SYS_WRITE
    int 0x80
    dec ebx
    mov eax, SYS_EXIT_32BIT
    int 0x80
msg:
    db "Kernel appears to be 32 bit, can't jump to long mode segment",10
msgLen = $-msg
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在64位linux上从32位模式切换到64位(长模式) 的相关文章

  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • pprof 和 ps 之间的内存使用差异

    我一直在尝试分析用 cobra 构建的 cli 工具的堆使用情况 这pprof工具显示如下 Flat Flat Sum Cum Cum Name Inlined 1 58GB 49 98 49 98 1 58GB 49 98 os Read
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 如何从 Linux 内核模块获取使用计数?

    我对正在开发的内核模块的使用计数有疑问 我想打印它以进行调试 如何从模块代码中获取它 有问题的内核版本 Linux 2 6 32 module refcount http lxr linux no linux v2 6 34 1 inclu
  • 错误:命令“c++”失败,退出状态为 1

    所以我尝试按照以下说明安装 Pyv8https andrewwilkinson wordpress com 2012 01 23 integrating python and javascript with pyv8 https andre
  • 查看 Linux 上的多核或多 CPU 利用率

    我有一个在 Linux 上运行的程序 我需要确定它如何利用所有 CPU 内核 有没有什么程序可以查看这些信息 跑过 top 命令并按下 1 查看各个核心
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 在 Docker 容器中以主机用户身份运行

    在我的团队中 我们在进行开发时使用 Docker 容器在本地运行我们的网站应用程序 假设我正在开发 Flask 应用程序app py具有依赖关系requirements txt 工作流程大致如下 I am robin and I am in
  • C++:Linux平台上的线程同步场景

    我正在为 Linux 平台实现多线程 C 程序 其中我需要类似于 WaitForMultipleObjects 的功能 在搜索解决方案时 我发现有一些文章描述了如何在 Linux 中实现 WaitForMultipleObjects 功能
  • 为什么 mov %ax, %ds 汇编+反汇编为 mov %eax,%ds,与原来不一致?

    test S text global start start xor ax ax mov ax ds mov ax ss mov ax es mov ax fs mov ax gs 我通过这样做得到了反汇编代码文件 x86 64 elf g
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec

随机推荐

  • 如何使用 Python-NLTK 根据词汇内容(短语)解析句子

    Python NLTK 能否识别输入字符串并不仅根据空格而且根据内容解析它 可以说 计算机系统 在这种情况下就成了一个短语 谁能提供示例代码吗 输入字符串 用户对计算机系统响应时间看法的调查 预期产出 A 调查 的 用户 意见 的 计算机系
  • 如何在ServiceBus上通过sequenceNumber使用MessageReceiver.Receive方法

    我正在尝试从死信队列重新提交消息 我可以重播死信队列上的消息 这很好 问题是当我现在想从死信队列中删除它时 这是我正在尝试做的事情 var subscription mySubscription var topic myTopic var
  • 在闪亮的传单地图中使用标签和颜色时,图例标签不会内联显示

    当我想使用时labels and colors参数与addLegend 里面的函数shinyApp图例显示在楼梯中 如下所示 但如果我只渲染地图leaflet之外的shinyApp标签正确地内嵌显示 我见过这个帖子遇到同样的问题 但他们没有
  • 什么情况下需要使用 eval() 因为没有其他选择?

    I know eval出于速度和安全原因 应避免在 JavaScript 中使用 但就 PHP 而言 很少有人提到安全性 更常见的是 由于随意使用 您的程序运行速度比应有的速度慢eval 在什么具体情况下应该使用eval因为没有其他办法吗
  • 分析多线程程序[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我们的代码库已经有好几年了 所有原来的开发人员都早已不在了 它使用很多很多线程 但没有明显的设计或通用的架构原则 每个开发人员都有自己的多线程编程风格 因此有些线程使用队列相互通信
  • 具有多个父/子关系的 Elasticsearch

    书籍 用户和评论说 我正在构建一个具有复杂模型的应用程序 评论包含书籍和用户 ID 为了能够搜索至少包含一篇评论的图书 我已将图书设置为评论的父级并具有路由 但是 我还需要找到撰写包含某些短语的评论的用户 是否可以将书籍和用户同时作为评论的
  • 页面加载失败时在Chrome中获取当前域名

    如果您尝试使用 Chrome 加载 http sdqdsqdqsdsqdsqd com 您将获得 ERR NAME NOT RESOLVED 我希望通过一个小书签能够获取当前域名并将其重定向到 whois 页面 以便检查该域名是否可用 我在
  • 从 html 按钮 onclick 事件调用 typescript 方法

    我是打字稿新手 我有一个关于当您单击 html 按钮时如何从 html 页面调用 ts 文件内的方法的查询 ts file class AdminTS public alertMessageTS alert This is the test
  • 使用java创建CSV文件

    我将使用 java 创建 CSV 文件 这是代码的一部分 try FileWriter writer new FileWriter sFileName writer append Title for StoredArticle sa3 hi
  • 按钮的 OnClickListener 上出现 NullPointerException

    我正在为人工智能学期项目编写 Android 游戏应用程序 我在主类的第 38 行收到 NullPointerException 它是启动屏幕中新游戏按钮的 setOnClickListener 相关部分 WW3Activity 类 pub
  • 量角器找不到角度

    我似乎无法让 Protractor 意识到 Angular 已加载并正在运行 当它打开 Chrome 时 我的应用程序会在浏览器中完全加载 因此我知道 Angular 已加载并正确运行 配置文件 exports config seleniu
  • var 在 Java 中做什么?

    我的一个朋友注意到 var
  • 我需要服务哪些 Android ABI(CPU 架构)?

    我决定为不同的 ABI 上传多个 APK 以缩小我的 apk 文件大小大规模地 因此我用android gt splits gt abi gt enable true 应用程序级别build gradle 我遇到过这些不同的 APK 风格
  • 检查列值是否位于其他两个列值之间(范围)

    我有一个如下所示的数据框 Dataframe X id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个数据框 如下所示 数据框 Y id number1 number2 1 4000 600
  • 在 Android Studio 中生成签名 APK 时,签名版本 - V1(Jar 签名)和 V2(完整 APK 签名)之间的区别?

    请至少选择一个要在 Android Studio 2 3 中使用的签名版本 现在 在 Android Studio 中生成签名的 APK 时 它显示两个选项 复选框 即 1 V1 Jar Signature and 2 V2 Full AP
  • IIS7 下超出 Web 配置大小限制 0x80070032

    我有一个web config文件在我当前在 IIS7 上运行的解决方案中相当大 它在我的开发服务器上运行完美 但是我遇到了错误0x80070032 配置错误无法读取配置文件 因为它超出了最大文件大小 我当前的解决方案使用一个非常大的web
  • XGBoost 最佳迭代

    我正在使用 XGBoost 算法运行回归 clf XGBRegressor eval set X train y train X val y val early stopping rounds 10 n estimators 10 verb
  • 将列添加到包含其他列值列表的 pandas DataFrame

    我有一个 DataFrame 需要向其中添加一列 该列必须是两个值的列表 当前表 lat long other value 0 50 50 x 1 60 50 y 2 70 50 z 3 80 50 a 需要的表 lat long othe
  • 如何解决嵌套映射函数中的 SPARK-5063

    RDD 转换和操作只能由驱动程序调用 不能在其他转换内部调用 例如 rdd1 map x gt rdd2 values count x 无效 因为值转换和计数操作无法在 rdd1 map 转换内部执行 有关更多信息 请参阅 SPARK 50
  • 在64位linux上从32位模式切换到64位(长模式)

    我的程序在 x86 64 CPU 64位操作系统 ubuntu 8 04 上以32位模式运行 是否可以在用户模式下暂时切换到64位模式 长模式 如果是这样 怎么办 背景故事 我正在编写一个与32位模式程序链接的库 因此它在启动时必须是32位