免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2754 | 回复: 7
打印 上一主题 下一主题

[内核入门] 求助sk_buff修改的问题--有同样经历的希望能些提示 [复制链接]

论坛徽章:
2
天秤座
日期:2014-01-09 21:41:17双鱼座
日期:2014-02-20 21:50:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-23 15:13 |只看该作者 |倒序浏览
目标:想在sk_buff结构体中增加一个 字段。
kernel 2.6.33.4
struct sk_buff
{
        __u16                mac_len,
                                myheader_len, //myheader_len 为增加字段
                                hdr_len;
};
myheader_len 为增加字段

考虑到 skb是从两个高速缓存中分配的,增加了字段,应该相应增加分配区的大小,于是看了
void __init skb_init(void)
{
        skbuff_head_cache = kmem_cache_create("skbuff_head_cache",
                                              sizeof(struct sk_buff),
                                              0,
                                              SLAB_HWCACHE_ALIGN|SLAB_PANIC,
                                              NULL);
        skbuff_fclone_cache = kmem_cache_create("skbuff_fclone_cache",
                                                (2*sizeof(struct sk_buff)) +
                                                sizeof(atomic_t),
                                                0,
                                                SLAB_HWCACHE_ALIGN|SLAB_PANIC,
                                                NULL);
}
因为 两个缓存在分配时都是使用  sizeof(struct sk_buff)来计算大小,所以认为 源码仅为 sk_buff添加一字段时,sizeof(struct sk_buff) 会自动增大你的存储空间,应该没有问题的,但事实却是这样行不通。编译顺利通过,reboot现在内核后 就会死掉
出现下列错误

想问下大家 这样的思路 错在哪里了?先谢谢大家啦

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-12-23 15:47 |只看该作者
回复 1# duoniK
如果是我遇到这个问题,我的debug思路。

1. 将源码改回原来正确的代码,编译重启,看是否正常启动。
2. 只修改sk_buff结构体头文件,其他不添加任何代码,编译重启,看是否正常启动。
3. 添加其他逻辑代码,编译重启,看是否正常启动。

   

论坛徽章:
2
天秤座
日期:2014-01-09 21:41:17双鱼座
日期:2014-02-20 21:50:54
3 [报告]
发表于 2013-12-23 15:51 |只看该作者
是的。将sk_buff中添加的那一个字段删除(此时已经还原回原来的源码,其他的源代码都没有改动过)编译并reboot可正常启动。但仅仅添加这一个字段就不能用了回复 2# 瀚海书香


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2013-12-23 16:05 |只看该作者
duoniK 发表于 2013-12-23 15:13
目标:想在sk_buff结构体中增加一个 字段。
kernel 2.6.33.4
struct sk_buff

估计是__kfree_skb中使用了专用的释放接口,建议跟踪看看具体出错的代码行或反汇编代码。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2013-12-23 16:06 |只看该作者
回复 3# duoniK
1. 你的内核版本
2. git diff或者git format-patch列出你的改动

   

论坛徽章:
2
天秤座
日期:2014-01-09 21:41:17双鱼座
日期:2014-02-20 21:50:54
6 [报告]
发表于 2013-12-23 16:39 |只看该作者
内核是2.6.33.4
源代码什么都没改,仅仅在 include/linux/skbuff.h 中的 struct sk_buff中添加了一个字段
struct sk_buff
{
....
        __u16                mac_len,
                                mytcp_len, //mytcp_len 为添加字段
                                hdr_len;
....
};
将mytcp_len 字段删除,恢复源码后 就可以正常运行了。
回复 5# 瀚海书香


   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
7 [报告]
发表于 2013-12-25 08:49 |只看该作者
回复 6# duoniK
昨天在我这边测试了一下,第一次果然也是panic了。于是认真check了一下代码,没有发现问题。怀疑内核的依赖关系,导致修改了include/linux/skbuff.h后,某些模块没有重新编译,于是make clean后重新编译,重启OK了。估计你的问题也这个原因导致的

测试内核:SLES 3.0.76


   

论坛徽章:
2
天秤座
日期:2014-01-09 21:41:17双鱼座
日期:2014-02-20 21:50:54
8 [报告]
发表于 2013-12-27 15:38 |只看该作者
本帖最后由 duoniK 于 2013-12-27 15:38 编辑

这两天一直在做调整,一直没成功,今天才成功。所以回复完了,谢谢版主这两天的帮忙。
总结下方便别人学习,之前错误的原因是因为字段添加的位置不对,sk_buff这个结构体是对 内存结构对齐有要求的,所以随便添加这个字段时会出错的,自己将其添加在尾部就正确了。
回复 7# 瀚海书香


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP