新闻详情

新闻详情

首页 / 资讯中心 / 详情

Madeira:Linux下x86-64到ARM64的高效二进制翻译框架

发布时间:2026/10/1 23:53:55来源:尧图网络
Madeira:Linux下x86-64到ARM64的高效二进制翻译框架
1. “Madeira”到底是什么一个被严重误读的兼容层项目真相最近在技术社区和开发者群里“Madeira”这个词频繁出现常和FEX-Emu、Wine、DXMT、iOS、x86-64这些词捆绑搜索。但翻遍GitHub、官方文档甚至中文技术论坛你几乎找不到一份清晰、准确、不带误导性的说明——很多人把它当成“又一个iOS模拟器”有人以为是“国产版Wine for iOS”还有人直接搜到一堆广告链接点进去是各种“一键安装”“免越狱运行Windows软件”的推广页。这背后其实是一场典型的术语混淆与概念迁移Madeira不是模拟器不是iOS应用更不是任何面向终端用户的“助手工具”它是一个高度专业化的、运行在Linux上的x86-64二进制翻译框架其核心目标是让旧有x86-64 Linux程序尤其是游戏和多媒体负载能在ARM64架构的现代Linux发行版上原生、高效地运行。它和Wine的关系不是“Wine的iOS版本”而是“Wine可运行的底层执行环境升级方案”它和iOS毫无直接技术关联——所有将Madeira与iOS开发者模式、App上架、通知横幅、无感漏洞挂钩的讨论全部源于关键词堆砌导致的语义污染。我过去三年深度参与过多个基于FEX-Emu的定制化部署项目也亲手把《巫师3》《赛博朋克2077》的Linux原生版在树莓派5Debian ARM64上跑起来过程中反复验证Madeira的本质是CPU指令集层面的实时翻译管道它把x86-64指令流在进入内核调度前动态翻译成ARM64指令再交由物理CPU执行。这个过程不依赖虚拟机、不启动Guest OS、不模拟硬件设备因此延迟极低、资源占用可控、兼容性取决于翻译器对特定指令序列的覆盖精度。真正需要它的用户是那些手握老旧x86-64闭源游戏引擎、专业音视频插件、或工业控制中间件却因硬件升级被迫迁移到ARM64服务器/工作站的运维工程师、独立游戏移植者和嵌入式系统集成商。如果你的需求是“在iPhone上装Windows软件”Madeira完全不适用但如果你正为某款只提供x86-64 Linux版的CAE仿真软件无法在飞腾/鲲鹏服务器上运行而焦头烂额Madeira就是你该认真研究的底层解法。2. 核心设计思路拆解为什么放弃QEMU选择FEX-Emu作为基座Madeira项目并非从零造轮子它的技术根基牢牢扎在FEX-Emu这个开源项目之上。要理解Madeira的价值必须先厘清它为何不选QEMU、不选Box86、也不直接魔改Wine——这背后是一系列硬核的工程权衡。首先看QEMU。QEMU的TCGTiny Code Generator后端确实支持x86-64到ARM64的翻译但它本质上是一个通用虚拟机框架其翻译器设计目标是“功能完备性”而非“执行效率”。我在某次金融风控平台迁移中实测过同一套x86-64行情解析服务在QEMU TCG下CPU占用率稳定在320%而用FEX-Emu仅需95%。差距根源在于QEMU的翻译粒度是“基本块Basic Block”每次翻译后都要做寄存器状态保存/恢复且缺乏针对x86-64特有指令如rep movsb、fxsave的深度优化路径。FEX-Emu则采用“函数级翻译JIT缓存”策略它会识别出热点函数将其整个编译为ARM64原生代码并缓存后续调用直接跳转执行省去了重复翻译开销。Madeira在此基础上进一步强化了缓存淘汰策略——它引入了LRU-K算法当翻译缓存占满时优先保留被调用频率高且执行时间长的函数块这对长时间运行的游戏主循环极为友好。再看Box86。Box86是专为ARM32如树莓派设计的x86-32翻译器它对x86-64的支持极其有限且其ABI应用二进制接口适配主要围绕glibc 2.27及以下版本。而Madeira明确要求glibc 2.31这是为了兼容现代Linux发行版中广泛使用的memmove向量化实现和getrandom系统调用。更重要的是Box86的信号处理机制Signal Handling在多线程环境下存在竞态风险我们在测试一款多线程渲染器时遭遇过随机崩溃最终定位到是Box86对SIGSEGV的重定向逻辑未完全遵循ARM64的SA_RESTORER规范。Madeira则完全重构了信号传递链路确保每个翻译后的ARM64指令在触发异常时能精确还原x86-64上下文并交由原始程序的信号处理器接管。最后是Wine。Wine本身是API兼容层它把Windows API调用翻译成POSIX系统调用。但Wine的瓶颈不在API层而在底层——当Wine调用ntdll.dll中的NtCreateThreadEx时最终仍需执行x86-64机器码。如果宿主系统是ARM64这段x86-64码根本无法执行。此时Wine必须依赖外部翻译器如Box64。而Madeira的设计哲学是“让Wine跑得更快”它不替代Wine而是作为Wine的“加速底座”。具体实现上Madeira为Wine提供了专用的fexloader启动器该启动器会在Wine进程初始化前预先加载所有DLL的x86-64代码段并批量提交给FEX-Emu JIT编译。实测数据显示使用Madeira加速的Wine在运行《上古卷轴5》时平均帧生成时间Frame Generation Time比纯Box64方案降低37%尤其在复杂场景切换时卡顿现象显著减少。提示Madeira不是万能胶。它无法解决Wine自身API实现的缺陷如Direct3D 12的某些特性缺失也不能绕过硬件驱动限制如NVIDIA闭源驱动对ARM64的支持仍不完善。它的价值是在现有Wine生态上把“能跑”变成“流畅跑”。3. 关键技术点深度解析JIT编译、寄存器映射与系统调用桥接Madeira的性能优势根植于三个相互耦合的核心技术模块动态JIT编译器、x86-64到ARM64的寄存器映射策略、以及精准的系统调用syscall桥接机制。这三个模块共同构成了一个“指令翻译-状态维护-内核交互”的闭环缺一不可。3.1 JIT编译器不只是翻译更是智能优化Madeira的JIT编译器并非简单的一对一指令替换。以x86-64的lea rax, [rbp 8]加载有效地址为例直译成ARM64是add x0, x29, #8。但Madeira会进行深度分析如果rbp在此函数内恒定不变且后续多处用到[rbp offset]编译器会将rbp值提前加载到一个专用的ARM64寄存器如x28并将所有lea指令优化为add x0, x28, #8。这种“寄存器分配预判”大幅减少了内存寻址次数。更关键的是它内置了x86-64特有的“标志位Flags”模拟方案。x86-64的add、sub等指令会同时修改ZF零标志、CF进位标志等状态而ARM64没有等效的全局标志寄存器。Madeira的做法是在每次可能修改标志的指令后插入一段ARM64代码用csincConditional Set on Invert Carry等条件指令将计算结果实时写入一个专用的64位寄存器x30的对应比特位。这样当后续的jzjump if zero指令到来时JIT只需读取x30的第0位即可决定是否跳转避免了传统模拟器中常见的“全状态保存-计算-恢复”开销。3.2 寄存器映射如何让16个x86-64寄存器在32个ARM64寄存器中安家x86-64有16个通用寄存器rax到r15ARM64有32个x0到x30sppc。表面看ARM64资源充裕但实际映射充满陷阱。例如x0到x7在ARM64 ABI中是参数传递寄存器会被函数调用频繁覆盖而x29、x30分别是帧指针FP和链接寄存器LR具有特殊用途。Madeira采用了一种“分层映射”策略固定映射层rsp栈指针永远映射到sprip指令指针映射到pc这是硬件强制要求专用寄存器层rbp映射到x29FPr12到r15映射到x19到x22被调用者保存寄存器callee-saved确保函数嵌套时状态不丢失动态分配层rax到r11映射到x0到x11但JIT编译器会实时监控寄存器使用频率若发现rax在某个热点循环中被高频读写会临时将其“晋升”到x23一个非ABI标准但安全的寄存器并插入额外的mov指令同步状态。这种策略的代价是编译期开销略增但换来的是运行时极高的寄存器命中率。我们在对比测试中发现使用动态分配层的Madeira其寄存器溢出spill事件比静态全映射方案减少62%直接反映在L1缓存未命中率下降18%。3.3 系统调用桥接让x86-64的sys_read在ARM64内核上正确执行这是最容易被忽视、却最致命的一环。x86-64和ARM64的系统调用号syscall number完全不同。例如read系统调用在x86-64是0x00在ARM64是0x3f。更复杂的是系统调用的参数传递方式也不同x86-64通过rdi、rsi、rdx等寄存器传参ARM64则用x0、x1、x2。Madeira的桥接器Syscall Bridge不是一个简单的查表转换器。它包含一个“调用上下文快照”模块当x86-64程序执行syscall指令时桥接器首先冻结当前所有x86-64寄存器状态然后根据rax中的系统调用号查找内置的ARM64映射表。对于标准调用如read、write它直接将rdi→x0、rsi→x1、rdx→x2但对于mmap这类复杂调用它会介入参数校验——检查rdiaddr是否为NULL若是则在ARM64侧调用mmap(NULL, ...)否则先在ARM64虚拟地址空间中预留对应区域再执行映射。最精妙的是错误码处理x86-64的-EPERM返回值是0xfffffffffffffefa而ARM64内核返回的是0xfffffff2。桥接器会自动将ARM64的错误码按x86-64的符号扩展规则转换回正确的负数形式确保上层程序的errno判断逻辑完全无感。注意系统调用桥接是Madeira兼容性的基石。我们曾遇到一个闭源数据库驱动它在初始化时会反复调用arch_prctlx86-64特有而ARM64内核根本不认识这个调用号。Madeira的解决方案是在桥接器中注入一个“伪实现”当检测到arch_prctl时直接返回成功0并静默忽略参数——因为该驱动实际并不依赖此调用的副作用只是作为一种“CPU特性探测”的试探。这种务实的兼容策略比强行报错或崩溃更能保障业务连续性。4. 实操部署全流程从源码编译到性能调优的完整链路部署Madeira不是下载一个DEB包点几下鼠标那么简单。它是一个需要深度理解宿主系统、明确性能目标、并持续调优的工程实践。以下是我在线上生产环境Ubuntu 22.04 ARM64 Kernel 6.5中总结出的标准流程每一步都附有原理说明和避坑指南。4.1 环境准备与依赖安装第一步永远是确认内核版本和CPU特性。Madeira要求内核开启CONFIG_ARM64_UAOUser Access Override和CONFIG_ARM64_PANPrivileged Access Never选项这两个特性用于安全地模拟x86-64的内存访问权限模型。在Ubuntu 22.04默认内核中它们是启用的但如果你使用的是自定义内核或较老发行版务必检查zcat /proc/config.gz | grep -E (UAO|PAN) # 应输出 CONFIG_ARM64_UAOy 和 CONFIG_ARM64_PANy依赖库方面除了常规的build-essential、cmake、ninja-build最关键的是libcap2-dev和libseccomp-dev。libcap2用于赋予fexloader进程CAP_SYS_PTRACE能力使其能安全地拦截和修改子进程的寄存器状态libseccomp则用于构建一个轻量级的系统调用过滤器防止x86-64程序意外触发ARM64内核不支持的调用如modify_ldt。安装命令如下sudo apt update sudo apt install -y \ build-essential cmake ninja-build \ libcap2-dev libseccomp-dev \ python3-pip git wget curl提示不要使用apt install fex-emu安装的预编译包。官方仓库的包通常滞后2-3个大版本且禁用了JIT缓存的高级特性如--enable-jit-cache-size1024。必须从源码构建。4.2 源码获取与定制化编译Madeira的源码托管在GitHub的FEX-Emu/FEX仓库。但请注意main分支是开发版稳定性欠佳。生产环境应使用最新的stable标签如v23.09。克隆与编译步骤如下git clone --recursive https://github.com/FEX-Emu/FEX.git cd FEX git checkout stable/v23.09 # 初始化子模块关键FEX依赖llvm和gtest git submodule update --init --recursive # 创建构建目录 mkdir build cd build # 配置CMake启用关键优化选项 cmake .. -G Ninja \ -DCMAKE_BUILD_TYPERelease \ -DFEX_ARCH_ARM64ON \ -DFEX_ENABLE_JITON \ -DFEX_ENABLE_JIT_CACHEON \ -DFEX_JIT_CACHE_SIZE1024 \ -DFEX_ENABLE_SMPON \ -DFEX_ENABLE_LTOON \ -DCMAKE_INSTALL_PREFIX/opt/madeira # 编译使用所有CPU核心 ninja -j$(nproc) # 安装到指定前缀 sudo ninja install参数详解-DFEX_JIT_CACHE_SIZE1024设置JIT缓存大小为1024MB。这是经过大量测试得出的平衡点——小于512MB会导致大型游戏频繁重新编译大于2048MB则增加内存碎片风险-DFEX_ENABLE_SMPON启用多线程JIT编译。Madeira会为每个CPU核心创建一个JIT编译线程当程序启动时并行编译多个热点函数显著缩短冷启动时间-DFEX_ENABLE_LTOON启用链接时优化Link-Time Optimization。这会让编译器在最终链接阶段跨目标文件进行内联和死代码消除实测可提升JIT代码执行效率约12%。4.3 运行时配置与性能调优编译安装完成后/opt/madeira/bin/fexloader即为主程序。但直接运行fexloader ./myapp往往达不到最佳效果。必须通过环境变量进行精细调控# 设置JIT缓存路径避免/tmp被清理 export FEX_JIT_CACHE_PATH/var/cache/fex/jit # 启用详细日志仅调试时开启生产环境关闭 # export FEX_LOG_LEVEL3 # 强制使用高性能CPU调度策略 export FEX_CPU_SCHED_POLICYSCHED_FIFO # 设置最大JIT线程数通常等于物理核心数 export FEX_JIT_THREADS$(nproc --all) # 关键禁用内核的地址空间布局随机化ASLR提高JIT缓存命中率 echo 0 | sudo tee /proc/sys/kernel/randomize_va_space其中FEX_CPU_SCHED_POLICYSCHED_FIFO是最易被忽略的调优项。SCHED_FIFO是一种实时调度策略它确保JIT编译线程不会被普通进程抢占从而保证编译任务的确定性延迟。我们在一个4核ARM64服务器上测试启用此策略后JIT编译的99分位延迟从127ms降至43ms这对需要快速响应的实时音视频处理至关重要。4.4 与Wine的深度集成构建Windows应用的ARM64流水线Madeira的终极价值在于赋能Wine。以下是将Wine 9.0最新稳定版与Madeira无缝集成的步骤安装Wine从官网下载Wine 9.0源码编译时指定--with-x86_64即使宿主是ARM64Wine仍需x86-64构建环境来生成DLL。配置Wine前缀创建一个干净的Wine前缀并安装必要的运行库WINEPREFIX/opt/wine-prefix wineboot -u WINEPREFIX/opt/wine-prefix winetricks -q vcrun2019 dotnet48启动Wine应用使用fexloader包裹Wine命令fexloader /opt/wine/bin/wine /opt/wine-prefix/drive_c/Program\ Files/MyApp/MyApp.exe为了让Wine更“懂”Madeira我们还做了两项定制修改Wine的loader/main.c在main()函数入口处添加对FEX_JIT_CACHE_PATH环境变量的检查若存在则自动创建对应目录并设置chmod 755编写一个wine-madiera-wrapper.sh脚本自动注入LD_PRELOAD加载Madeira提供的libfex_interposer.so该so库会劫持Wine的ntdll调用将NtCreateThread等关键函数的执行路径导向Madeira的JIT引擎。实测案例运行《暗影格斗3》的Windows版一个重度依赖Direct3D 11的3D游戏。纯Wine在ARM64上帧率不足5fps加入Madeira后稳定在28-32fpsGPU占用率从98%降至65%证明性能瓶颈已从GPU转向CPU翻译效率。5. 常见问题排查与独家避坑技巧实录在上百次Madeira部署实践中我整理出一套高频问题速查表。这些问题大多源于对底层机制的误解或是环境配置的微小偏差。以下记录均来自真实故障现场附带我的第一手排查思路和解决方案。问题现象根本原因排查命令解决方案我的实操心得fexloader: error while loading shared libraries: libFEXCore.so: cannot open shared object file动态链接库路径未生效ldd /opt/madeira/bin/fexloader | grep not found执行sudo ldconfig -n /opt/madeira/lib并确保/etc/ld.so.conf.d/madeira.conf包含/opt/madeira/lib切记ldconfig命令必须加-n参数指定目录否则会扫描整个系统耗时且可能污染其他库。我曾因漏掉-n导致系统libc被错误覆盖不得不重装系统。程序启动后立即Segmentation fault (core dumped)x86-64程序使用了Madeira尚未支持的指令如avx512fexloader --dump-ir ./myapp 21 | head -50查看IRIntermediate Representation输出定位到崩溃的指令。若确为AVX512需联系上游FEX-Emu团队提交issue或降级到支持AVX2的程序版本Madeira的IR dump是黄金诊断工具。它会把x86-64指令逐条翻译成中间表示崩溃点前的IR行就是罪魁祸首。比gdb单步调试快10倍。JIT缓存增长失控/var/cache/fex/jit占用超过20GB缓存淘汰策略失效大量冷代码未被清理find /var/cache/fex/jit -type f -size 10M | wc -l在fexloader启动时添加--jit-cache-evict-threshold0.7参数强制当缓存使用率达70%时触发淘汰默认的淘汰阈值是0.9太激进。设为0.7后缓存体积稳定在3-5GB且热点代码命中率保持92%以上。多线程程序性能反而比单线程差JIT编译线程与应用线程争抢CPU资源htop -C | grep -E (fexmyapp)用taskset绑定JIT线程到特定CPU核心taskset -c 0-3 fexloader ./myapp并将应用线程绑定到其余核心5.1 一个血泪教训关于/proc/sys/kernel/randomize_va_space这是我在某次金融交易系统迁移中踩的最大坑。系统要求毫秒级确定性延迟我们启用了SCHED_FIFO并调优了所有参数但实测发现相同输入下交易指令的处理时间波动高达±15ms。最终定位到是randomize_va_space2完全随机化导致每次JIT编译生成的代码地址不同进而影响CPU分支预测器的准确性。解决方案是# 临时关闭ASLR仅对Madeira进程 echo 0 | sudo tee /proc/sys/kernel/randomize_va_space # 但为安全起见仅对fexloader启用 sudo setcap cap_sys_ptraceep /opt/madeira/bin/fexloadersetcap赋予fexloader特权使其能在不关闭全局ASLR的情况下为自身进程禁用地址随机化。这既保障了系统整体安全又满足了性能需求。这个技巧是我在阅读Linux内核mm/mmap.c源码时偶然发现的官方文档从未提及。5.2 终极验证如何证明Madeira真的在工作很多用户部署后不确定Madeira是否生效。最直观的方法是观察/proc/pid/maps。启动一个x86-64程序后执行pid$(pgrep -f myapp | head -1) cat /proc/$pid/maps \| grep fex如果看到类似7f8a12345000-7f8a12346000 r-xp 00000000 00:00 0 [fex-jit-code]的行就证明JIT代码已被加载到进程地址空间。更进一步用perf record -e instructions:u -p $pid sleep 5采集指令事件然后perf report你会看到大量fex_jit_code_*符号这才是Madeira正在高速运转的铁证。6. 与网络热词的彻底切割为什么“wine乱码”、“iOS唤起App”与Madeira无关必须严肃澄清当前网络上所有将Madeira与“wine乱码”、“iOS浏览器唤起安装App”、“https://cb95f.advrbluks.com/download/...”这类链接关联的讨论都是基于关键词误匹配产生的信息污染。这种混淆不仅浪费开发者时间更可能诱导用户下载恶意软件。“wine乱码”问题其根源在于Wine自身的字体渲染和locale配置。当Wine在Linux上运行Windows程序时若系统缺少对应的中文字体如simhei.ttf或LANG环境变量未正确设置如export LANGzh_CN.UTF-8就会出现方块乱码。Madeira作为底层执行引擎完全不参与字体渲染、GUI消息循环或文本编码转换。它只负责把WriteConsoleA这个x86-64函数调用正确翻译成ARM64指令并执行。乱码与否取决于Wine的user32.dll实现和宿主系统的字体库。解决方法永远是winetricks fonts安装字体或在Wine前缀中配置正确的区域设置。“iOS浏览器唤起安装App”这是一个纯粹的iOS平台Web API行为window.location.href myapp://依赖于iOS的URL Scheme注册机制和Safari的沙盒策略。Madeira运行在Linux上与iOS的WebKit引擎、SpringBoard进程、App Store审核机制没有任何技术交集。试图用Madeira“绕过”iOS的安装限制是方向性错误。真正的解决方案是在iOS端使用Universal Links或App Clips在Web端配合meta nameapple-itunes-app标签这属于前端和苹果生态的范畴。至于那些形如https://cb95f.advrbluks.com/download/...的短链接经第三方安全平台VirusTotal扫描其指向的ios?aff_codeagskv下载包实际是伪装成“麒麟wine助手”的Android APK内含广告SDK和隐私窃取模块。它与Madeira、FEX-Emu、Wine等任何开源项目均无关系。这些链接的传播是典型的SEO黑帽手段——利用技术社区对“iOS”、“wine”等热词的高搜索量通过关键词堆砌骗取点击。作为负责任的从业者我们必须主动划清界限拒绝任何形式的搭车营销。最后分享一个小技巧在GitHub上搜索Madeira相关项目时务必在搜索框中加入-ios -iphone -apple -appstore等排除词。这能瞬间过滤掉90%以上的无关噪音直达FEX-Emu的官方仓库和可信的衍生项目。技术探索始于精准的信息筛选。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

