ESP32S3平台下基于GCC插装实现简易mmap的技术咨询
ESP32S3平台简易mmap功能实现方案探讨
需求背景
我希望在不支持通用mmap的ESP32S3平台上实现一个简易版mmap功能,尽管清楚这会大幅影响性能,但仍想在项目特定场景中尝试。核心思路是在每一处内存加载操作的逻辑周围生成代码,通过检查指针值来决定是否从替代地址加载数据。
核心思路示例(伪代码)
char * mapped_file; read(somefile, mapped_file, file_size); char load_hook(void * ptr) { if(ptr & 0xff000000) { return mapped_file[ptr & 0x00ffffff]; } else { return *ptr; } } char s[] = "some data"; char * p = 0xff000002; char load_1 = *s; char load_2 = *p; // load_1 会取到s[]的第一个字节, // load_2 会取到mapped_file的第三个字节
注:实际实现时load_hook需要加入缓存逻辑,用少量物理RAM处理大文件,上述示例仅作思路说明。
已尝试的方案
我尝试使用-fsanitize=kernel-address编译选项,GCC会自动生成调用__asan_load*_*(void * ptr)系列函数的代码。目前已成功通过自行实现这些函数(不链接官方asan库)劫持了相关调用,但无法找到让GCC生成修改加载地址代码的方法。
以x86_64平台的kasan为例,它会生成类似如下的汇编逻辑:
char fn(char * p) { char ret = *p; return ret; } ... movq -24(%rbp), %rax | movq %rax, %rdi | << kasan注入的代码 call __asan_load1_noabort@PLT | movq -24(%rbp), %rax << 获取p指针 movzbl (%rax), %eax << 实际解引用p指针 ...
当前遇到的问题
虽然可以在__asan_load..函数中通过栈帧查找指针值,但希望有更直接的实现方式。另外:
- ESP32的ISA没有公开文档,x86平台可行的汇编注入方案无法移植;
- 尝试编写GCC插件处理gimple中间代码,但不确定Espressif提供的工具链是否包含所需的开发头文件。
寻求解决方案
请问还有其他可行的方案来实现这个需求吗?
内容的提问来源于stack exchange,提问作者Roman Likane
相关产品推荐
相关产品推荐

