QEMU 是否对从 DATA 部分执行命令有限制?

Does QEMU have restriction on executing a command from DATA section?

我正在使用 QEMU 模拟 ARM11 CPU。

我的程序太复杂了,无法在这里解释,所以我会把这个问题投影到一个更简单的程序中。 所以我的程序包含 2 个 c 文件:

我正在编译some_code.c(变成some_code.o),然后我将它转换成一个十六进制数组变量,代表some_code.c.

的代码

现在我正在链接两个目标文件(main.o & some_code.o)。 该变量(HEX数组变量)位于DATA段。

现在我从 main.c 中的代码调用 HEX 数组变量(我的意图是此时 some_code.c 的代码将开始执行)。 当程序计数器 (PC) 到达 HEX 数组变量时,它得到一个异常(我没有关于异常的更多细节)。

如果我将此 HEX 数组变量从 DATA 部分复制到 CODE 部分,现在当 PC 到达此行时,它可以成功地执行它,无一例外。

所以我的问题是:

在此先致谢,

暗里

它将是链接器和操作系统的组合。链接器很可能将数据部分标记为 "data",然后加载程序将创建一个没有执行权限的内存区域来包含数据。这是 QEMU 正在模拟的硬件的一个特性,而不是 QEMU 本身,即如果你在真机上 运行 这个,你会看到同样的问题。

可以将数据部分更改为可执行文件,但详细信息将取决于您 OS 运行 以及您使用的编译器工具链。任何具有 JIT 编译器的解释器都必须做类似的事情。

请注意,一般来说,让数据部分可执行被认为是不好的做法,因为这会导致各种安全漏洞。

如果我对你的描述理解正确,那么你并不是 运行 限制了 QEMU,而是限制了它所模拟的 CPU。 QEMU 对数据段和代码段一无所知,但是您 运行 在 QEMU 中的操作系统知道。

大多数操作系统对代码段和数据段设置了不同的权限:代码通常可读可执行但不可写,只读数据可读但不可执行不可写,可变数据可读可写但不可执行.

CPU 通过 MMU 描述符中的标志强制执行读取、写入和执行权限。在 ARM 上,执行权限由页面描述符中的 XN 位控制,从 ARMv6 开始存在。

如果你想拥有可执行数据(例如用于即时编译器或动态代码加载机制),你需要弄清楚如何指示你的操作系统使内存可执行。