linux内核中追踪jiffies的定义

linux内核中追踪jiffies的定义
最近我在阅读linux内核源码很多代码使用了一个名为“jiffies”的全局变量但是如果你去追踪这个“jiffies”变量的定义位置的时候会只能找到对应全局变量声明而找不到全局变量定义。如下面static bool mfc_cmd_host2risc(enum mfc_facade_cmd cmd, int arg1, int arg2, int arg3, int arg4) /**从host到risc发送命令 */ { enum mfc_facade_cmd cur_cmd 0; unsigned long timeo jiffies; timeo 20; /* waiting for 100ms */ /* wait until host to risc command register becomes H2R_CMD_EMPTY */ while (time_before(jiffies, timeo)) { cur_cmd READL(MFC_HOST2RISC_COMMAND); if (cur_cmd H2R_CMD_EMPTY) /**H2R:host2RISC */ break; msleep_interruptible(2); } if (cur_cmd ! H2R_CMD_EMPTY) return false; WRITEL(arg1, MFC_HOST2RISC_ARG1); WRITEL(arg2, MFC_HOST2RISC_ARG2); WRITEL(arg3, MFC_HOST2RISC_ARG3); WRITEL(arg4, MFC_HOST2RISC_ARG4); WRITEL(cmd, MFC_HOST2RISC_COMMAND); return true; }追踪jiffies的定义发现只能在“jiffies.h”中找到全局变量声明#define __jiffy_data __attribute__((section(.data))) /* * The 64-bit value is not atomic - you MUST NOT read it * without sampling the sequence number in xtime_lock. * get_jiffies_64() will do this for you as appropriate. */ extern u64 __jiffy_data jiffies_64; extern unsigned long volatile __jiffy_data jiffies;因为太多代码都使用了jiffies这个全局变量了如果直接全局搜索不易于大海捞针。之所以找不到这个全局变量的定义一种可能是因为变量是使用宏定义“##”链接符号组成的但是jiffies绝对不是这种情况因为jiffies变量名就一个单词。还有一种情况就是变量jiffies不在源文件中定义而是在汇编.S中定义显然如果根据搜索结果查找的话也没有找到。还有一种情况就是使用宏定义#define替代方式也不是属于这种用法。还有一种用法就是使用alias别名编译器参数的方式给一个变量起别名显然也不是这种。我到这里和大家一样也是卡住了幸好现在有AI于是我问了一下vscode中Github Copilot让它帮我找一下最终在linux的链接脚本vmlinux.lds中找到一行赋值代码也就是链接脚本中使用赋值的方式给一个现有变量取别名实现了一个变量两个变量名字。也就是将jiffies_64这个变量的地址赋值给了jiffies因此一个变量的地址有了2个名字也可以这么说同一个内存变量有2个名字。这个也可以从.map文件中验证这个结论只不过是有了结果才得出结论的也就是反推得出的结论。下一步就是搜索“jiffies_64”这个变量的定义即可通过vscode的搜索工具搜索得到:kernel/timer.c中找到一下结果u64 jiffies_64 __cacheline_aligned_in_smp INITIAL_JIFFIES;