请教内核计时器的问题

内核编译和嵌入式产品的设计与开发
回复
西瓜q籽
帖子: 3
注册时间: 2019-02-27 11:25
系统: ubuntu 16.04 32位

请教内核计时器的问题

#1

帖子 西瓜q籽 » 2019-02-27 11:33

大家好 我是萌新,写内核驱动模块的时候遇到一个问题:

我的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
*********************************************************
作为一个萌新的我,如果提的问题太蠢,请多包涵
头像
zzugyl
帖子: 356
注册时间: 2011-03-07 17:26
系统: Ubuntu 20.04.3 LTS

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

#2

帖子 zzugyl » 2019-02-27 15:55

没有查具体的函数。写内核驱动都是要配合版本号的。
常在深闺人未识 一朝成名天下知
头像
astolia
论坛版主
帖子: 6453
注册时间: 2008-09-18 13:11

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

#3

帖子 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/
西瓜q籽
帖子: 3
注册时间: 2019-02-27 11:25
系统: ubuntu 16.04 32位

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

#4

帖子 西瓜q籽 » 2019-02-27 17:30

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/
谢谢!正在按照您说的办法更新程序,太赞了!
*********************************************************
作为一个萌新的我,如果提的问题太蠢,请多包涵
回复