使用mmap获取函数的起始和结束地址?

时间:2014-02-24 12:05:00

标签: mmap

如何使用mmap获取函数的起始和结束地址?我想执行该函数,然后调用__clear_cache。清除刚刚执行的缓存中的所有内容。 clear_cache需要起始和结束地址。

我的代码中的一个函数代表一个测试用例,我需要清除缓存以便正确地进行基准测试。我使用的是Linux 3.7和C.

我需要使用mmap而不是malloc,如下所示:

How clear and invalidate ARM v7 processor cache from User Mode on Linux 2.6.35

目前我刚刚制作了一个大小为32kb的mmap,即我的缓存大小。但是如何获取开始和结束地址并将其映射到特定功能?

我已经完成了这个

//在标题

extern void __clear_cache (char*, char*);

//获取地址的函数指针。 typedef void(* _func_pointer)(void);

中的.c

_func_pointer = test_func;

uint32_t *  map_to_function = mmap(
        NULL,
        32768,  // 32kb -- Whole Cache.
        PROT_READ | PROT_WRITE | PROT_EXEC,
        MAP_PRIVATE | MAP_ANONYMOUS,
        -1,
        0);
if (map_to_function == MAP_FAILED) {
    printf("Could not mmap a memory buffer with the proper permissions.\n");
    return -1;
}


test_func = (_func_pointer ) map_to_function ;


//Run Test case 1:

 Some how run function 1 and get start and end address.

__clear_cache((char*)start_address, (char*)end_address);

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

如您对问题的评论所述,mmap仅在自我修改代码或代码生成时才需要。

函数的开头显然只是函数指针。但是没有标准的C方法来获取函数的长度或指向其结尾的指针。

您可以尝试的一件事是使用GCC扩展,它为您提供标签的地址,一元'&&&'运营商。 因此,您可以修改您的函数以在最后添加标签:

...
    do_stuff();
MYFUNC_END:
    return;
}

不确定是否可以在最后一个语句之后放置标签,就在结束花括号之前。我不这么认为。

无论如何,你可以这样做:

__clear_cache((char *)myfunc, (char *) &&MYFUNC_END);