orocos xenomai dlopen 内存权限问题:

12 篇文章 5 订阅
6 篇文章 2 订阅

前两天遇到一个很头疼个问题,就是需要执行一个类似 JIT 的代码,但是一直出现segFault错误。

问题可能存在于:
1.系统cache没有被清空,导致执行的时候读取到了错误的代码。尝试使用以下清空 cpu cahce的方法:

1. __clear_cache(start, end);  // gcc buitin

2. __builtin___clear_cache(start, end); // gcc buitin

3. void asm_clearcache(char* begin, char *end)
{
    const int syscall = 0xf0002;
    __asm __volatile (
        "mov     r0, %0\n"
        "mov     r1, %1\n"
        "mov     r7, %2\n"
        "mov     r2, #0x0\n"
        "svc     0x00000000\n"
        :
        :   "r" (begin), "r" (end), "r" (syscall)
        :   "r0", "r1", "r7"
        );
}

2.系统保存 JIT 代码的内存区没有可执行权限
我遇到的就是该问题,但是此问题出现得很隐蔽,因为代码被编译成可执行程序,或者编译成linux动态库都不会出现,唯独在xenomai线程中加载的时候会出现segFault。解决方法,弃用 malloc 或 new 或者定义的数组(即 char []),使用下面这个分配内存:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>


// Allocates RWX memory of given size and returns a pointer to it. On failure,
// prints out the error and returns NULL.
void* alloc_executable_memory(size_t size) {
  void* ptr = mmap(0, size,
                   PROT_READ | PROT_WRITE | PROT_EXEC,
                   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  if (ptr == (void*)-1) {
    perror("mmap");
    return NULL;
  }
  return ptr;
}

see ref link:
http://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值