三种转译模式
- 即时编译(Just in time,JIT):程序运行过程中,将CIL的byte code转译为目标平台的原生码。
- 提前编译(Ahead of time,AOT):程序运行前,将.exe或.dll文件中的CIL的byte code部分转译为目标平台的原生码并且存储,程序运行中仍有部分CIL的byte code需要JIT编译。
- 完全静态编译(Full ahead of time,Full-AOT):程序运行前,将所有源码编译成目标平台的原生码。
- 引用一段看到的比较形象的比喻:
- 举个例子:比如你某一天突然穿越成为了一个优秀的学者(好吧好吧,这个貌似不是必须要穿越),现在要去一个语言不通的国家做一系列讲座。面对语言不通的窘境,如何才不出丑呢?
- 匹夫有三条方案:
- 在家的时候雇人把所有的讲稿全部翻译一遍。这是最省事的做法,但却缺乏灵活性。比如临时有更好的话题或者点子,也只能恨自己没有好好学外语了。
- 雇一个翻译和你一起出发,你说啥他就翻译成啥。这样就不存在灵活性的问题,因为完全是同步的。不过缺点同样明显,翻译要翻译很多话,包括你重复说的话。所以需要的时间要远远高于方案1。
- 雇一个翻译和你一起出发,但不是你说啥他就翻译啥,而是记录翻译过的话,遇到曾经翻译过的就不会再翻译了。你自己就可以根据之前的翻译记录和别人交流了。
- 看完这三条方案,各位看官心中更喜欢哪个呢?
- 匹夫个人的答案是方案3,因为这便是JIT的道。所以说JIT的美丽,就在于即保留了对代码优化的灵活性,也兼具对热点代码进行重复利用的功能。
- 但是,至今为止IOS只能使用Full-AOT模式,那么IOS又是封禁了JIT的什么功能致使IOS无法使用JIT模式呢?且看下一段。
IOS不支持JIT的根本原因
- 假设JIT已经为我们编译出了新的机器码,然后,动态的在内存上创建函数之前,我们需要在内存上分配空间,其实就是将对应的机器码映射到内存空间中。
- 然而,IOS封了内存(或者堆)的可执行权限,相当于变相的封锁了JIT这种编译方式,即机器码被禁止映射到内存。
- 那么什么又是内存映射呢,且看下一段的介绍。
以C语言来模拟JIT内存映射时的操作
- mmap 即 memory map,也就是内存映射。
- mmap 是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read、write 等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。

#include <sys/mman.h>
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset)
参数说明:
- 第1个参数为映射的特定地址,当然,一般情况下设置为NULL,由系统分配。
- 第2个参数为映射的文件长度。
- 主要关注第3个参数,prot描述映射的内存权限(不得与该文件的打开权限冲突),该参数是一下选项的组合:
- PROT_READ: 允许读该内存段
- PROT_WRITE: 允许写该内存段
- PROT_EXEC: 允许执行该内存段
- PROT_NONE: 该内存段不能被访问
- 第4个参数flags控制程序对该内存段的改变所造成的影响。常用选项如下:
- MAP_PRIVATE: 内存段是私有的,对它的修改只在局部范围内有效,其他进程不可见。
- MAP_SHARED: 共享映射。某进程对该段内存空间的更新对其他进程来说是可见的,但与之关联的该文件的内容并不会立即更新,要更新文件内容,需要调用msync()和munmap()函数。
- 这个flags参数还有其他一些值,具体可以查mmap()函数的man手册。
- 第5个参数为映射的文件描述符。
- 第6个参数为偏移,即要映射的内容在文件中的起始位置。
IOS不允许执行该内存段,即使成功的进行了内存映射也无法执行对应的程序,也就无法使用JIT后产生的代码
IOS不允许使用JIT的原因猜想
- 因为很多攻击方式就是在进程中植入恶意代码,然后执行。而植入的方式中,利用数据是使用相当普遍的一种。
- 举例来说,我可以自己往内存中复制一些攻击代码,或者利用一些漏洞执行媒体文件中嵌入的恶意代码。但这些都要建立在“数据段可执行”这个基础上,如果不允许执行数据段上的代码,这几种方式都无法使用。
参考资料
https://zhuanlan.zhihu.com/p/352463394
https://www.cnblogs.com/murongxiaopifu/p/4278947.html
https://blog.csdn.net/agonie201218/article/details/123791047
https://www.cnblogs.com/kkzone/archive/2013/01/31/2888160.html