易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux TCP/IP协议栈的通用编码模式

转自:http://blog.chinaunix.net/u/26185/showart_475934.html
和其他内核功能一样,每个网络功能都是内核成员中的一个。因此,它必须合理且公平的使用内存,
CPU和其他共享资源。绝大多数功能并非内核中一段独立的程序,而是根据该功能而或多或少的与内核中其他部分相互影响。因此它们总是试图,尽可能的,使用
类似的体系结构来实现类似的功能。
对许多内核组件来说有些需求是通用的,比如为同一数据结构分配好几个实例,或者跟踪一个数据结构的参考以避免不安全的内存重分配,等等。下面我们来看linux解决这些需求的一些通用的方法。我们也会谈到在查看内核编码时可能遇到的通用的编码技巧。
1.缓存
内核使用kmalloc和kfree来分配和释放内存。这两个函数的使用方法和用户空间的函数 malloc 和free的使用方法类似.
一个内核组件通常需要分配一个数据结构的多个实例。如果分配和释放频繁发生,相关内核组件的初始化函数(比如路由子系统中的fib_hash_init函数)通常会分配一个特殊的内存缓存以加速内存分配。当一个内存块释放时,它会被返回给与分配时相同的内存缓存。
以下是一些需要内核来维护内存缓存的网络数据结构:
Socket buffer descriptors
这个缓存,由net/core/sk_buff.c中的skb_init分配,它用于分配sk_buff结构。sk_buff结构可能是网络子系统中分配和释放频率最高的数据结构。
Neighboring protocol mappings
邻居协议使用内存缓存来分配neighbour结构,这个结构保存L3到L2的地址映射关系。
Routing tables
路由代码使用两个内存缓存来分配两种数据结构,这两种数据结构定义了路由表。
以下是使用内存缓存时会用到的一些函数:
kmem_cache_create
kmem_cache_destroy
建立或销毁缓存 .
kmem_cache_alloc
kmem_cache_free
从内存缓存中分配或释放一个对象。它们通常会在一个包装函数中被调用,这个包装函数在更高的层次上处理分配和释放的请
求。比如:kfree_skb函数处理释放sk_buff的请求,但是只有在所有对此结构的引用释放之后并且相关的子系统(比如,防火墙)已执行了清除操
作之后,才调用kmem_cache_free释放这个sk_buff。
从一个给定的内存缓存中能够分配多少个实例的数量限制通常在kmem_cache_alloc的包装函数中指定,但是有时也可以通过/proc文件系统中的参数来调整。
2. 缓存和哈希表
使用缓存来提升性能的技巧很常见。在网络代码中,有L3到L2映射的缓存(比如IPV4中的ARP缓存),路由表缓存,等


相关文档:

Linux内核升级全过程(2_4_20

序  言
由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。
网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的 ......

linux 管道学习

管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。 
有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。 
Linux管道的实现机制 
在Linux中,管道是一种 ......

linux下查看nginx,apache,mysql,php的编译参数

引用http://www.linuxtone.org/html/76/t-2776.html
有时候nginx,apache,mysql,php编译完了想看看编译参数可以用以下方法
nginx编译参数:
#/usr/local/nginx/sbin/nginx -V
CODE:
nginx version: nginx/0.6.32
built by gcc 4.1.2 20071124 (Red Hat 4.1.2-42)
configure arguments: --user=www --group=www --p ......

Linux发送函数dev_queue_xmit分析

当上层准备好一个包之后,交给下面这个函数处理
int dev_queue_xmit(struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
struct netdev_queue *txq;
struct Qdisc *q;
int rc = -ENOMEM;
/* GSO will handle the following emulations directly. */
if (netif_needs_gso(dev, skb))
goto gso; ......

第一次在Linux下编程

第一次在Linux下编程。呵呵
在网上搜索了一下怎么样在Linux下编程。说是用Gedit写好代码,然后保存.c格式文件。然后到终端编译。
打开Gedit.老规矩,先来个Hello.c
#include <stdio.h>
main()
{
 printf("Hello~!Vimo~~\n\n");
}
保存。然后打开终端。
编译是什么命令?没办法,问下同学。阿灵告诉我: ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号