大EPC内存环境下SGX Enclave抛出cxxrt::bad_alloc的问题求助
SGX Enclave 内存分配受限问题排查与解决
我在SGX enclave中运行以下测试代码,验证enclave可分配的内存上限:
void test_enclave_size() { unsigned int i = 0; const unsigned int MB = 1024 * 1024; try { for (; i < 10000; i++) { char* tmp = new char[MB]; } } catch (const std::exception &e) { std::cout << "Crash with " << e.what() << " " << i << std::endl; } }
现象
在配备128MB EPC的开发机上,代码分配到118MB时抛出cxxrt::bad_alloc异常,这符合预期——标准配置下仅96MB内存保证可供enclave程序使用。但在拥有192GB EPC内存的Azure Standard_DC32s_V3虚拟机上运行时,结果完全一致,无法分配超过118MB的内存,与大EPC可支持更大内存分配的预期不符。
初始猜测
我最初怀疑的原因包括:
- 尽管EPC总容量达192GB,但单个enclave进程仍被限制在128MB
- 需要调整内核设置才能利用大EPC内存
- 误解了Azure虚拟机的规格说明
解决方案
最终排查发现,问题根源在于enclave配置文件限制了最大堆大小(默认设置为约118MB),调整该配置值后即可正常分配更大内存。
额外说明
- Linux系统下SGX驱动支持内存分页,若可接受分页带来的性能开销,enclave可使用任意大小的内存
- 若使用Open Enclave SDK,需编辑对应的enclave配置文件来调整堆内存上限
内容的提问来源于stack exchange,提问作者JRose
相关产品推荐
相关产品推荐

