【发布时间】:2016-01-20 06:47:39
【问题描述】:
早上好。
我有一个自修改代码的程序。
真的,它会构建二进制文件,然后由ELFPatch 更改并更改某些函数的序言。
我正在使用 Windriver WorkBench 3.3 和 VxWorks 6.9 Update3。
我创建了一个标准模拟器 (PENTIUM), 当我在模拟器上运行我的代码时:
void replace_prolog(void* func_ptr) {
char* p = (char*)func_ptr;
for (int i=0; i < PROLOGUE_SIZE; ++i)
p[i]=m_prologue[i]; // << prologue is a member array.
...
}
让我们称之为真正的序幕:原始序幕;
改变的序幕 : 改变的序幕;
放在运行时的那个:替换序言;
我得到一个异常(信号 11 - 分段错误)。
!!我意识到这是 VxWorks 的.text Segment Protection。
所以,我创建了一个 SimPC based VIP 作为我的模拟器 BSP,并排除了 INCLUDE_PROTECT_TEXT(以及它所有相关的内核组件)
并运行模拟器:
现在,也不例外!
事实
- 查看内存浏览器,我看到 Changed Prologue Bytes(内存没有改变)!
- 将缓冲区打印到控制台,打印 Replacement Prologue Bytes 值! (奇怪)
- 查看程序集视图 (Mega Weird):显示 Changed Prologue 十六进制值,但显示原始 Prologue asm 命令 (push bp;...),即使字节值与它们不匹配。
我的问题
- 谁有修改
.text段的经验? - 任何人在模拟器上遇到不会更改(没有异常/信号)的内存,这不是内存映射端口/易失性?
远射假设
我假设它与缓存有关,暗示 vxWorks 知道该区域不应更改,因此它不会 write_through,但不知道如何检查它...
编辑 2:尝试将我的指针设置为 volatile => 相同的行为!
请帮忙。
【问题讨论】:
标签: memory kernel simulator vxworks mmu