分页: 1 / 1

请教内核计时器的问题

发表于 : 2019-02-27 11:33
西瓜q籽
大家好 我是萌新,写内核驱动模块的时候遇到一个问题:

我的ubuntu是 32位的 16.04

代码: 全选

        init_timer(&stats_timer);
        stats_timer.expires=jiffies + HZ;
        stats_timer.data=(unsigned long) pdev;
        stats_timer.function = poll_stats;
        add_timer(&stats_timer);
这是驱动里面的代码,编译的时候发现 init_timer这个函数 implicit declaration的,而timer_list也没有.data这一项。

我打开了从系统拷贝的内核<linux/timer.h>,发现里面确实找不到上面说的

代码: 全选

struct timer_list {
	/*
	 * All fields that change during normal runtime grouped to the
	 * same cacheline
	 */
	struct hlist_node	entry;
	unsigned long		expires;
	void			(*function)(struct timer_list *);
	u32			flags;

#ifdef CONFIG_LOCKDEP
	struct lockdep_map	lockdep_map;
#endif
};
我想请教下是不是因为内核版本太高,导致老的timer.h里面支持的函数不支持了,如果是这样的话,我应该如何解决? :Adore

Re: 请教内核计时器的问题

发表于 : 2019-02-27 15:55
zzugyl
没有查具体的函数。写内核驱动都是要配合版本号的。

Re: 请教内核计时器的问题

发表于 : 2019-02-27 17:08
astolia
既然你要搞内核驱动,那么最好去git仓库clone一份完整的内核源代码,用git的版本历史功能来应对这种内核变化会方便很多。
最不济也要收藏这个站点 https://elixir.bootlin.com/linux/latest/source/ ,可以检查各个版本的变化情况,查找各种函数、常量的定义和使用也很方便。

回到你的问题。用上面那个网站定位到timer.h文件,https://elixir.bootlin.com/linux/latest ... ux/timer.h
此时点击左侧各个版本号,就可以看到各个版本下的timer.h。利用二分查找法,能很快定位到init_timer最后一次出现是在4.14版系列中,也能知道init_timer实际上是在调用init_timer_key。所以在新版本内核中你可以直接用init_timer_key。

如果你想让你的代码支持针对不同版本的内核,那么就要用到条件编译宏

代码: 全选

#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0)
  init_timer_key()
#else
  init_timer()
#endif

还有timer_list结构的data字段,其从4.15内核中移除的原因,见 https://lwn.net/Articles/735887/

Re: 请教内核计时器的问题

发表于 : 2019-02-27 17:30
西瓜q籽
astolia 写了: 2019-02-27 17:08 既然你要搞内核驱动,那么最好去git仓库clone一份完整的内核源代码,用git的版本历史功能来应对这种内核变化会方便很多。
最不济也要收藏这个站点 https://elixir.bootlin.com/linux/latest/source/ ,可以检查各个版本的变化情况,查找各种函数、常量的定义和使用也很方便。

回到你的问题。用上面那个网站定位到timer.h文件,https://elixir.bootlin.com/linux/latest ... ux/timer.h
此时点击左侧各个版本号,就可以看到各个版本下的timer.h。利用二分查找法,能很快定位到init_timer最后一次出现是在4.14版系列中,也能知道init_timer实际上是在调用init_timer_key。所以在新版本内核中你可以直接用init_timer_key。

如果你想让你的代码支持针对不同版本的内核,那么就要用到条件编译宏

代码: 全选

#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,15,0)
  init_timer_key()
#else
  init_timer()
#endif

还有timer_list结构的data字段,其从4.15内核中移除的原因,见 https://lwn.net/Articles/735887/
谢谢!正在按照您说的办法更新程序,太赞了!