我遇到了以下代码。我这里有两个问题。 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);
答案 0 :(得分:2)
您可以使用grep
或ack
或ag
对于第一个问题,我发誓并发现它出现在文件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_vgetcpu
是2
VSYSCALL_ADDR(__NR_vgetcpu)
(-10UL << 20) + 1024 * 2
等于0xff600800
对于第二个问题,行my_getcpu =( int(*)) .....)
将0xff600800
转换为函数指针(有3个参数并返回int)并将其分配给my_getcpu
,以便my_getcpu
可以像下一行中的函数一样对待。