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


如何使用

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

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

我需要使用 mmap 而不是 malloc,就像这里所说的那样:

在 Linux 2.6.35 上,用户模式下的 ARM v7 处理器缓存如何清除和失效

目前,我刚刚制作了一个大小为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);

感谢您的任何帮助

如您问题的注释中所述,mmap 仅适用于自修改代码或代码生成。

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

你可以尝试的一件事是使用GCC扩展,它给你一个标签的地址,一元'&&'运算符。因此,您可以修改函数以在末尾添加标签:

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

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

无论如何,那么你可以做:

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

最新更新