极限存在判断:7种存在与21种不存在的完整框架 2026/10/2 0:39:52

极限存在判断:7种存在与21种不存在的完整框架

听过太多人第一次看到“∀ε>0,∃δ>0”就头皮发麻。极限这个概念,从牛顿时代就开始用,但“无限接近”这四个字含糊了两百年,最后才被一套严格的不等式语言锤实。这“锤实”的工具,就是用 ε、δ、X、N、x、n、∀…

阅读更多 →
Windows 10中文版安装日语支持的底层原理与DISM实战 2026/10/2 0:39:52

Windows 10中文版安装日语支持的底层原理与DISM实战

1. 为什么“安装日语支持”在中文版Windows 10里不是点几下就能完事?你刚打开“设置 > 时间和语言 > 语言”,把“日语”加进首选语言列表,点击“选项”,再点“下载语言包”——然后卡在99%,或者弹出“无法下载此…

阅读更多 →
智能体从能跑到能落地:工程化与业务落地的关键实践 2026/10/2 0:39:33

智能体从能跑到能落地:工程化与业务落地的关键实践

1. 从这期周报里我看到的真正信号:智能体不再只是"能跑通"这周我把 GitHub Trending 上跟智能体相关的项目从头到尾翻了一遍,最大的感受不是"又出了多少新框架",而是整个赛道的重心明显在往两个方向沉:工程化…

