编译了一个模块,在内核空间启动一个实时任务。
insmod 后直接提示“已杀死”。
lsmod 后发现这个模块正在被使用(used 一栏显示 1),但是后面没有显示是被哪个模块使用...(by
一栏是空的),所以也没办法卸载,rmmod -f 也不好用...
dmesg发现打印的出错信息是指针问题,只能逐行的添加printk调试,最后发现在构造包头的时候,将skb_put和skb_push的用法弄错了。
用法如下:
skb_put(skb,len)和skb_push(skb,len)的区别
skb_put()
增长数据区的长度来为memcpy准备空间. 许多的网络操作需要加入一些桢头, 这可以使用skb_push来将数据区向后推,
为头留出空间.
请参见下图:
----------------------------------------
| head | data | |
----------------------------------------
skb_put
-----------------------------------------
| head | data | put_data | |
-----------------------------------------
skb_push
------------------------------------------
| head | push_data | data | put_data | |
------------------------------------------