M1 Mac Mini编译QEMU报错qemu_mprotect__osdep mprotect权限被拒绝如何解决
qemu-system-x86_64: qemu_mprotect__osdep: mprotect failed: Permission denied
报错根因
搭载M1系列芯片的Mac设备运行arm64架构macOS,默认启用W^X(写入、执行权限互斥)安全机制,禁止同一块内存页同时申请写入、执行权限。QEMU的x86架构模拟逻辑需要申请同时具备读写执行权限的内存页,被系统安全机制拦截触发该报错。
排查&解决步骤
- 第一步:调整编译配置参数
编译QEMU前运行configure时加入适配macOS的参数,配置命令参考:./configure --enable-hvf --target-list=x86_64-softmmu --disable-strip
其中--enable-hvf参数启用苹果官方硬件虚拟化框架适配,可大幅降低内存权限冲突概率。 - 第二步:为QEMU二进制文件添加权限签名
本地编译的QEMU默认没有申请JIT内存权限的 entitlements,需要手动添加签名:- 新建
qemu.entitlements文件,写入以下内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.disable-executable-page-protection</key> <true/> </dict> </plist>- 运行ad-hoc签名命令,替换命令中的路径为你本地编译生成的qemu-system-x86_64二进制文件路径:
codesign --entitlements qemu.entitlements --force --sign - /path/to/qemu-system-x86_64
- 新建
- 第三步:规避系统文件夹沙箱限制
不要将编译好的QEMU二进制文件放在下载、桌面等带有额外沙箱限制的系统文件夹内,建议移动到/Applications或者用户主目录下的自定义文件夹运行。 - 第四步:启动时指定虚拟化加速参数
运行QEMU时添加-accel hvf参数强制启用硬件虚拟化加速,可完全规避纯软件模拟触发的W^X权限限制。
内容的提问来源于stack exchange,提问作者KittyBorgX
相关产品推荐
相关产品推荐

