我正在研究Linux内核模块。
在头文件中定义的结构tcpsp_conn如下:
struct tcpsp_conn {
...
struct timer_list timer; /* exp. timer*/
...
};
然后我声明一个指向该结构的指针,然后尝试分配该函数:
struct tcpsp_conn *cp;
cp->timer.function = tcpsp_conn_expire;
tcpsp_conn_expire函数的定义方法与内核的struct timer_list中的定义相同:
static void tcpsp_conn_expire(unsigned long data)
我不明白为什么会出现此错误: 错误:来自不兼容指针类型[-Werror = incompatible-pointer-types]的赋值 cp-> timer.function = tcpsp_conn_expire;
看起来类型没有问题。
答案 0 :(得分:1)
tcpsp_conn_expire
函数的类型与.function
结构的timer_list
字段的类型不同。
在最新的内核(自4.15开始)中,此函数字段使用struct timer_list *
参数而不是unsigned long
声明,如下所示:
struct timer_list {
...
void (*function)(struct timer_list *);
...
};
具有这样的参数,您可以使用宏struct tcpsp_conn
获取指向嵌入了计时器的container_of
结构的指针。