08 2013 档案

Linux内存初始化
摘要:start_kernel -> setup_arch 在这个函数中我们主要看这几个函数.machine_specific_memory_setupmax_low_pfn = setup_memory();paging_initzone_sizes_init然后我们还要看build_all_zonelists();mem_init();//处理内存图,最后保存在e820中char * __init machine_specific_memory_setup(void){ ...... who = "BIOS-e820"; // #define E820_MAP_NR ( 阅读全文

posted @ 2013-08-30 11:46 SuperKing 阅读(1815) 评论(0) 推荐(0)

linux PCI设备初始化过程
摘要:linux PCI设备初始化过程start_kernel->rest_init 这个函数会启动一个核心线程0, 核心线程然后调用init -> do_basic_setup.然后我们开始看下面的过程void __init driver_init(void){ devices_init(); buses_init(); classes_init(); ...... platform_bus_init(); system_bus_init(); ......}//在drivers/base/core.cint __init devices_init... 阅读全文

posted @ 2013-08-30 11:35 SuperKing 阅读(4132) 评论(0) 推荐(0)

Linux网络地址转换分析
摘要:Linux网络地址转换分析地址转换用来改变源/目的端口,是netfilter的一部分,也是通过hook点上注册相应的结构来工作.Nat注册的hook点和conntrack相同,只是优先级不同,数据包进入netfilter之后先经过conntrack,再经过nat.而在数据包离开netfilter之前先经过nat,再经过conntrack.在ip_conntrack结构中有为nat定义的一个nat结构,为什么把这个结构放在ip_conntrack里呢。简单的说,对于非初始化连接的数据包,即后续的数据包,一旦确定它属于某个连接,则可以直接利用连接状态里的nat信息来进行地址转换;而对于初始数据包, 阅读全文

posted @ 2013-08-30 10:40 SuperKing 阅读(1506) 评论(0) 推荐(0)

Linux内核中流量控制
摘要:linux内核中提供了流量控制的相关处理功能,相关代码在net/sched目录下;而应用层上的控制是通过iproute2软件包中的tc来实现,tc和sched的关系就好象iptables和netfilter的关系一样,一个是用户层接口,一个是具体实现.流控包括几个部分: 流控算法, 通常在net/sched/sch_*.c中实现, 缺省的是FIFO, 是比较典型的黑盒模式, 对外只看到入队和出对两个操作;流控结构的操作处理; 和用户空间的控制接口, 是通过rtnetlink实现的。以下内核代码版本为2.6.24.[数据结构]流控处理对外表现是一个黑盒,外部只能看到数据入队和出队,但内部队列是如 阅读全文

posted @ 2013-08-30 10:28 SuperKing 阅读(5529) 评论(0) 推荐(0)

IPSEC实现
摘要:IPSEC介绍与实现一、介绍IPSec 协议不是一个单独的协议,它给出了应用于IP层上网络数据安全的一整套体系结构,包括网络认证协议 Authentication Header(AH)、封装安全载荷协议Encapsulating Security Payload(ESP)、密钥管理协议Internet Key Exchange (IKE)和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换,向上提供了访问控制、数据源认证、数据加密等网络安全服务。1、安全特性IPSec的安全特性主要有:·不可否认性 "不可否认性" 阅读全文

posted @ 2013-08-30 10:05 SuperKing 阅读(6743) 评论(0) 推荐(0)

ip_conntrack 实现
摘要:启动时首先在ip_conntrack_standalone.c中调用static int __init ip_conntrack_standalone_init(void) //proc相关部分省略{ ...... int ret = 0; ret = ip_conntrack_init(); //大部分初始化工作 if (ret (1024 * 1024 * 1024 / PAGE_SIZE)) //内存大于1G ip_conntrack_htable_size = 8192; if (ip_conntrack_htable_si... 阅读全文

posted @ 2013-08-30 09:49 SuperKing 阅读(2012) 评论(0) 推荐(0)

module_init宏解析
摘要:在init.h中我们看到#define module_init(x) __initcall(x);还看到#define __initcall(fn) device_initcall(fn)还有#define __define_initcall(level,fn) \ static initcall_t __initcall_##fn __attribute_used__ \__attribute__((__section__(".initcall" level ".init"))) = fn__define_initcall 作用宏定义__define_ 阅读全文

posted @ 2013-08-28 11:11 SuperKing 阅读(750) 评论(0) 推荐(0)

