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函数
相关文章:
Box86源码解读记录
1. 背景说明 Github地址:https://github.com/ptitSeb/box86 官方推荐的视频教程:Box86/Box64视频教程网盘 2. 程序执行主体图 Box86版本: Box86 with Dynarec v0.3.4 主函数会执行一大堆的初始化工作,包括但不限于:BOX上下文 …...
Azure AKS日志查询KQL表达式
背景需求 Azure(Global) AKS集群中,需要查询部署服务的历史日志,例如:我部署了服务A,但服务A的上一个版本Pod已经被杀掉由于版本的更新迭代,而我在命令行中只能看到当前版本的pod日志ÿ…...
Set接口
Set接口的介绍 Set接口基本介绍 无序(添加和取出的顺序不一致),没有索引不允许重复元素,所以最多包含一个nullJDK API中Set接口的实现类:主要有HashSet;TreeSet Set接口的常用方法 和List 接口一样&am…...
vue2结合element-ui实现TreeSelect 树选择功能
需求背景 在日常开发中,我们会遇见很多不同的业务需求。如果让你用element-ui实现一个 tree-select 组件,你会怎么做? 这个组件在 element-plus 中是有这个组件存在的,但是在 element-ui 中是没有的。 可能你会直接使用 elemen…...
Python运维之定时任务模块APScheduler
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 定时任务模块APScheduler 一、安装及基本概念 1.1、APScheduler的安装 1.2、涉及概念 1.3、APScheduler的工作流程编辑 二、配置调度器 …...
Linux技能
文章目录 Linux2024心得优秀博客 Linux2024 心得 会一些基本的命令,解决生产的问题有时候会用的到 优秀博客 02、Linux相关工具及操作03、Linux实用指令 cat xxx | grep “xx xx” 这个应用在从大量的日志文件中找到报错的信息 04、Linux高级部分05、JavaEE定制…...
算法有哪些分类
算法的分类可以根据不同的标准来进行,以下是一些常见的算法分类: 基本算法分类: 搜索算法:包括线性搜索、二分搜索、哈希搜索、深度优先搜索(DFS)、广度优先搜索(BFS)等。 排序算法…...
面试经典150题——找出字符串中第一个匹配项的下标
面试经典150题 day23 题目来源我的题解方法一 库函数方法二 自定义indexOf函数方法三 KMP算法 题目来源 力扣每日一题;题序:28 我的题解 方法一 库函数 直接使用indexOf函数。 时间复杂度:O(n) 空间复杂度:O(1) public int str…...
.Net MAUI 搭建Android 开发环境
一、 安装最新版本 VS 2022 安装时候选择上 .Net MAUI 跨平台开发 二、安装成功后,创建 .Net MAUI 应用 三、使用 VS 自带的 Android SDK 下载 ,Android镜像、编译工具、加速工具 四、使用Vs 自带的 Android Avd 创建虚拟机 五、使用 Android 手机真机调试...
编译适配纯鸿蒙系统的ijkplayer中的ffmpeg库
目前bilibili官方的ijkplayer播放器,是只适配Android和IOS系统的。而华为接下来即将发布纯harmony系统,是否有基于harmony系统的ijkplayer可以使用呢? 鸿蒙版ijkplayer播放器是哪个,如何使用,这个问题,大家…...
离线维护麒麟操作系统
1 本地源设置 a 首先传输一个镜像ISO文件到离线系统。 b 加载镜像文件作为源文件。 #mkdir /mnt/cdrom #mount -o path/镜像.iso /mnt/cdromc 修改源文件 # cd /etc/yum.repo.d/ # vi base.repo 修改baseurl file:///mnt/cdrom d update &install 然后就可以愉快的…...
leetcode尊享面试——二叉树(python)
250.统计同值子树 使用dfs深度搜索,同值子树,要满足三个条件: 对于当前节点node,他的左子树血脉纯净(为同值子树),右子树血脉纯净(为同值子树),node的值等于…...
macbookpro 安装linux mint 无线wifi无法连接 解决方案
见欢迎页面—驱动管理...
抖音小店如此内卷,现在还值得投入吗?还能赚到钱吗?
大家好,我是电商笨笨熊 抖音小店已经经历4-5年的风霜,所以现在很多还未入驻的玩家都会有一个顾虑; 担心现在进入抖店是都还具备发展空间,还能不能赚到钱; 尤其是当一片市场逐渐加入越来越多商家的时候平台一定会内卷…...
Java基础知识(11)
Java基础知识(11) (包括:IO流高级流,网络爬虫基础,Commons-i0工具包和Hutool工具包) 目录 Java基础知识(11) 一.IO流高级流 1.缓冲流 【1】字节缓冲流 ࿰…...
iOS——SDWebImage源码学习
什么是SDWebImage SDWebImage是一个流行的iOS和macOS平台上的开源库,用于异步加载和缓存网络图片。它提供了一套简单易用的API,使得在应用中加载网络图片变得更加方便和高效。 主要特点和功能: 异步加载:SDWebImage通过异步方式…...
信创基础软件之中间件
信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件,位于应用与操作系统、数据库之间,主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题,是分布式环境下支撑应用开发、运…...
在Ubuntu linux操作系统上操作MySQL数据库常用的命令
检查是否安装了MySQL,或检查MySQL的状态: sudo systemctl status mysql或 sudo systemctl status mysql.service如果mysql有安装,上面这条命令会返回mysql的状态active或inactive。 卸载mysql数据库 第一步是停了数据库: sud…...
前端科举八股文-JAVASCRIPT篇
前端科举八股文-JAVASCRIPT篇 Js的变量类型,区别是什么平时有用过symbol吗函数闭包的理解?js的原型链? Function Function.constructor 返回值?promise的出现是为了解决什么问题?前端中的事件流事件委托?js的new操作符做了哪些…...
Docker私有仓库与Harbor部署使用
目录 一、本地私有仓库 1. 下载registry镜像 2. 在daemon.json文件中添加私有镜像仓库地址 编辑 3. 运行registry容器 4. Docker容器的重启策略如下 5. 为镜像打标签 6. 上传到私有仓库 7. 列出私有仓库的所有镜像 8. 列出私有仓库的centos镜像有哪些tag 9. 先删…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
