Box86源码解读记录

1. 背景说明

Github地址:https://github.com/ptitSeb/box86

官方推荐的视频教程:Box86/Box64视频教程网盘

2. 程序执行主体图

Box86版本: Box86 with Dynarec v0.3.4

在这里插入图片描述
主函数会执行一大堆的初始化工作,包括但不限于:BOX上下文 、内存部局、空间分配、x86指令模拟器、ELF文件 、依赖库文件、所有准备工作完成之后,在x86模拟器中按着IP指针,开始顺序解释执行代码块

3. 代码说明-main函数

/src/main.c
因为main函数代码量比较大,下边是精简后的代码,省略了大部分非主干流程代码,这样看起来就容易很多了。

int main(int argc, const char **argv, char **env)
{init_malloc_hook();init_auxval(argc, argv, environ?environ:env);.........//创建一个Box86的上下文、这个上下文将会持有着,在转译时可能用到的全部信息my_context = NewBox86Context(argc - nextarg);//检查并读取必须用到的环境变量信息(例如:LD_LIBRARY_PATH、BOX86_EMULATED_LIBS、libssl.so、BOX86_PATH 等等)LoadEnvVars(my_context);.........//通过 ParseElfHeader 方法将当前要执行 ELF 文件的头信息解析出对应的 elfheader_t 结构 elfheader_t *elf_header = LoadAndCheckElfHeader(f, my_context->fullpath, 1);/* 将 ELF 头信息添加到当前Box86的上下文中CalcLoadAddr(elf_header); //这个函数的作用是根据 ELF 文头信息来计算或确定一些关键的内存布局参数。(包括虚拟地址(vaddr)、物理地址(paddr)、内存大小(memsz)、对齐(align)、栈大小(stacksz)、栈对齐(stackalign)、TLS(线程局部存储)等等)*/AddElfHeader(my_context, elf_header);//根据 ELF 头部信息设置内存布局if(CalcLoadAddr(elf_header)) {printf_log(LOG_NONE, "Error: reading elf header of %s\n", my_context->fullpath);free_contextargv();FreeBox86Context(&my_context);FreeCollection(&ld_preload);FreeElfHeader(&elf_header);return -1;}//根据 ELF 头部信息和内存布局参数,来为 ELF 文件的加载分配内存。if(AllocLoadElfMemory(my_context, elf_header, 1)) {printf_log(LOG_NONE, "Error: loading elf %s\n", my_context->fullpath);free_contextargv();FreeBox86Context(&my_context);FreeCollection(&ld_preload);FreeElfHeader(&elf_header);return -1;}/*设置bss段空间以及未初始化的静态和全局变量空间
CalcStackSize(my_context); //计算栈空间大小以及内存对齐方式,初始值为8M空间、4Byte对齐,再根据context->elfs数组值来遍历,如果数组中有值大于初始值,则调整为数组中的最大值, 然后用 mmap 分配空间*/my_context->brk = ElfGetBrk(elf_header);.........//通过Box86的上下文配置,调用internalX86Setup创建了一个X86运行的模拟器x86emu_t *emu = NewX86Emu(my_context, my_context->ep, (uintptr_t)my_context->stack, my_context->stacksz, 0);// stack setup is much more complicated then just that!SetupInitialStack(emu); //设置x86模拟器初始栈SetupX86Emu(emu);//按照X86应用程序的逻辑main函数的加载过程一样 ,将应用程序的参数加到EAX和EBX,以此来模拟X86程序的启动SetEAX(emu, my_context->argc);SetEBX(emu, (uint32_t)my_context->argv);.........//负责解析ELF文件中的符号信息,并将它们分类到不同的符号表中,以便于后续的符号解析和链接使用AddSymbols(my_context->maplib, GetMapSymbols(elf_header), GetWeakSymbols(elf_header), GetLocalSymbols(elf_header), elf_header);.........//负责在加载主 ELF 文件时,将其信息添加到链接映射中,以便动态链接器可以正确地解析符号和执行重定位。AddMainElfToLinkmap(elf_header);.........//解析 ELF 文件的动态依赖,并加载相应的库if(LoadNeededLibs(elf_header, my_context->maplib, 0, 0, my_context, emu)) {printf_log(LOG_NONE, "Error: loading needed libs in elf %s\n", my_context->argv[0]);FreeBox86Context(&my_context);return -1;}.........//解释运行X86程序 DynaRun(emu);// Get EAXint ret = GetEAX(emu);.........return ret;
}

4. 代码说明-xxx函数

5. 代码说明-xxx函数

6. 代码说明-xxx函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARMv8/v9 系统寄存器 4 -- ARMv8 通用寄存器详细介绍】

文章目录 ARMv8 通用寄存器通用寄存器X30 寄存器和链接寄存器(LR)程序计数器(PC)ARMv8 X30和PC之间的关系小结 ARMv8 通用寄存器 在ARMv9架构中(这也适用于ARMv8,因为ARMv9是其进化版本)&#…

腾讯云coding代码托管平台配置问题公钥拉取失败提示 Permission denied(publickey)

前言 最近在学校有个课设多人开发一个游戏,要团队协作,选用了腾讯云的coding作为代码管理仓库,但在配置的时候遇到了一些问题,相比于github,发现腾讯的coding更难用,,,这里记录一下…

如何设计与管理一个前端项目

目录 前端项目设计 前端项目搭建 洞察项目瓶颈 方案调研与选型对比 前端项目管理 合理的分工排期 风险把控 及时反馈与复盘 结束语 如果说基础知识的掌握是起跑线,那么使大家之间拉开差距的更多是前端项目开发经验和技能。对于一个项目来说,从框…

