64位linux内核如何从ELF启动32位进程

2024-01-11

通过查看binfmt_elf.c https://elixir.bootlin.com/linux/v3.5/source/fs/binfmt_elf.c在内核源代码中,我无法弄清楚内核(64 位)在生成 32 位进程与 64 位进程时有何不同。

有人可以向我解释我缺少什么吗?

(这个问题与我的另一个问题有关,即在与 64 位指令相同的进程中使用 32 位指令(link https://stackoverflow.com/questions/48854564/is-it-possible-to-use-both-64-bit-and-32-bit-instructions-in-the-same-executable),但这可以作为一个单独的问题。)


If the execveat系统调用是用来启动一个新进程的,我们首先输入文件系统/exec.c在内核源代码中进入 SYSCALL_DEFINEx(execveat..) 函数。 然后这个函数调用这些函数:

  • do_execveat(..)
    • do_execveat_common(..)
      • exec_binprm(..)
        • 搜索二进制处理程序(..)

The 搜索二进制处理程序迭代各种二进制处理程序。在 64 位 Linux 内核中,将有一个用于 64 位 ELF 的处理程序和一个用于 32 位 ELF 的处理程序。两个处理程序最终都是从同一源构建的文件系统/binfmt_elf.c。然而,32 位处理程序是通过构建的文件系统/compat_binfmt_elf.c它重新定义了之前的一些宏包括源文件binfmt_elf.c itself.

Inside binfmt_elf.c, elf_check_arch叫做。这是一个定义在的宏拱门/x86/include/asm/elf.h64 位处理程序与 32 位处理程序中的定义不同。对于 64 位,它与EM_X86_64(62 - 在 include/uapi/ilnux/elf-em.h 中定义)。对于 32 位,它与EM_386 (3) or EM_486(6)(在同一文件中定义)。如果比较失败,二进制处理程序就会放弃,因此我们最终只有一个处理程序负责 ELF 解析和执行 - 取决于 ELF 是 64 位还是 32 位。

因此,在 64 位 Linux 中解析 32 位 ELVE 与 64 位 ELVE 的所有差异都应该在该文件中找到文件系统/compat_binfmt_elf.c.

主要线索似乎是兼容启动线程. 启动线程被重新定义为兼容启动线程。该函数定义位于拱门/x86/内核/process_64.c. 兼容启动线程然后打电话启动线程公共有了这些论点:

start_thread_common(regs, new_ip, new_sp,
             test_thread_flag(TIF_X32)
             ? __USER_CS : __USER32_CS,
             __USER_DS, __USER_DS);

而正常的启动线程函数调用启动线程公共有了这些论点:

start_thread_common(regs, new_ip, new_sp,
             __USER_CS, __USER_DS, 0);

在这里我们已经看到依赖于架构的代码做了一些事情CS64 位 ELVE 与 32 位 ELVE 的情况有所不同。

然后我们有 __USER_CS 和 __USER32_CS 的定义拱门/x86/include/asm/segment.h:

#define __USER_CS           (GDT_ENTRY_DEFAULT_USER_CS*8 + 3)
#define __USER32_CS         (GDT_ENTRY_DEFAULT_USER32_CS*8 + 3)

and:

#define GDT_ENTRY_DEFAULT_USER_CS   6
#define GDT_ENTRY_DEFAULT_USER32_CS 4

So __USER_CS是 6*8 + 3 = 51 = 0x33

And __USER32_CS是 4*8 + 3 = 35 = 0x23

这些数字与这些示例中用于 CS 的数字相匹配:

  • 用于在进程中间从 64 位模式切换到 32 位模式 https://stackoverflow.com/a/48855022/5744809
  • 用于在进程中间从 32 位模式切换到 64 位模式 https://stackoverflow.com/a/48855906/5744809

由于CPU不是运行在实模式下,段寄存器填充的并不是段本身,而是一个16位选择器:

来自维基百科(保护模式 https://en.wikipedia.org/wiki/Protected_mode):

在保护模式下,segment_part 被 16 位选择器取代,其中 13 位高位(位 3 至位 15)包含描述符表内条目的索引。下一位(位 2)指定该操作是与 GDT 还是与 LDT 一起使用。选择器的最低两位(位 1 和位 0)组合起来定义请求的权限,其中 0 和 3 的值分别表示最高和最低权限。

当 CS 值为 0x23 时,位 1 和 0 是3,意思是“最低权限”。位 2 是0, 意义GDT,位 3 到位 15 是 4,这意味着我们得到index 4来自全局描述符表(GDT)。

这就是迄今为止我能够挖掘的距离。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

64位linux内核如何从ELF启动32位进程 的相关文章

  • 可以作为命令行参数传递多少数据?

    在 Linux 下生成进程时可以发送多少字节作为命令行参数 gahooa 推荐了一篇好文章http www in ulm de mascheck various argmax http www in ulm de mascheck vari
  • x86 程序集 Pushl/popl 不适用于“错误:后缀或操作数无效”

    我是汇编编程的新手 正在努力解决编程基础 http savannah nongnu org projects pgubook 在带有 GNU 汇编器 v2 20 1 的 Ubuntu x86 64 桌面上 我已经能够汇编 链接执行我的代码
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • 我可以在 Ubuntu 上使用 Homebrew 吗?

    我只是尝试使用 Homebrew 和 Linuxbrew 在我的 Ubuntu 服务器上安装软件包 但都失败了 这就是我尝试安装它们的方法 sudo apt get install build essential curl git m4 r
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 如何使用 PyAudio 选择特定的输入设备

    通过 PyAudio 录制音频时 如何指定要使用的确切输入设备 我的电脑有两个麦克风 一个内置 一个通过 USB 我想使用 USB 麦克风进行录音 这流类 https people csail mit edu hubert pyaudio

随机推荐

  • 为什么 Visual Studio Code Git 显示驱动器上的所有更改?

    我在 Macbook 上使用 Visual Studio Code 1 6 0 我发现 VS Code 的 Git 列出了大量更改 甚至是那些不在我的工作文件夹中的更改 当我将鼠标悬停在这些上时 我会得到一个工具提示 该文件位于当前工作区之
  • 按顺序拆分 Parallel.Foreach 循环上的负载

    我需要处理列表中的一百万个元素 将它们粗暴地扔进并行 ForEach只会让CPU饱和 相反 我将元素主列表分成几部分 并将子列表放入并行循环中 List
  • 我可以在 SSRS 中跨数据源“加入”吗?

    我有两个数据源 一个 Oracle 和一个 Sql Server 由于我之前的情况 就像我发现它时的情况一样 Oracle 数据库中的某些列包含来自 Sql Server 数据库中的查找表的 PK 我正在尝试创建一个 Sql Server
  • 如何在Notepad++中删除当前行并添加新行?

    如何在Notepad 中删除当前行并添加新行 这两个操作很常见 但我找不到任何关键设置如何在 Notepad 中执行它们 任何插件都可以完成这项工作吗 Ctrl L cuts the current line and Ctrl Shift
  • 我可以 gzip 压缩所有 html 内容(页面)吗

    我试图找出定义哪些页面应该进行 gzip 压缩以及何时发送纯 html 内容是否有任何原则 如果你们可以分享您在 gzip 压缩项目的一部分时所做的决定 那将会很有帮助 一个好主意是进行基准测试 对比数据下降的速度有多快 压缩得有多好 如果
  • MIPS:求 5 个整数的平均值

    客观的 根据用户输入 使用五个寄存器查找平均值 Example 1 3 2 9 4 Output 3 输出是 3 因为 3 8 是小数 我希望它是整数 我的目标是不使用数组 但我在添加所有 5 个寄存器时遇到问题 data prompt1
  • 多索引数据帧删除每组最大值的行

    我有一个像这样的多索引数据框 PID Fid x y A 1 2 3 2 6 1 3 4 6 B 1 3 5 2 2 4 3 5 7 我想删除每个患者 PID 具有最高 x 值的行 我需要获取一个包含剩余行和所有列的新数据框 以继续对这些数
  • 使用 Swift 将自定义“数字”图像添加到 SKLabelNode 作为 SpriteKit 中的分数

    我基本上想在 Singles 中添加自定义字体编号 带有图像 并使用 SpriteKit 在我的游戏中添加它们作为我的分数 这是字体图像样式 它们是从 0 到 9 的数字 一段时间以来我一直在试图解决这个问题 我不确定您是否可以将其添加到
  • 如何为 fllot 中的条形图赋予纯色

    我需要为条形图提供纯色 我已关注此链接条形图示例 http www saltycrane com blog 2010 03 jquery flot stacked bar chart example 但我想要提供纯色 而且我还需要自己改变颜
  • 如何获取第一次发生的事件,然后抑制事件 2 秒(RxJS)

    我认为 RxJS 应该完全适合抑制重复按钮点击 2 秒 然而 我在实施过程中遇到了困难 var button myButton button button toObservable click Throttle 2000 Wouldn t
  • 暂停和恢复 Android Repo 同步

    我正在尝试同步以下存储库 repo init u git github com SlimRoms platform manifest git b jb 问题是我大约 30 小时前就开始了仓库同步 但它仍然没有完成 我有 1Mbps 连接 我
  • 如何防止 Firefox 在按 ctrl 和 + 时放大?

    我正在尝试在 Firefox 中使用 ctrl 和 组合来为我们的 Web 应用程序执行不同的操作 当我们的 Web 应用程序正在侦听此事件时 如何防止 Firefox 缩放 我不想更改 Firefox 中的设置 但希望代码以某种方式执行此
  • Tkinter 中的按钮命令

    我正在尝试使用 tkinter 进行一次文本冒险 并且正在慢慢地将一些东西组合在一起 我试图显示从一个房间到另一个房间的命令 但即使按钮出现 当我按下它们时什么也没有发生 game py usr bin python coding utf
  • 在 Kibana 4 中向导航栏添加页面

    我正在尝试向 Kibana 4 添加欢迎 介绍页面 并且需要修改导航菜单 我在 src kibana plugins kibana kibana html 找到了导航源 html 文档 但无法弄清楚选项卡名称是从哪里注入的 这是进行调用的列
  • 使用 VS 11、.NET 4.5 和实体框架时生成错误

    在 Visual Studio 2010 中 我的解决方案使用 NET 4 2 实体框架 2011 年 6 月 CTP 因此我可以在实体框架中使用空间类型 当我升级到 Visual Studio 11 Beta 时 由于 4 2 和 4 5
  • 异常未传播到 Apache Camel 中的错误处理程序

    我有一条定义 doTry doCatch 块的路线 当在 doCatch 块中处理异常时 我希望将其传播到错误处理程序 以确保消息在本地处理后添加到死信队列中 问题是我无法让错误处理程序的传播正常工作 defaultErrorHandler
  • 将@interface放入.m文件中的逻辑是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 h 和 m 文件中 interface 定义的区别 https stackoverflow com questions 3967187 difference between interface def
  • Android 5.0:如何更改最近使用的应用程序标题颜色?

    我正在使用 AppCompat 并且我的主题正在扩展Theme AppCompat Light DarkActionBar 当我在 Android 5 Lollipop 中按下最近使用的应用程序按钮时 我的应用程序会出现dark标题而不是
  • “DoCmd.OutputTo acOutputQuery”正在删除查询

    我遇到了一个问题DoCmd OutputTo acOutputQuery第二次运行时删除查询本身 这个错误有任何解决方法 补丁吗 至少对我来说似乎是一个错误 回复 你的评论 您是否进行了文件复制 或者是否在两个数据库之间复制了对象 如果是第
  • 64位linux内核如何从ELF启动32位进程

    通过查看binfmt elf c https elixir bootlin com linux v3 5 source fs binfmt elf c在内核源代码中 我无法弄清楚内核 64 位 在生成 32 位进程与 64 位进程时有何不同