我们编写了LKM,它使用netfilter挂钩来拦截IP数据包.问题是,在1Gb/s有效载荷上,我们看到钩子只通过软irq加载一个CPU核心.其他15个核心闲置.所以我得出的结论是钩子不是多线程的.
所以我的问题是:有什么方法可以解决多核上的钩子处理问题?
我有C函数做一些SSE计算.当我用GCC编译它时,我得到下一个代码
/* Start of function */
mov (%rdi),%rax
movslq %ecx,%rcx
...
mov 0x8(%rdi),%rax
pxor %xmm12,%xmm3
movaps %xmm0,-0x28(%rsp)
movaps %xmm6,%xmm1
...
movaps 0x50(%rax,%rcx,1),%xmm2
movaps 0x60(%rax,%rcx,1),%xmm15
pxor %xmm2,%xmm0
pxor %xmm2,%xmm6
movaps -0x28(%rsp),%xmm2
pxor %xmm15,%xmm5
pxor %xmm15,%xmm2
movaps 0x70(%rax,%rcx,1),%xmm15
movaps (%rax,%rcx,1),%xmm11
mov 0x10(%rdi),%rax
movaps %xmm15,-0x18(%rsp)
pxor %xmm11,%xmm4
pxor %xmm12,%xmm11
pxor %xmm15,%xmm12
Run Code Online (Sandbox Code Playgroud)
查看movaps说明 - 它是堆栈顶部的访问内存:
movaps %xmm15,-0x18(%rsp)
Run Code Online (Sandbox Code Playgroud)
它不是访问未定义的内存吗?为什么GCC生成了这样不正确的代码?