Monthly Archives: November 2009

Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff )

sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。它在<include/linux/skbuff.h>中定义,并包含很多成员变量供网络代码中的各子系统使用。 这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在的成员变量以使得成员变量的布局更加清晰。它的成员变量可以大致分为以下几类: Layout 布局 General 通用 Feature-specific功能相关 Management functions管理函数 这个结构被不同的网络层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。L4向L3传递前会添加一个L4的头部,同样,L3向L2传递前,会添加一个L3的头部。添加头部比在不同层之间拷贝数据的效率更高。由于在缓冲区的头部添加数据意味着要修改指向缓冲区的指针,这是个复杂的操作,所以内核提供了一个函数 skb_reserve来完成这个功能。协议栈中的每一层在往下一层传递缓冲区前,第一件事就是调用skb_reserve在缓冲区的头部给协议头预留一定的空间。 skb_reserve同样被设备驱动使用来对齐接收到包的包头。如果缓冲区向上层协议传递,旧的协议层的头部信息就没什么用了。例如,L2的头部只有在网络驱动处理L2的协议时有用,L3是不会关心它的信息的。但是,内核并没有把L2的头部从缓冲区中删除,而是把有效荷载的指针指向L3的头部,这样做,可以节省CPU时间。 1. 网络参数和内核数据结构 就像你在浏览TCP/IP规范或者配置内核时所看到的一样,网络代码提供了很多有用的功能,但是这些功能并不是必须的,比如说,防火墙,多播,还有其他一些功能。大部分的功能都需要在内核数据结构中添加自己的成员变量。因此,sk_buff里面包含了很多像#ifdef这样的预编译指令。例如,在 sk_buff结构的最后,你可以找到: struct sk_buff { … … … #ifdef CONFIG_NET_SCHED __u32 tc_index; #ifdef CONFIG_NET_CLS_ACT __u32 tc_verd; __u32 tc_classid; #endif #endif } 它表明,tc_index只有在编译时定义了CONFIG_NET_SCHED符号才有效。这个符号可以通过选择特定的编译选项来定义(例如:"Device Drivers Networking supportNetworking options … Continue reading

Posted in 未分类 | Leave a comment

解决ubuntu安装ttf-mscorefonts-installer时出现错误

虽然,只是一个字体的安装包,但是,每次装其他软件时就要安装这个,就要等很久,最终还返回错误.在一个台湾的论坛上看到的,一个人自己做的 deb 安装包,放了出来。在终端了执行下面两条命令就行了: wget -c http://dl.getdropbox.com/u/313781/ttf-mscorefonts-installer_3.1_all.debsudo dpkg -i ttf-mscorefonts-installer_3.1_all.deb

Posted in 未分类 | Leave a comment

怎样做有效的 TO DO LIST

http://workawesome.com/productivity/how-to-write-an-effective-to-do-list/ 要: 每天结束前花15分钟写明天的 to do list. 提前计划。预计将来几天要做的事。会有一大堆事情要做吗? 不要: 不要在每天的最后时间才写第二天的 to do list. 否则会导致草草了事。 不要尝试预言未来。避免在明天的 to do list 中加入你认为可能出现的突发事件处理。 优先级: 用红黄绿灯标记 task. 红色:今天无论如何必须完成。 黄色:重要,但留到明天做也不是世界末日。 绿色:不做完全没有不良影响。 如何计算红黄绿 两个因素: 1. 重要性 1~3 2. 紧急程度 1~3 两者相乘,看结果的范围: >= 7: 红 4-6:  黄 1-3:  绿 … Continue reading

Posted in 未分类 | Leave a comment

(转)制定to-do list的艺术

