理解VSYSCALL_ADDR和函数指针

时间:2015-08-14 00:16:35

标签: c linux linux-kernel

我遇到了以下代码。我这里有两个问题。 1.在哪里找到__NR_vgetcpu? callign VSYSCALL_ADDR可以获得哪些其他值? 2.这行“my_getpuc =(int(*)).....)”是什么?

int (*my_getcpu)(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache);
char *addr3 = (char *)VSYSCALL_ADDR(__NR_vgetcpu);
printf("vgetcpu addr is %p \n", addr3);
my_getcpu = (int (*)(unsigned *, unsigned *, struct getcpu_cache *))addr3;
my_getcpu(&cpu, &node, &cache);

1 个答案:

答案 0 :(得分:2)

您可以使用grepackag

轻松找到这些内容

对于第一个问题,我发誓并发现它出现在文件arch/x86/include/asm/vsyscall.h

enum vsyscall_num {
    __NR_vgettimeofday,
    __NR_vtime,
    __NR_vgetcpu,
};

#define VSYSCALL_START (-10UL << 20)
#define VSYSCALL_SIZE 1024
#define VSYSCALL_END (-2UL << 20)
#define VSYSCALL_MAPPED_PAGES 1
#define VSYSCALL_ADDR(vsyscall_nr) (VSYSCALL_START+VSYSCALL_SIZE*(vsyscall_nr))

所以__NR_vgetcpu2 VSYSCALL_ADDR(__NR_vgetcpu) (-10UL << 20) + 1024 * 2等于0xff600800

对于第二个问题,行my_getcpu =( int(*)) .....)0xff600800转换为函数指针(有3个参数并返回int)并将其分配给my_getcpu,以便my_getcpu可以像下一行中的函数一样对待。