Linux中如何把协议栈和网卡驱动关联起来的?
看了一下LDD3,在示例代码中好像没看到它如何和TCP/IP协议栈如何一起工作的,是ifconfig把它们联系到一起的?一个网卡驱动应该是可以同时支持多种协议的吧,而一个协议栈具体的传输也可以走不同的物理通道。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
看了一下LDD3,在示例代码中好像没看到它如何和TCP/IP协议栈如何一起工作的,是ifconfig把它们联系到一起的?一个网卡驱动应该是可以同时支持多种协议的吧,而一个协议栈具体的传输也可以走不同的物理通道。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
协议栈是上层实现的问题,驱动实际上只要满足上层接口以及向上提供统一接口就可以了。
问题是总有什么东西把它们胶合在一起吧,否则相互都不知道如何传数据?TCP/IP协议设计的时候也不是专门针对某个以太网卡的,如何针对某个IP发数据时走某个网卡?我想应该是网上的IP地址产生的影响吧,但具体如何实现的搞不清楚。而且我个网卡上同时有IP和IPX的以太网报文时总是有某种手段指导它们传到不同的上层协议栈的吧?
以及在VxWorks下比较简单,它是单一地址空间的,就是直接实现一些协议来由IP协议栈回调的,Linux里面目前还搞不清楚。
不是互相都不知道如何传递数据,而是你没有真正去跟内核源码路径,比如说int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
这个是ip层的入口,至于底层是如何实现的,如何调用这个入口的,你看看代码的实现就明了了。如果lz是写网卡驱动的,我想你肯定明白你的数据最后放到哪里了,这个数据由被上层在哪里调用处理了。
[ 本帖最后由 dreamice 于 2008-7-21 15:59 编辑 ]
没精力去看了,所以上来问一下,希望能有人讲个大概。你给的是2.4内核的吧,我大概对着图看了一下,它是通过添加设备时指定以太网类型的协议来关联到一起的吧,用softirq处理。不知道你这张图出自何处?2.6的内核改动非常大,完全对不上,我想通过ETH_P_IP使用的地方也许能找到,但找了半天看不出啥来,可能是完全换了一种方式?
我除了要做驱动之外,还要增加一个新的协议栈,现在新的协议栈如何提供给其他人编程应用也还不知道应该怎么办呢。
这个是2.4的,不过大概流程就是这样的,原理和2.6也差不多,只是有些实现机制有变化而已。协议栈之所以分层设计,是为了屏蔽差异,增强模块化及可扩展性。你在2.6顺着这个思路理一下,应该很快就清晰了。
PS:这个图来源的这本书很经典《LINUX网络体系结构》,只不过是基于2.4写的,有兴趣可以研读一下。
Thanks. 2.6是差不多,原来用Source Insight创建的2.6.9的工程有问题,有许多文件不知道为什么没有加到工程中所以在源代码搜索了半天不得要领。