bbhost HLE Layer 实现解析:PS4 系统库的 PC 版重写——文件、线程、音频、网络与 NP

发布时间:2026/11/2 6:23:47
bbhost HLE Layer 实现解析:PS4 系统库的 PC 版重写——文件、线程、音频、网络与 NP 【免费下载链接】bbhostDefinitive Bloodborne PC Experience项目地址https://gitcode.com/gh_mirrors/bb/bbhost点击查看免费下载bbhost 是一款在 Windows 和 Linux 上原生运行《Bloodborne》的移植层——游戏自身的 x86-64 代码直接跑在 PC CPU 上而它依赖的 PS4 系统库则由 bbhost 的 HLE 层高层仿真层以 PC 版重写来应答。这篇文章逐模块解析这套 HLE 实现文件系统如何沙箱化、线程同步如何重建于 futex、音频与影片如何回放、以及联机功能如何靠私有服务器加 P2P UDP 完整落地帮你理解一个不做模拟机的项目是怎么把 660 个系统调用全部接住的。为什么是 HLE利用 PS4 是 x86-64 的免模拟路线 大多数模拟器需要解释或重编译目标 CPU 的指令而 PS4 的 CPU 本身就是 x86-64——游戏代码不需要翻译只需要一个可以住的地方。bbhost 的做法因此分两半CPU 侧原生运行加载游戏的 ELF 可执行文件完成重定位把它的导入符号链接到 bbhost 自己的实现见 src/core/elf.cpp然后直接启动系统库全部重写游戏从 PS4 系统库导入的 660 个命名函数每一个都由 src/hle/ 下的 PC 实现应答——这就是 HLE 层的职责范围。所有模块在 src/hle/modules.h 中注册启动时由 src/hle/runtime.cpp 的register_hle()依次挂入模块文件职责libc.cpp / pthread.cppC 标准库与线程 APIfs.cpp / fios.cpp文件与异步文件操作kernel.cpp内存管理与进程原语audio.cpp / avplayer.cpp音频输出与影片播放net.cpp / np_matching2.cpp网络套接字与 PlayStation NetworkHLE 函数绑定机制系统调用如何接到 PC 实现上 HLE 层与游戏代码之间通过 ELF 的导入表import table对接。src/hle/runtime.cpp 中的hle_make_stub为每个导入符号生成一个 stub 地址并写入 GOT 表项src/hle/stub_table.inc 是一张自动生成的 768 项跳板表未被认领的调用会落入hle_unknown_log在日志中记录函数名和 NID方便开发者追踪尚未实现的系统调用。这个设计带来两个实际好处一是每次漏实现都留下可审计的痕迹而不是静默崩溃二是 HLE 函数以GUEST_ABI调用约定编译与游戏代码在同一个进程里零开销互调。文件系统重写沙箱路径映射与 Mod 叠加层 文件层是 HLE 中最用户可感知的部分。src/hle/fs.cpp约 1500 行实现了带沙箱的路径映射器游戏看到的/app0、/savedata0等 PS4 路径只被映射到配置中允许的宿主机目录——g_allowed_roots 之外的路径一律不可达保证游戏进程碰不到玩家磁盘上的其他东西。几个值得注意的细节只读 dump 原则游戏本体目录刻意保持只读玩家修改走叠加层overlay。src/hle/fs.h 中mods目录会在/app0读取之前优先解析修改过的资产永远不必写回 dump 本身叠加层性能优化多层 overlay 逐层探测路径的开销曾被实测为每次文件打开约 0.1 ms因此引入了 OverlayIndex 索引命中索引的路径不再落盘探测异步文件操作src/hle/fios.cpp 实现sceFios2的文件/目录句柄与异步 API内部同步完成句柄表用互斥锁保护错误码精确还原SCE_FIOS_ERROR_*定义。线程与同步gsync 竞技场与 futex 线程层是 HLE 中最精巧的部分。游戏线程控制块gsync::Thread是游戏代码自己会读取的结构bbhost 的 ThreadBody 必须恰好嵌进这 248 字节的槽位——static_assert直接约束了这一点。同步原语则集中在 src/hle/sync.cpp固定地址竞技场sync arena 在0xE000000000处 mmap 出 64 MiB因为游戏代码会按 40 位掩码解析互斥锁持有者地址且垃圾句柄必须可识别并拒绝跨平台 futex锁等待底层走 core/futex.cppWindows 上映射到条件变量与事件Linux 上用原生 futex错误码换算游戏使用 FreeBSD 风格的 errnoPS4 API 又期望0x8002xxxx错误格式pthread.cpp 用一行sce()完成换算。音频与视频48 kHz 音频端口与 ATRAC9 影片 音频层很克制。src/hle/audio.cpp 用AudioPort结构跟踪每个sceAudioOut端口采样率、声道、位深端口数据最终送入宿主机音频SDL3而语音/麦克风相关 API 全部返回成功但静音的空实现避免游戏代码在语音路径上空转。影片播放由 src/hle/avplayer.cpp 负责用 FFmpeg 解封装音频用 third_party/libatrac9/ 解码 PS4 的 ATRAC9 格式帧节奏与游戏翻帧同步过场动画因此能和画面保持一致的速度。网络与 NP合作、入侵与召唤符在 PC 上如何工作 联机是 HLE 层里工程量最大的部分之一。《Bloodborne》的联机功能建立在 PS4 的 NP Matching2、Signaling、WebAPI 与 Auth 之上bbhost 用私有服务器加 P2P UDP 完整替换了 FromSoftware 的原生服务详见 docs/online.md匹配游戏的 Matching2 调用创建/搜索/加入房间、成员事件全部转发到私有服务器的会话服务——np_matching2.cpp 负责翻译游戏规则本身仍由游戏代码决定信号与打洞np_signaling.cpp 实现 P2P 连接状态机配合 src/net/stun.cpp 的 STUN 地址学习与 NAT 打洞打洞失败时服务器可中转流量跨平台套接字src/hle/net.cpp 用一层薄抽象抹平 winsock 与 BSD socket 的差异WSAGetLastError映射到 POSIX errno、WSAPoll对应poll让同一套 HLE 代码在两个平台上行为一致。公共服务器的连接参数写在bbhost.toml中[online] host thehuntersdream.com scheme https require_account true账号没有密码PC 通过 Discord 或恢复码绑定账号账号名即游戏内联机 ID由 src/hle/system.cpp 的sceNpGetOnlineId应答。内核与内存模拟 6 GiB PS4直接内存 所有 HLE 模块的地基是 src/hle/kernel.cpp 实现的内存管理。PS4 向游戏暴露一块 6 GiB 的直接内存direct memoryCPU 与 GPU 通过同一块物理内存访问。bbhost 的做法是在 固定低位虚拟地址 上分配后备Linux 用 memfdWindows 用 section因为 Gnm 地址是 40 位地址必须落在特定窗口维护 活跃映射快照供 GPU 页表按需导入提供 写监视 接口让纹理缓存能侦测游戏对 GPU 内存的 CPU 侧写入——这是没有任何调用告知过的内存变化的唯一发现途径。总结一套可审计的系统库重写 ✅HLE 层的工程特点可以概括为三点沙箱化游戏只够得到配置允许的目录与虚拟地址窗口、可审计未实现调用、文件缺失、崩溃路径都留下日志痕迹如 hle_dl_panic 会顺带打印最近打开的文件清单、双平台同构一套代码靠薄抽象适配 Windows 与 Linux。想继续深入了解建议按这个顺序阅读运行与配置docs/running.md联机实现细节docs/online.md图形侧HLE 的兄弟系统docs/rendering.md游戏函数重写docs/decomp.md对 HLE 层源码感兴趣的读者可以从 src/hle/hle.h 的入口接口读起再沿着register_hle()的注册顺序逐个模块走一遍基本就能看到全部 660 个系统调用是如何被接住的。赞分享【免费下载链接】bbhostDefinitive Bloodborne PC Experience项目地址https://gitcode.com/gh_mirrors/bb/bbhost点击查看免费下载相关推荐5000 行 C 代码干掉整个 PS4 系统库HLE 运行时怎么让原版血源直接在 PC 上跑5000 行 C 代码干掉整个 PS4 系统库HLE 运行时怎么让原版血源直接在 PC 上跑 2026 年秋《血源诅咒》——这款独占 PS4 超过十年的作品逆向工程图形学系统编程从零重写一整套PS4系统库driveclub-recomp的libkernel再实现线程、互斥锁、信号量与TLS实战解读从零重写一整套PS4系统库driveclub recomp的libkernel再实现线程、互斥锁、信号量与TLS实战解读 driveclub recompgow3_pc运行时原理387个PS4系统API如何被逐一重写从音频到存档全实现gow3_pc运行时原理387个PS4系统API如何被逐一重写从音频到存档全实现 gow3_pc 是一个《战神3 重制版》God of War III R逆向工程图形学游戏开发上一篇Prisma 本地集群 MySQL 数据库直连SQL Database Access实战指南下一篇微信防撤回补丁实测3分钟装好撤回的消息再也拿不走了创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考