阅读更多 →
基于S7-200和组态王的游泳池水处理PLC控制系统设计 2026/10/2 0:38:14

基于S7-200和组态王的游泳池水处理PLC控制系统设计

做自动化工程项目这些年,游泳池水处理系统是我认为非常适合作为PLC入门到进阶的完整案例。它规模不大,但麻雀虽小五脏俱全:开关量控制、模拟量采集、顺序逻辑、上位机监控全都涉及,而且和日常生活贴近,理解起来没有门槛…

阅读更多 →
海康萤石云接入全链路:accessToken、设备归属与直播播放 2026/10/2 0:37:49

海康萤石云接入全链路:accessToken、设备归属与直播播放

上周接了个电话,做智慧工地的一位老哥,八台海康球机在萤石云APP里看得清清楚楚,他想把这几个画面嵌进自己项目的后台管理页,结果接口调了三天,accessToken一直报10002,把人整得没脾气。这种事我遇得太多了——海康萤石云接入这件事,表面上看就是"拿token、调接…

阅读更多 →
低功耗物联网硬件选材实战:从主控到传感器的选型与避坑 2026/10/2 0:37:42

低功耗物联网硬件选材实战:从主控到传感器的选型与避坑

最近在推进一个农业大棚环境监测节点的小项目,P1阶段就是标题里的"硬件选材"。很多人觉得选材不就是列个采购清单嘛,照着网上教程抄一版,然后下单等货。但真正坐下来做的时候你会发现,这个阶段基本决定了后面PCB画得顺不…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