orocos xenomai dlopen 內存權限問題:

前兩天遇到一個很頭疼個問題,就是需要執行一個類似 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章