Unity3D mono arm 非要吃中断 33

现在也不到有多少游戏是 Unity3D 写的

操作倒是很省事,在Unity中写了程序,直接生成了 Android的 APK

但内部其实还是听复杂的,对于用 C#生成的脚本需要用 mono 来解释执行

而Android应用本来就是运行在Dalvik Java 虚拟机, 就是经过了两层 runtime 才运行

不过我们更”变态“,我们想在qemu-arm ( 主机是x86)  中运行带 mono 的Unity程序

结果遇到个问题

mono 报错

mono : * Assertion at mini-posix.c:382, condition `sigaction (signo, &sa, &previous_sa) != -1‘ not met

加 log 发现是设置 中断 33 出现的问题

========
do_sigaction sig 33 host_sig 33 ret -1

02-10 03:54:43.441 147 186 F mono : * Assertion at mini-posix.c:382, condition `sigaction (signo, &sa, &previous_sa)
!= -1‘ not met

编写了一个小程序 pnp5  直接截取中断 33 出错

$ LD_LIBRARY_PATH=./system/bionic_arm/system/lib ./system/target_libc/system/bin/qemu-arm ./system/bionic_arm/system/bin/pnp5

sigaction 33 return -1

用glibc编译此程序运行也出错

应该是Ubuntu Linux 不让 设置 中断
33

不过既然 Unity 这么流行,不可能就这样出错,在arm手机试验

用NDK编译此程序,居然没有出错

因此在Android的 linux中, 中断 33是允许设置的

程序清单

[email protected]:~/pnp/pnp5$ cat Android.mk
#ifeq ($(TARGET_ARCH),arm)

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:=         main.c

LOCAL_MODULE:= pnp5
LOCAL_MODULE_TAGS := optional

include $(BUILD_EXECUTABLE)

#endif
[email protected]:~/pnp/pnp5$ cat main.c 

#include <signal.h>
#include <stdio.h>

void
termination_handler (int signum)
{
/*
  struct temp_file *p;

  for (p = temp_file_list; p; p = p->next)
    unlink (p->name);
*/
}

int
main (void)
{
  struct sigaction new_action, old_action;
  int my_singals[9] = { 4,6,7,8,11,16,13,34,33 };
  int i=0;

  /* Set up the structure to specify the new action. */
  new_action.sa_handler = termination_handler;
  sigemptyset (&new_action.sa_mask);
  new_action.sa_flags = 0;

  for ( i=0; i<9; i++ )
      printf(" sigaction %d return %d\n",my_singals[i], sigaction(my_singals[i], &new_action, &old_action));

  return 0;
}

另外 Unity 生成的 x86 lib是可以在Ubuntu Linux 下跑得,所以只有 mono-arm 的库才设置中断 33

时间: 2024-08-04 23:35:59

Unity3D mono arm 非要吃中断 33的相关文章

ARM体系的异常中断

在ARM体系中,通常有3种方式控制处理器的流程  1:在正常执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加四个字节,在每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节,整个过程是按照顺序执行的 2:通过跳转指令,程序可以跳转到指定的地址标号进行执行,或者跳转到特定的子程序进行执行,其中B指令用于执行跳转操作,BL指令用于执行跳转操作的同时,保存子程序相应的返回地址,BX在执行跳转操作的同时,分居目标地址的最低位,可以将程序切换到THumb状态,BLX执行上述三个操作 3

捕获arm非托管磁盘虚拟机,并进行还原

背景:非托管磁盘虚拟机"hlmcen69n1",附加了一块100GB的数据磁盘.由于arm非托管磁盘机器无法通过Portal界面直接"Capture",故只能通过命令行的方式进行捕获并还原,以下是通过Powershell命令进行的操作 1.在虚拟机内部执行一般化的操作[Linux机器:waagent -deprovision; Windows机器:sysprep],本文以Linux机器为例进行说明 Linux机器: Windows机器: 2.在Portal界面关闭该

浅析arm的异常、中断和arm工作模式的联系

说到异常向量,会让人联想到中断向量.其实,中断是属于异常的子集的,也就是说中断其实是异常其中的一种. 回到异常向量,他其实是一张表格,每个格子里存放的是一个地址,或者是一个跳转命令,不管是哪个,其目的都是让PC跳转到真正处理异常的代码的地方. 以下是arm的异常向量表: 图1 初步介绍完异常向量,就来对比下ARM的arm的7种工作模式: 图2 User : 非特权模式,大部分任务执行在这种模式 FIQ :   当一个高优先级(fast) 中断产生时将会进入这种模式 IRQ :   当一个低优先级

Unity3D对弈游戏:狼吃羊游戏

简介 中文名:狼与羊 英文名称:Wolves&Sheep 游戏类型:休闲/棋类 玩家人数:单人或双人 游戏下载:Windows.Android 游戏描述:童年时与小伙伴常玩的一种游戏,游戏简单易懂而又变化多样. 第一节 游戏规则 棋盘可以用小石头在泥土里上随手就画出来了,棋子中的狼和羊可以用树枝或者小石子代替. 准备 找两块大点的石头当作狼,二十四块小石头是羊,狼和羊必须放置在网格的交叉点上,每个交叉点上最多有一个棋子. 开局 两个狼分别放在上下两个脖子上,羊8个放在中间一圈的交叉点上,狼先走羊

ARM 非对齐的数据访问操作

I’m confused about unaligned memory accesses on ARM. My understanding was that they’re not allowed — that is, dereferencing a 32-bit value from a pointer that’s not four-byte aligned will crash. I’ve run into such crashes before. But right now I’ve g

ARM非对齐操作异常解决过程

在测试MF固件时,发生一个非常诡异的异常,代码如下: CLR_DBG_Commands::Monitor_EraseMemory* cmd = (CLR_DBG_Commands::Monitor_EraseMemory*)msg->m_payload; debug_printf("EraseMemory addr=0x%08x len=%d\r\n", cmd->m_address, cmd->m_length); 指定第二行代码时,会跳到异常处理程序,发生了6号异

同步异步阻塞非阻塞可中断的睡眠不可中断的睡眠

同步:所有程序是按照一定逻辑先后顺序执行的,前一个代码没有执行完成,后面的代码不会执行. 异步:程序可能有若干分支,各自的执行时间点没有约束,也不可提前预测. 阻塞:阻塞指的是一个程序在执行的时候,没有成功获取到相应的资源(变量/标志/内存/数据等),那么就一直等待在这里循环或者睡眠等待资源可以被获取.这个时候我们一般会把阻塞的进程放到等待队列中,等待被唤醒.这个会涉及到等待队列的知识,在本章最后会讲解. 非阻塞:非阻塞指的是程序在获取资源或者其他数据的时候没有成功,那么直接返回错误码. 不可中

ARM异常---一个Uart中断的触发处理过程:

首先给出一些定义: //2440addr.inc INTOFFSET EQU 0x4a000014 ;Interruot request source offset //option.inc _ISR_STARTADDRESS EQU 0x33ffff00 //2440init.s MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) stm

ARM实验5 —— 按键中断实验

key_int按键中断实验 实验内容: 通过开发板上的按键中断控制led灯并打印信息. 通过简单事例说明猎户座4412处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识别按键被按下时进入相应的中断处理函数 实验目的: 熟悉开发环境的使用 掌握猎户座4412处理器的中断过程及编程. 实验平台: fs4412开发板,eclipse,secureCRT. 实验步骤: 1.查看key2在开发板的位置: 2.查看UART_RING在核心板的位置: 3.查看GPX1在芯片手册的位置: