全部博文(321)
分类: 嵌入式
2013-03-25 23:20:57
通过接口来访问;
一、从上到下:网络协议接口层、网络设备接口层、设备驱动功能层、网络设备与媒介层。
二、网络协议接口层:
a) 发送数据:dev_queue_xmit()
b) 接收数据:netif_rx()
三、网络设备接口层:网络设备属性和操作的结构体:net_device。Eth0。
四、设备驱动功能层:是数据结构的具体net_device的具体成员,是趋势网络设备硬件完成相应的动作的程序。通过hard_start_xmint()函数启动发送操作,通过中断触发接收操作。
五、网络设备与媒介层:完成数据包的发送和接收的物理实体。
六、工作流程:应用层(应用程序)------->协议层(也在内核)-----通过sk_buff---->发送给底层------>发送buf--------------->接收的buf------>产生中断--------->跳到中断处理函数------>把数据放在sk_buff----------->通知协议层----->等待队列------>应用层
附:红色的是驱动工程师负责的主要工作。
Sk_buff 非常重要,是网络子系统数据传输的“中枢神经”,套接字缓存区。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。
七、在Linux中所有网络设备都抽象为一个接口.。字符设备和块设备()通过节点。网络设备通过接口。
八、把接收到的数据发送给硬件的buf,然后调用hard_start_xmint()来发送数据给接收方。把收到的东西发送给sk_buff。具体过程是在接收到数据产生中断,然后在中断处理函数完成把数据发送给sk_buff.
九、网络设备不会在/dev下存在一个设备入口,它使用保留的内部设备名.(eth0,lo回环)。
十、异步:收发同时进行,并行,同步:收发按一定的顺序执行,,网络设备异步的接收外来的数据包
十一、网络设备同时要执行大量的管理任务
a) 设置地址
b) 修改传输参数
c) 维护流量和流量控制
d) 错误统计和报告
网络子系统是完全与协议无关的,网络驱动程序与内核其余部分之间的每次交互处理的都是一个网络数据包。
十二、一个套接字通过使用socket()函数惟一确定了一个端点(一个网络接口)。使用UDP和TCP时,端点就是本地或远程IP地址与端口的组合。
十三、套接字缓冲区(sk_buff)结构是Linux内核网络子系统的核心内容,在
a) struct net_device *input_dev;//指向正在接收的网卡
b) struct net_device *dev//正在发送的网卡。。。。。。//分别为接收和发送缓冲区的设备
十四、套接字缓冲区也要用函数来分配,和释放。
十五、通过IP访问,最后通过ARP(地址解析器)转换为48为的物理地址。
十六、Ifconfig 相当于激活一个网卡设备。
a) ifconfig开始会调用ioctl(SIOCSIFADDR)来将地址赋予接口。响应SIOCSIFADDR由内核来完成,与设备无关。
b) 接着,ifconfig会调用ioctl(SIOCSIFFLAGS),设置dev->flag的IFF_UP位来打开设备,这个调用会使得设备的open方法得到调用
c) 当ifconfig调用ioctl(SIOCSIFFLAGS),清除dev- >flag的IFF_UP位时,设备的stop方法将被调用
十七、 网络接口最重要任务就是发送和接收数据。
十八、 当内核要发送一个数据包时,它会调用hard_start_transmit方法来将数据放入发送队列。内核处理过的每个数据包位于一个套接字缓冲区(struct sk_buff)里面。相当于载体。
十九、 接收数据包首先通过设备中断,由硬件通知驱动程序有数据包到达。
二十、