- 论坛徽章:
- 1
|
大学期间一直是打酱油的,连课程大作业都是老师见我想哭的样子不好意思为难了,谁知道一工作就让我搞内核,也不知道那时候的老大看中了我那一点,自己是一点自信都没有的,通知上班了,心里还一点底也没有,只能自我安慰说,没事的,既然人家都觉得你可以了,你就去吧。就这样入了内核的门,一开始也是各种状况的,各种折腾。想到什么需求就直接做,试过有一次在软中断中写文件,系统一下子就panic了。当时整个人懵了,这可怎么调试啊!完全超出了当时对调试的认知,也多亏当时的老大指导,搭好了crash+kdump的环境,学会了我的第一个内核调试工具,后面随着接触的多,也会用jprobe,dump_stack ,等函数来辅助调试,还有各种工具,内核自带的kmemleek,systemtap,kgdb,最近也学会了通过串口来进行采集信息,看netpoll的介绍的时候还发现netconsole,在中断不可用的情况下,直接调用中断处理函数来进行处理的。感觉内核好多好玩的东西。估计这也是内核的魅力所在吧,只要你了解了,可以根据自己的需求做各种各样东西,一点限制都没有。
分享一个具体的例子
有个需求是要在内核进行组播,找了个遍,网上的组播的例子,都是在应用层。正郁闷的时候,脑袋瓜子闪了一下,应用层的函数肯定最后都会调用到内核的API的,我只需要找到内核对应的函数,直接调用就好了。关键要处理的是interface加入组播组,让数据包能上ip层,只要上了ip层,一切好办,利用netfilter的框架hook一个函数根据目的ip和端口进行接收处理就ok了
找到内核加入组播组的API ,int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr)分析一下,sk和imr 这两个参数带下来了什么,就知道在内核层调用的话,需要那些参数,然后参考ip_mc_join_group的实现,实现了一个内核层加入组播组的API,思路大概就是这样,具体实现忘记了,实现过程中可能会有各种小问题,想办法死磕就行,反正到最后搞定了 lol,
其实这里还遗留了一些问题,组播接收的时候是根据组播号和端口(就是数据包的目地ip和目的端口)来确定这个组播包是不是给某个进程,因为我的这个实现都是在三层以及三层以下处理的,而且没有对端口做判断,就是不管应用层有没有用到这个端口,反正如果组播号和端口符合指定的,就会先被三层的这个hook 函数拦下了。如果应用层刚好有个进程端口用一样的,interface加入的组播组也是一样的,就会接收不到数据。
当时老大是觉得反正机器上面跑什么进程都是我们控制的,人为的不要产生冲突就好。我也就懒得去折腾了。 
呃,说到最后,感觉乱来了,哈哈,不太会表达
最后还是要感谢一下GFree_Wind的,面试的时候一句话解开了困惑了我很久的问题 |
评分
-
查看全部评分
|