如何使用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);
感谢您的帮助
答案 0 :(得分:0)
如您对问题的评论所述,mmap仅在自我修改代码或代码生成时才需要。
函数的开头显然只是函数指针。但是没有标准的C方法来获取函数的长度或指向其结尾的指针。
您可以尝试的一件事是使用GCC扩展,它为您提供标签的地址,一元'&&&'运营商。 因此,您可以修改您的函数以在最后添加标签:
...
do_stuff();
MYFUNC_END:
return;
}
不确定是否可以在最后一个语句之后放置标签,就在结束花括号之前。我不这么认为。
无论如何,你可以这样做:
__clear_cache((char *)myfunc, (char *) &&MYFUNC_END);