loopback NIC 驱动剖析Series.doc
上传人:sy****28 上传时间:2024-09-15 格式:DOC 页数:6 大小:61KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

loopback NIC 驱动剖析Series.doc

loopbackNIC驱动剖析Series.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"javascript:;"loopbackNIC驱动剖析Series---(1)声明:本文为原创#####请转贴时保留以下内容######作者:GTT本文档归属HYPERLINK"http://blog.chinaunix.net/link.php?url=http://oldtown.cublog.cn%2F"http://oldtown.cublog.cn/.转载请注明出处!请提出宝贵意见Mail:mtloveft@hotmail.comLinuxVersion:2.6.33提示:本文是介绍关于linux如何实现loopbackNIC驱动!想对linux协议栈全面了解,网卡驱动是比较基础的。而loopback设备又是虚拟设备,不涉及到中断和DMA等,所以还是比较简单的。先从loopback驱动下手的另外一个原因是它是系统第一个注册的网络驱动程序。普通的网卡驱动都是以模块化注册到系统的,但loopback驱动是和kernel一体的,直接在linux启动时被调用。驱动被调用的过程kernel启动时,会执行start_kernel方法,在start_kernel里会初始化很多组件和子系统。也就是上图的other_init代替了这些初始化过程。start_kernel在执行到最后就会启动initkernelthread。它会完成剩下的初始化程序。其中在do_initcalls里将会按照顺序执行初始化程序。其中系统注册过以下方法subsys_initcall(net_dev_init)//net/core/dev.c当执行net_dev_init时,就会调用loopbackNIC的驱动程序。staticint__initnet_dev_init(void){......if(register_pernet_device(&loopback_net_ops))gotoout;......}当执行register_pernet_device时intregister_pernet_device(structpernet_operations*ops){interror;mutex_lock(&net_mutex);error=register_pernet_operations(&pernet_list,ops);if(!error&&(first_device==&pernet_list))first_device=&ops->list;mutex_unlock(&net_mutex);returnerror;}继续跟进到register_pernet_operationsstaticintregister_pernet_operations(structlist_head*list,structpernet_operations*ops){interror;if(ops->id){again:error=ida_get_new_above(&net_generic_ids,1,ops->id);if(error<0){if(error==-EAGAIN){ida_pre_get(&net_generic_ids,GFP_KERNEL);gotoagain;}returnerror;}}error=__register_pernet_operations(list,ops);if(error){rcu_barrier();if(ops->id)ida_remove(&net_generic_ids,*ops->id);}returnerror;}看看loopback注册structpernet_operations的定义/*Registeredinnet/core/dev.c*/structpernet_operations__net_initdataloopback_net_ops={.init=loopback_net_init,};loopback_net_ops没有注册id,所以ops->id为NULL。直接执行__register_pernet_operationsstaticint__register_pernet_operations(structlist_head*list,structpernet_operations*ops){interr=0;err=ops_init(ops,&init_net);if(err)ops_free(ops,&init_net);returnerr;}继续跟进ops_initstaticintops_init(conststructpernet_operations*ops,structnet*