在 MIPS 平台上运行时动态生成指令并执行 (1)

昨天晚上回去后实在无聊睡不着,拿着身边的 Yeeloong 笔记本随便找点事干干,想到了 JIT 的原理,于是简单的验证了一下运行时动态生成指令并执行。

我先找了一下进程中哪个 VMA 是可以执行的,使用命令 cat /proc/self/maps 可以找到:

00400000-0040c000 r-xp 00000000 08:02 524311                             /bin/cat
00418000-0041c000 rw-p 00008000 08:02 524311                             /bin/cat
0041c000-00440000 rwxp 00000000 00:00 0                                  [heap]
2b9c8000-2b9ec000 r-xp 00000000 08:02 917518                             /lib/ld-2.14.so
2b9f8000-2b9fc000 rw-p 00020000 08:02 917518                             /lib/ld-2.14.so
2ba18000-2bb70000 r-xp 00000000 08:02 918040                             /lib/libc-2.14.so
2bb70000-2bb7c000 ---p 00158000 08:02 918040                             /lib/libc-2.14.so
2bb7c000-2bb80000 r--p 00154000 08:02 918040                             /lib/libc-2.14.so
2bb80000-2bb84000 rw-p 00158000 08:02 918040                             /lib/libc-2.14.so
2bb84000-2bb88000 rw-p 00000000 00:00 0 
2bb88000-2bd88000 r--p 00000000 08:02 786854                             /usr/lib/locale/locale-archive
7ff70000-7ff94000 rwxp 00000000 00:00 0                                  [stack]
7fff4000-7fff8000 r-xp 00000000 00:00 0                                  [vdso]

从上面的结果中可以看到 heap 和 stack 两个 VMA 的权限属性都是 rwxp,意味着我可以向里面存入指令并执行。

我选择了在栈中存入两条指令,然后转过去执行。代码如下:

#include <stdio.h>
 
int main(int argc, char *argv[])
{
	unsigned int insn[] =
	{
		0x1000ffff,
		0x00000000
	};
 
	__asm__ volatile (
				"jr %0 \n\t"
				"nop \n\t"
				::"r"(insn)
			);
 
	return 0;
}

编译程序后,执行这个程序就会进入栈里的死循环了。

你可能会想到这个操作系统的 heap 和 stack 具有可执行权限是不安全的,我确认了一下 x86 里没有可执行权限的,那么当没有可执行权限又应该怎么办呢?我们下次再说。

Over!

ArchLinux 龙芯版

ArchLinux 发行版
Arch Linux 是一个社区驱动型的 Linux 发行版,采用滚动升级模式,并提供了一个基本的已编译软件仓库,一个完美的软件包管理器,一个强大的打包工具还有一个强大的软件打包交流社区。系统极尽简洁、结构优雅、原汁原味的软件、快速跟进的升级。Arch Linux Version 0.1 (Homer) 在 2002 年 3 月 11 日发行。

架构信息

架构名称: mips32el
平台支持: 龙芯3A系列机器
编译参数: -march=mips64r2 -mtune=loongson3a -mabi=n32 -O3
基本系统: http://mirror.lemote.com/archls/system/
源服务器: http://mirror.lemote.com/archls/binaries/$repo/os/$arch
源码仓库: http://mirror.lemote.com/archls/sources/

ArchLinux 龙芯版是由社区用户移植的 ArchLinux 的龙芯(mips32el)架构版本,目前只发布 n32 ABI 版本。它和 ArchLinux i686 和 x86_64 版本一样发布源代码包和必要的预编译包。我们的目标是基于 ArchLinux 发行构建出通用的轻量级操作系统,能够应用于桌面和服务器环境,打造龙芯平台上最优秀的操作系统!

Over!