【Android Studio】【NCNN】YOLOV8安卓部署

目录 下载Android Studio 克隆安卓项目 关于自训练模型闪退问题 下载Android Studio 下载Android Studio,配置安卓开发环境,这个过程比较漫长。 安装cmake,注意安装的是cmake3.10版本。 根据手机安卓版本选择相应的安卓版本&#xff0c…

彻底解决python的pip install xxx报错(文末附所有依赖文件)

今天安装pip install django又报错了: C:\Users\Administrator>pip install django WARNING: Ignoring invalid distribution -ip (d:\soft\python\python38\lib\site-pac kages) Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting djan…

论文阅读:The Unreasonable Ineffectiveness of the Deeper Layers 层剪枝与模型嫁接的“双生花”

作者实证研究了针对流行的开放式预训练 LLM 系列的简单层修剪策略,发现在不同的 QA 基准上,直到去掉一大部分(最多一半)层(Transformer 架构)后,性能的下降才会降到最低。为了修剪这些模型&…

探索 IPv6 协议:互联网的新一代寻址

目录 一.概述 IPv4 的问题和 IPv6 的新特性 IPv6 协议体系 二.IPv6 寻址架构:巨大的地址空间与灵活的寻址模式 IPv6 寻址概述 地址表示方法 地址前缀与地址类型标识 单播地址 任播地址 多播地址 特殊的 IPv6 地址 IPv6 主机与路由器寻址 地址分配 三.I…

数控六面钻适用场景-不止家具制造

在快节奏的现代生活中,家具作为我们生活的重要组成部分,其美观度和实用性日益受到人们的关注。而在这背后,一个不可或缺的“工匠”正默默地发挥着它的作用——那就是数控六面钻。 数控六面钻,顾名思义,是一种高度自动…

关于测试管理后台,生成表单-审核表单,删除表单的测试总结

测试的时候,我们经常遇到一些生成表单状态进行审核,关于这个想了一些测试点,记录分享下。 通过2方面去考虑即可 1,权限-审核权限 权限的实现需要确定到底是低代码平台自己所带的工作流还是自己完全代码实现逻辑; 如…

msix packaging tool打包问题

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Java开发:Java代码实现电脑文件拷贝(包含文件、视频、音频)、并做了 IO 读写性能优化。

文章目录 Java文件拷贝效果演示代码示例: Java文件拷贝 效果演示 Java实现电脑文件拷贝 代码示例: package com.makefullstack.myio.test;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class…

2024-AIDD-人工智能药物设计-利用深度学习优化中药复方益气解毒方对胶质母细胞瘤靶点的药物设计研究

利用深度学习优化中药复方益气解毒方对胶质母细胞瘤靶点的药物设计研究 1. 引言 1.1 研究背景与意义 1.1.1 胶质母细胞瘤的治疗现状 1.1.1.1 胶质母细胞瘤的流行病学 1.1.1.1.1 全球与地区发病率对比 1.1.1.1.2 年龄与性别分布统计 1.1.1.2 传统治疗手段的局限性 1.1.1…

k8s集群部署

部署k8s集群 要求: 主机192.168.199.149(master)node节点(192.168.199.150,192.168.199.151)2个cpu或更多 所有机器可以联网,湖湘之间可以ping同,关闭防火墙,selinux,…

多模态模型Mini-Gemini:代码模型数据均开源,MiniCPM小钢炮2.0全家桶四连发,可以在Android 手机端上运行的大模型,效果还不错

多模态模型Mini-Gemini:代码模型数据均开源,MiniCPM小钢炮2.0全家桶四连发,可以在Android 手机端上运行的大模型,效果还不错。 多模态模型Mini-Gemini:代码模型数据均开源 香港中文大学终身教授贾佳亚团队提出多模态模…

国内注册Claude 3流程

国内注册Claude 3流程 Claude 3是什么注册过程准备国外IP节点准备谷歌账号或者邮箱准备接码平台接码平台WildCard输入验证码继续注册 使用聊天功能识图功能文件解析编码能力 Cloud 3 已经推出两个月了,当时可是轰动一时,但是其并不对国内开放&#xff0c…

提取网页元数据的Python库之lassie使用详解

概要 Lassie是一个用于提取网页元数据的Python库,它能够智能地抓取网页的标题、描述、关键图像等内容。Lassie的设计目的是为了简化从各种类型的网页中提取关键信息的过程,适用于需要预览链接内容的应用场景。 安装 安装Lassie非常简单,可以通过Python的包管理器pip进行安…

nodejs后台babel在线热编译jsx

浏览器加载react/vue组件时,遇到es6转es5,jsx转js...时,一种方法是用webpack离线编译,一种方法是在后台用babel在线热编译(为了效率部署前可以预热)。 我比较喜欢在线热编译,好处是发布时快&am…

C++动态内存管理:与C语言动态内存管理的差异之争

当你改错一行代码的时候: 当你想要重构别人的代码时: 目录 前言 一、C/C的内存分布 二、C/C语言中的动态内存管理 三、new与delete的实现原理 总结: 前言 在C中,内存管理是一个至关重要的主题。正确地管理内存可以避免内存泄…

TriCore: Architecture

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的笔记,稍作整理方便查阅,错误之处,还请指正,谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

博客搭建666

title: 博客搭建 date: 2021-01-31 22:51:49 tags: hexo categories: 生活 toc_number: true篇幅有限 完整内容及源码关注公众号:ReverseCode,发送 冲 Hexo https://nodejs.org/download/release/v10.15.3/ 安装node npm install -g cnpm --registry=https://registry.npm…