一个人的差异在于业余时间
在实际的项目中,最难缠的问题就是内存泄漏,当然还有panic之类的,内存泄漏分为两部分用户空间的和内核空间的.我们就分别从这两个层面分析一下. 用户空间查看内存泄漏和解决都相对简单。
关于qos ,也是linux下面必备功能之一,一般只需要结合iptables/etables/iproute2 和tc配合即可实现大部分功能. 网上讲这么方面的资料很多,大部分都讲tc命令的应用.这里就先从理论入手. QoS(Quality of Service)服务质量,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。
讲了filter、ct、nat 现在剩下最后一个知名模块mangle,但是自身虽然知道内核支持修改数据包的信息,它主要用在策略路由和qos上.我们就具体分析一下. mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(T...
关于nat,在实际应用中还是很广泛的,snat/dnat/dmz/等等.下面我们就结合代码深入分析下nat的运作. 参考:iptables.1.4.21 kernel 3.8.13 NAT英文全称是“Network Address Translation” 顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。
ct是netfilter非常重要的基础和架构核心.它为状态防火墙,nat等打下基础. 一直觉的它很神秘,所以就下定决心分析一下. 这里依然不从框架开始说,而是从实际代码着手.
上一篇文章分析了iptables代码下发运作的流程细节,篇幅有限还有很多需要补充.关于netfilter的框架网上已经被讲烂了,框架很简单,但是实现却不简单.但不论什么都要最终归到实际应用上,才能体现其价值.
在上一节中,我们调试了malloc,调试它需要自己下载glibc的源码,自己编译,替换linux系统的c库。 环境当时用的是ubuntu14 ,glibc版本系统默认为glibc2.
对于内核的内存管理,像kmalloc,vmalloc,kmap,ioremap等比较熟悉。而对用户层的管理机制不是很熟悉,下面就从malloc的实现入手.( 这里不探讨linux系统调用的实现机制.
之前多多少少接触过cache之类的东西,总觉的很神秘,当然cache就是为了读写内存更高效。比如查看meminfo或者slabinfo的时候,你是否真的对内存机制理解的很清晰? 参考内核linux 3.
这里只说物理内存管理 linux内核的,看了很多讲解的内存的东西,但是自己总结的时候总感觉无从下手,这里就从实际物理内存分配接口开始吧。 Kmalloc 它分配连续的物理内存空间 ,它不负责把分配的内存空间清零,它能分配多大的呢?并且它只能分配ZONE_NORMAL的不能分配dma和high里的,也就是只分配低端内存.一般情况下内存被分为三个zone:NORMAL、DMA、HIGH. 这个函数是建立在slab分配器的基础上的,通过cache 而cache有通过slab 分配obj 。
搞过网络的人,一般都会用到抓包分析工具,在windows下一般就是wireshark,在linux下面一般系统自带tcpdump. 这里我们就说说tcpdump,对于它的如何使用,请看资料,本身它支持的选项并不复杂,复杂的是它支持的过滤表达式.
上一节只是说了关于网桥的接收处理,这里分析下网桥模块的初始化工作. 对于桥的用户空间配置工具一般来说有brctl和ebtables. 参考内核 2.6.32.61 kernel/net/bridge/* 我们来看一下br.
关于桥的知识,网上有很多文章,网桥从开始的硬件设备,到现在linux内核的软实现,包括后来的vlan,switch芯片.这里也是参考了《深入理解linux网络内幕》中桥的部分. 参考内核2.6.32.61 kernel/net/bridge/* 这里先普及下知识: HUB:整个HUB就是一个冲突域,采用CSMA/CD机制检测和侦听,从一个端口进来的数据包不经分析就会被转发到其它所有端口发送出去,连在此HUB上的设备共享带宽,利用率低,效率低,有距离限制,任意一个时刻只能有2台计算机之间可以通信。
上一节我们说了帧的接收,自然有收就有发,并且也很少说关于发送的东西,这里我们就分析下帧的发送. 参考内核2.6.32.60 net/core/dev.c 我们先看看设备无关层的经典发送函数接口 dev_queue_xmit,当然这里要说一下...
关于帧的接收,其实在前面Napi机制中,我们已经能够明白大致流程,或者网卡驱动的流程. 但是这里仍要在说一下,注意一些细节,和系统的勾画一下画面. 其实这个流程挺乏味的,单线程,剧情单一你懂的~.
在做驱动的时候,写网卡驱动,最多会用到register_netdev , alloc_netdev这些常用的接口,然后就是结构体的初始化.至于注册进入内核后,是一个怎么样的流程,一直是一个觉的明白,说起来很模糊的状态.
我们在编写驱动的时,可能需要变成成模块(*.ko)来加载,比如常用的wifi驱动,在模块加载的时候,我们还希望能够动态的传递一些参数,这时候就需要Module_param系列宏,参考内核2.
虽然做了很久的网卡驱动,熟悉npai机制,但是一直没有底气去深入内核学习,作为学习的引导书《深入理解linux网络内幕》,写点学习心得. 参考内核 linux 2.6.32.