首页 > 技术文章 > Linux系统当app发起socket传输直至网卡驱动,是怎样从socket访问到net_device的(简析)

normalmanzhao2003 2019-08-12 03:30 原文

一、序言
1、Linux内核版本:3.4.2
2、参考资料
-《嵌入式学习-驱动开发-lesson7.1-网卡驱动架构分析驱动及CS8900流程分析》
-《浅析Linux Kernel 哈希路由表实现(二) -- 算法》
3、本文的目的
为了解“Linux系统当app发起socket传输直至网卡驱动,是怎样从socket访问到net_device的”大致的来龙去脉,以便以后在做网卡驱动移植工作时,做到心里有底。

二、正文
2.1概述答案:
(net_device, IP_addr)的对应关系被保存在全局的inet_addr_lst哈希表里(例如ifconfig就会导致这张表被更新)。
当应用程序通过socket API发起一次网络传输后,经过内核里的九转十八弯,net_device会被从inet_addr_lst里取出,并存入路由缓存rtable->dst_entry->dev里,并且还会把rtable和sock关联起来(有关linux的路由表这块,比较复杂,但由于比较独立,和网卡驱动无太大关联,所以等以后有时间再研究)。
最后,当IP层构造sk_buff时,会从sock 的sk_write_queue队列中取出一个sk_buff,然后设置skb->_skb_refdst = rtable->dst_entry,由此建立了sock和net_device的关联。

2.2 调用栈分析

2.3 UML图(草图)

推荐阅读