Linux 杂项,记录Linux 下的一些点滴心得,以供参考

1. netfilter 看到的skb 报文非线性


问题现象

netfilter 看到的skb 报文非线性,即报文全体并不存在于skb->data 内存空间内,导致我们的应用协议处理故障


详细过程

使用tcpreplay 打包测试,HTTP Get请求包,发现部分报文的skb 非线性,即skb->data_len大于0,详细测试结果如下:


GET 请求包大小743字节(包含二层头),skb 非线性,L7层协议的内容不在skb 线性内存中


GET response 包大小为344字节,skb 线性。


感觉上igb会按照报文大小作skb 线性非线性处理。


解决方法

在我们的应用协议处理最前面增加skb 线性化过程


遗留问题

大部分网卡都不会将单个报文拆分成非线性的skb,不清楚igb 网卡为何要如此处理,是否可以关闭网卡的某个属性达到skb 线性的效果?


2. 获取内核模块的起始地址和大小

这个问题的原由是处理内核模块panic,串口输出的函数调用栈是错误的,但展现的内存绝对地址是正确的,不过由于不知道内核模块的起始地址,故无法反汇编出出问题的代码位置。


其实过程非常简单,在模块初始化时利用__this_module这个内嵌变量,为struct module结构,其中的module_core为当前模块的起始地址,core_size为模块的大小


你可能感兴趣的:(linux,Module)