![](https://csdnimg.cn/release/download_crawler_static/49485957/bg4.jpg)
邻元素的信息的数据结构。该结构中有个元素是 neighbour 结构的数组,数组
的每一个元素都是一个对应于邻机的 neighbour 结构,系统中由于协议的不
同,会有不同的判断邻居的方式,每种都有 neighbour_table{} 类型的实例,
这些实例是通过 neighbour_table{} 中的指针 next 串联起来的。在
neighbour 结构中,包含有与该邻居相连的网络接口设备 net_device 的指针,
网络接口的硬件地址,邻居的硬件地址,包含有 neigh_ops{} 指针,这些函数
指针是直接用来连接传输数据的,包含有 queue_xmit(struct * sk_buff) 函
数入口地址,这个函数可能会调用硬件驱动程序的发送函数。
2.FIB 结构在 FIB 中保存的是最重要的路由规则 ,通过对 FIB 数据的查找和
换算,一定能够获得路由一个地址的方法。 系统中路由一般采取的手段是: 先到
路由缓存中查找表项, 如果能够找到, 直接对应的一项作为路由的规则; 如果不
能找到,那么就到 FIB 中根据规则换算传算出来,并且增加一项新的,在路由
缓存中将项目添加进去。
3.route 结构(即路由缓存中的结构 )
数据链路层:
net_device{} 结构,对应于每一个网络接口设备。 这个结构中包含很多可以
直接获取网卡信息的函数和变量, 同时包含很多对于网卡操作的函数, 这些直接
指向该网卡驱动程序的许多函数入口, 包括发送接收数据帧到缓冲区等。 当这些
完成后,比如数据接收到缓冲区后便由 netif_rx( 在 net/core /dev.c 各种设备
驱动程序的上层框架程序 )把它们组成 sk_buff 形式挂到系统接收的 backlog 队
列然后交由上层网络协议处理。同样,对于上层协议处理下来的那些 sk_buff 。
便由 dev_queue_xmit 函数放入网络缓冲区, 交给网卡驱动程序的发送程序处
理。
在系统中存在一张链表 dev_base 将系统中所有的 net_device{} 结构连在
一起。对应于内核初始化而言, 系统启动时便为每个所有可能支持的网络接口设
备申请了一个 net_device{} 空间并串连起来,然后对每个接点运行检测过程,
如果检测成功,则在 dev_base 链表中保留这个接点,否则删除。对应于模块
加载来说,则是调用 register_netdev() 注册 net_device, 在这个函数中运行
检测过程,如果成功,则加到 dev_base 链表。否则就返回检测不到信息。删
除同理,调用
unregister_netdev 。
2. 启动分析
2.1 初始化进程 :
start-kernel(main.c)---->do_basic_setup(main.c)---->sock_init(/net
/socket.c)---->do_initcalls(main.c)