《深入理解Linux网络技术内幕》阅读笔记(五)

通过中断,NIC能够告知其驱动程序几种不同的事情,包括:
1.接收一帧。
2.传输失败。
3.DMA传输已成功完成。给定一个帧传输,当帧上载至NIC的内存准备在此媒介上传输时,驱动程序就会将持有该帧的缓冲区释放掉。使用同步传输时(无DMA),当该帧已上传至NIC,驱动程序就会立刻知道。但使用DMA时,也就是使用异步传输,设备驱动程序必须等待NIC发出明确的中断事件。
4.设备有足够内存处理新传输。该情况包括了一种巧妙的传送节流方式,做的恰当的话,可以改善效率。在此系统中,设备驱动程序会在队列空间缺乏时关闭输出,同时要求NIC当可用内存大于给定量时(一般而言就是该设备的MTU),就发出一个中断,然后当中断到来时重启传输。
驱动程序可以用netif_stop_queue停止设备队列,因此能禁止内核提交后续的传输请求。然后,驱动程序会检查设备的内存是否有足够的空间容纳一个1536个字节的包。如果有,驱动程序就会启动队列,允许内核再次提交传输请求;否则,就会指示设备(通过一个outw调用写一个配置寄存器),当条件满足时,产生一个中断。中断处理例程将使用netif_start_queue重启设备队列,使内核能够重新继续传输。
中断处理例程组织:
这里写图片描述
随机数:
随机数的产生是通过一个辅助函数,内核借此函数令其自身某些活动随机化。例如,那些网络子系统通常会对定时器的延时加入一个随机组件,使得定时器不太可能同时执行,而且通过后台处理使得CPU的负载下降。随机化也可防御某些试图猜出特定数据结构组织的而人所进行的Dos(服务拒绝)攻击。
与用户空间交互:
这里写图片描述
这里写图片描述
1.当管理员使用ifconfig配置一张设备驱动程序尚未加载的网卡,如设备eth0时,则内核向/sbin/modprobe发送一个请求,以加载名称为eth0的模块。如果/etc/prorobe.conf包含“alias eth0 3c59x”条目,则/sbin/modprobe会尝试加载模块3c59x.ko。
2.当管理员以IPROUTE2包的tc命令配置一个设备的流量控制时,可能会涉及不在内核内的队列规则或分类器。这种情况下,内核向/sbin/modprobe发送一个请求,以加载相关的模块。
热拔插:
当你编译内核模块时,目标文件默认在/lib/modules/kernel_version/目录下,而kernel_version是指内核版本,如2.6.12.在同一目录下,你可以发现两个有趣的文件:modules.pcimap和modules.usbmap。这些文件分别包含内核所支持的设备的PCI ID和USB ID。此外,这些文件还包含了相关联的内核模块的引用。当用户空间辅助程序接收到一个可热拔插设备正插入的通知信息时,就会使用这些文件找出正确的设备驱动程序。
内核会调用kobject_hotplug函数以响应一个设备的插入和删除以及其它事件。kobject_hotplug会把arg[0]的初值设为/sbin/hotplug,把arg[1]设为要使用的代理程序。/sbin/hotplug是一个简单脚本,把事件的处理委托给arg[1]指定的另一个脚本(代理程序)。
虚拟设备
这里写图片描述

阅读更多
想对作者说点什么? 我来说一句

深入理解LINUX网络技术内幕 中文版

2014年06月10日 118.5MB 下载

深入理解LINUX网络技术内幕.pdf

2017年07月16日 124.74MB 下载

没有更多推荐了,返回首页

不良信息举报

《深入理解Linux网络技术内幕》阅读笔记(五)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