制定to-do list的艺术 原文:The art of the doable to-do list 翻译:cnexpro 每个人都可以随意转载,只要你附带上面的信息。 没有比在你的to-do list(计划任务列表)里钩掉一个已经完成的项目更好的感觉了。完成!以上!Mission accomplished! 然而,你却很容易混过一天/一周,而没有从你的列表里减去任何一个已完成项目。嗯,to-do list可以成为你工作的向导,也可以成为嘲弄你徒然混日的明证。这取决于你怎么制订它。 请把你的to-do list看成一堆老板的命令,而你就是那个老板,你也是你自己的狗腿。就像一个计算机程序,如果指令很明确,或者非常容易执行的,你就能从容应对了。如果不是这样,你将得到不需要的结果——比如恐惧,拖拉和自卑。今天,我将给你一些制订to-do list的技巧,让你轻松完成你列表里的项目。 你是自己的老板 每个工作日,你都有两种模式:思考模式(这时你就是老板的身份);执行模式(这时你就是助手的身份)当一个任务或企划出现时,你脑子里正在想构思怎么开始做事的时候,你就是思考模式/老板模式——你就是那个发送指令的人。你的 to-do list就是这些指令的集合,你的狗腿(执行模式的你)呆会儿将会去执行这些指令。 所以,当你是在老板模式时,你要为你的助手写下“不用思考就能完成”的指令,Michael Buffington称之为“写下那些即便你是机器都可以完成的任务” 怎么运用 那,怎么使你制定的任务可行呢?当你在to-do list里加入一个新的任务前,先停下来,用以下的方法来指导你思考一遍。 分解它——避免让你的计划成为一个灾难的最好办法就是分解它。 #原句是”The best way to make yourself avoid a task like the … Continue reading

Posted in 未分类 | Leave a comment

解决SlickEdit 2009 Build窗口中的乱码问题

SE貌似有自己的shell,可以通过Build窗口访问,是一个很方便的功能,在工程中点击Compile或是Build,编译的输出信息都会显示在Build窗口中,如果编译出现错误,双击Error或是Warning就可以在源文件中定位,是一个十分方便的功能,不过我一直被乱码所困扰,原因大概是shell默认是用的语言是zh_CN-UTF8,和SE的默认编码方式不同,所以我们需要在SE初始化的时候修改环境变量,方法如下: gedit ~/.slickedit/14.0.2/vslick.ini 添加以下内容:[Enviroment]LANG = en_US.UTF-8 Ctrl + S 重启SE 我们还可以在这里添加其它环境变量,SE下Ctrl + Space切换输入法的设置貌似也可以在这设置,不过还没成功过。

Posted in SlickEdit | Leave a comment

(转) Ubuntu 9.10下安装Wireshark 1.2.4

原文地址:http://blog.csdn.net/cumirror/archive/2009/10/18/4694283.aspx 今天在ubuntu 9.10下进行安装wireshark,费了很多时间,过程中出了很多错误,但最终安装成功了,这里写下自己的安装步骤和方法,供大家参考。 安装编译工具:   $sudo apt-get install build-essential   为了成功编译Wireshark,您需要安装GTK+的开发文件和GLib库(libraries)。   $sudo apt-get install libgtk2.0-dev libglib2.0-dev   安装Checkinstall以便管理您系统中直接由源代码编译安装的软件。   $sudo apt-get install checkinstall wireshark源码下载地址:http://www.wireshark.org/download.html(页面中的source code) 下载后的文件名:wireshark-1.2.4.tar.bz2 cd到文件目录解压:$tar -xvf wireshark-1.2.4.tar.bz2 $cd wireshark-1.2.4 编译安装命令如下: $./configure $make$sudo make install 其中make编译时间会比较长,这样下来就基本安装了。 下面是我这篇文章的关键,也是用ubuntu安装的过程中极有可能遇到的问题,且都是在进行./configure编译过程中出现,两个问题如下: ——————————————————————————————————— 问题1: ./configure执行到最后出错   checking for perl… … Continue reading

Posted in Linux | Leave a comment

如何通过程序判断机器是大端还是小端模式

#include <stdio.h> int litend(void) { int i = 0; ((char *) (&i))[0] = 1; return (i == 1); } int bigend(void) { return !litend(); } int main(int argc, char ** argv) { printf("#ifndef ENDIAN_Hn"); printf("#define ENDIAN_Hn"); printf("#define __LITTLE_ENDIAN 1234n"); printf("#define … Continue reading

Posted in 未分类 | Leave a comment