IP隧道基础研究
摘要:static char banner[] __initdata = KERN_INFO "IPv4 over IPv4 tunneling driver\n";static struct xfrm_tunnel ipip_handler = { .handler = ipip_rcv, //看下面接收处理函数实现 .err_handler = ipip_err, .priority = 1,};static int __init ipip_init(void) // net/ipv4/ipip.c{ i... 阅读全文

posted @ 2013-08-28 11:07 SuperKing 阅读(1006) 评论(0) 推荐(1)

IPV6介绍
摘要:IPV6介绍下面这个介绍肯定是我从哪里看来的,然后做了些修改,具体从哪看来的真记不住了,所以我无法写出引用自哪的,非常抱歉。看ipv6实现前一定要先看此篇内容,ipv6的原理介绍。定义 IPv6是Internet Protocol Version 6的缩写,其中Internet Protocol译为“互联网协议”。 IPv6是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议。 目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中网络层的协议,是... 阅读全文

posted @ 2013-08-28 11:00 SuperKing 阅读(2639) 评论(0) 推荐(0)

IPV6 实现
摘要:看代码实现前,请先保证了解ipv6的概念,可以先看ipv6介绍一文。code extract from 2.6.24.在文件 net/ipv6/af_inet6.c 中包含了ipv6协议初始化的主函数。static int __init inet6_init(void){ struct sk_buff *dummy_skb; struct list_head *r; int err; //inet6_skb_parm必须小于等于skb中的cb BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb... 阅读全文

posted @ 2013-08-28 10:45 SuperKing 阅读(4061) 评论(0) 推荐(0)

ICMP 实现
摘要:以下代码取自 kernel-2.6.24 .[数据结构]struct icmp_control { void (*handler)(struct sk_buff *skb); //icmp处理函数,根据icmp的类型字段 short error; /* This ICMP is classed as an error message */};static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1]; //每个icmp类型有一个项[/数据结构][初始化]文件net/ipv4/af_inet.c... 阅读全文

posted @ 2013-08-28 10:30 SuperKing 阅读(2734) 评论(0) 推荐(0)

Bridge实现
摘要:网桥原理:传统的中继器,如HUB,是一个单纯的物理层设备,它将每一个收到的数据包,在其所有的端口上广播,由接收主机来判断这个数据包是否是给自己的。这样,网络资源被极大的浪费掉了。网桥之所以不同于中继器,主要在于其除了有中继的作用外,还有一个更重要的作用,就是学习MAC地址,然后根据每个数据包的目的MAC与自身端口的对应,从关联端口发送数据,而不完全地在整个网段中进行广播。所以,网桥的实现中,有两个关键点:1、 学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据,它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端 阅读全文

posted @ 2013-08-28 10:14 SuperKing 阅读(3433) 评论(0) 推荐(0)

kernel 校验和实现
摘要:kernel 校验和实现Kernel checksum implementation1) TCP包的错误检测使用16位累加和校验. 除了TCP包本身,TCP校验数据块还包括源IP地址,目的IP地址, TCP包长度, TCP协议号组成的12字节伪头标.2) 校验和为16位字补码和, 数据块长度为奇数时, 数据块末尾添零处理.校验和的计算与顺序无关, 可以从数据块开始计算, 也可以从未尾开始向前计算.3) 为了提高计算效率, TCP包的校验和并不一次算出,而是采用32位部分累加和(sk->csum)进行增量计算.csum_partial()用来计算数据块的32位部分累加和, 累加和可以用cs 阅读全文

posted @ 2013-08-27 14:47 SuperKing 阅读(3428) 评论(0) 推荐(0)

ARP 实现
摘要:ARP 实现现在我们介绍一下arp的实现,内核版本2.6.24.[数据结构]协议栈通过ARP协议获取到的网络上邻居主机的IP地址与MAC地址的对应关 系都会保存在这个表中,以备下次与邻居通讯时使用,同时,ARP模块自身也会提供一套相应的机制来更新和维护这个邻居表.struct neigh_table{ struct neigh_table *next; //下一个邻居表 int family; //协议簇 int entry_size;//入口长度,也就是一个邻居结构的大小,初始化为si... 阅读全文

posted @ 2013-08-27 14:40 SuperKing 阅读(1939) 评论(0) 推荐(0)

Linux协议栈函数调用流程
摘要:普通网络驱动程序中必须要调用的函数是eth_type_trans(略),然后向上递交sk_buff时调用netif_rx()(net/core/dev.c).其函数中主要几行 __skb_queue_tail(&queue->input_pkt_queue, skb);添加skb到接受队列中 netif_rx_schedule(&queue->backlog_dev); 开启接受软中断处理. struct softnet_data * queue 在net_dev_init()(dev.c)中初始化.其中有: open... 阅读全文

posted @ 2013-08-27 14:11 SuperKing 阅读(1578) 评论(0) 推荐(0)

IPVS实现分析
只有注册用户登录后才能阅读该文。

posted @ 2013-08-27 14:09 SuperKing

IP 碎片重组
摘要:IP 碎片重组内核中的IP重组函数.struct sk_buff * ip_defrag(struct sk_buff * skb, u32 user){ ...... //如果内核范围超出限制 if (atomic_read(&ip_frag_mem) > sysctl_ipfrag_high_thresh) ip_evictor(); //回收内存到限制之内 ...... if ((qp = ip_find(iph, user)) != NULL) { //查找或者创建一个队列头 ...... ip_frag_queu... 阅读全文

posted @ 2013-08-27 10:29 SuperKing 阅读(1399) 评论(0) 推荐(0)

导航