今天在vmlinux上设置断点的时候出现4个地址, 超乎认知了, 仔细得看了一下原因
(gdb) b sched_clock Breakpoint 1 at 0xffffffff8101cf00: sched_clock. (4 locations) (gdb) i b Num Type Disp Enb Address What 1 breakpoint keep y <MULTIPLE> 1.1 y 0xffffffff8101cf00 in sched_clock at arch/x86/kernel/tsc.c:75 1.2 y 0xffffffff8101d4fd in tsc_save_sched_clock_state at arch/x86/include/asm/paravirt.h:192 1.3 y 0xffffffff8101d555 in tsc_restore_sched_clock_state at arch/x86/include/asm/paravirt.h:192 1.4 y 0xffffffff810b5c30 in sched_clock at kernel/sched/clock.c:71仔细得看了一下第一个断点, 正常
unsigned long long sched_clock(void) { return paravirt_sched_clock(); } (gdb) disassemble sched_clock Dump of assembler code for function sched_clock: 0xffffffff8101cf00 <+0>: push %rbp 0xffffffff8101cf01 <+1>: mov %rsp,%rbp ------------------------------------------------------------------------------- 0xffffffff8101cf04 <+4>: callq *0xffffffff81a463c0 ------------------------------------------------------------------------------- 0xffffffff8101cf0b <+11>: pop %rbp 0xffffffff8101cf0c <+12>: retq End of assembler dump.看第二个使用的地方tsc_save_sched_clock_state
void tsc_save_sched_clock_state(void) { if (!sched_clock_stable()) return; cyc2ns_suspend = sched_clock(); } (gdb) disassemble tsc_save_sched_clock_state Dump of assembler code for function tsc_save_sched_clock_state: 0xffffffff8101d4f0 <+0>: push %rbp 0xffffffff8101d4f1 <+1>: mov %rsp,%rbp 0xffffffff8101d4f4 <+4>: callq 0xffffffff810b5d30 <sched_clock_stable> 0xffffffff8101d4f9 <+9>: test