但行好事 莫问前程

on the programming road
私信 关注
interhanchi
码龄17年
  • 29,125
    被访问量
  • 11
    原创文章
  • 491,783
    作者排名
  • 19
    粉丝数量
  • 于 2004-03-10 加入CSDN
获得成就
  • 获得1次点赞
  • 内容获得1次评论
  • 获得6次收藏
荣誉勋章
TA的专栏
  • java
    8篇
  • c/c++
    30篇
  • 电影
    13篇
  • 读书
    3篇
  • python
    15篇
  • 体育
    5篇
  • 转帖
    5篇
  • 心情
    33篇
  • 音乐
    8篇
  • FP
    4篇
  • 连岳语录
    7篇
  • 其他
    11篇
  • ruby
    40篇
  • javascript
    4篇
  • erlang
    1篇
  • kernel
    42篇
  • 嵌入式
    1篇
  • 服务器设计
    11篇
  • 算法
    1篇
  • asm
    1篇
  • lua
    3篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

我的新blog地址

纠结了好久,终于弄了个独立blog。地址是:[url=http://www.pagefault.info]这里[/url]如果您有订阅我的blog,希望您能更改订阅地址,因为这里以后就不更新了,谢谢!...
原创
70阅读
0评论
0点赞
发布博客于 11 年前

Receive packet steering patch详解

Receive packet steering简称rps,是google贡献给linux kernel的一个patch,主要的功能是解决多核情况下,网络协议栈的软中断的负载均衡。这里的负载均衡也就是指能够将软中断均衡的放在不同的cpu核心上运行。简介在这里:http://lwn.net/Articles/362339/linux现在网卡的驱动支持两种模式,一种是NAPI,一种是...
原创
99阅读
0评论
0点赞
发布博客于 11 年前

内核中拥塞窗口初始值对http性能的影响分析

这个是google的人提出的概念,那就是对tcp的拥塞窗口的初始值进行增大可以显著的提高http的性能,这个主要是针对tcp的slow start(我前面的blog有介绍)的.下面是相关的paper和ppt:paper: http://code.google.com/speed/articles/tcp_initcwnd_paper.pdfppt:http://www.ietf...
原创
154阅读
0评论
0点赞
发布博客于 11 年前

nginx中sub_request的处理

首先来看subrequest的处理。什么是subrequest,顾名思义,那就是子请求,也就是在当前的一个请求中nginx再生成一个请求。比如在nginx的HttpAddition这个filter,就有用到subrequest。这里要注意,一个subrequest是当父reuest执行完毕后才会被执行,并且它会将所有的需要进行的handler phase重新执行一遍(这个我们后面的...
原创
160阅读
0评论
0点赞
发布博客于 11 年前

nginx中handler的处理(二)

这次我们来看各个phase的checker的处理。首先我们要弄明白一个事情,那就是在nginx中,一般来说,都是在NGX_HTTP_CONTENT_PHASE中调用outputfilter的,也就是说filter是在handler中调用的,这样看来只能有一个handler能够执行outputfiler.所以说在写nginx的handler模块的话,要注意不同的phase的返回值代表的不同意...
原创
206阅读
0评论
0点赞
发布博客于 11 年前

nginx中handler的处理(一)

nginx中的处理一个http的请求分为了8个phase,分别是下面几个阶段.其中特别要注意就是几个rewrite阶段。[code="java"]typedef enum {//读取请求phase NGX_HTTP_POST_READ_PHASE = 0,//接下来就是开始处理//这个阶段主要是处理全局的(server block)的rewrite。 ...
原创
325阅读
0评论
0点赞
发布博客于 11 年前

nginx中的output chain的处理(二)

接着上次的分析继续,这次我们来看filter链中最关键的一个模块,那就是ngx_http_copy_filter_module模块,这个filter主要是用来将一些需要复制的buf(文件或者内存)重新复制一份然后发送给剩余的body filter,这里有个很重要的部分,那就是在这里nginx的剩余的body filter有可能会被调用多次,这个接下来我会一一阐述的。先来看它的初始化函数:[...
原创
163阅读
0评论
0点赞
发布博客于 11 年前

nginx中锁的设计以及惊群的处理

nginx中使用的锁是自己来实现的,这里锁的实现分为两种情况,一种是支持原子操作的情况,也就是由NGX_HAVE_ATOMIC_OPS这个宏来进行控制的,一种是不支持原子操作,这是是使用文件锁来实现。首先我们要知道在用户空间进程间锁实现的原理,起始原理很简单,就是能弄一个让所有进程共享的东西,比如mmap的内存,比如文件,然后通过这个东西来控制进程的互斥。说起来锁很简单,就是共享一...
原创
169阅读
0评论
0点赞
发布博客于 11 年前

nginx中的output chain的处理(一)

这里我们详细来看ngx_linux_sendfile_chain方法,这个函数也就是nginx的发送函数。一般来说,我们最终都会调用这个函数来发送最终的数据,因此我们来着重分析这个函数,这里主要就是对buf的一些参数的理解。来看函数原型:[code="java"]ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t...
原创
229阅读
0评论
0点赞
发布博客于 11 年前

nginx的filter的处理

随笔拿一个nginx的filter模块来看,gzip模块,来看它的初始化。[code="java"]static ngx_http_output_header_filter_pt ngx_http_next_header_filter;static ngx_http_output_body_filter_pt ngx_http_next_body_filter;st...
原创
125阅读
0评论
0点赞
发布博客于 11 年前

nginx中request请求的解析

ngx_http_init_request 中初始化event 的handler 为ngx_http_process_request_line,然后首先调用ngx_http_read_request_header来读取头部,然后就是开始调用函数ngx_http_parse_request_line对request line进行解析。随后如果解析的url是complex的话,就进入complex...
原创
280阅读
0评论
0点赞
发布博客于 11 年前

卖书了

1 代码之美 全新 603 c++网络编程卷2 全新 308 tcp/ip 详解 第二卷中文版 全新 60这里基本全新 就是 有在里面画一些线。。价钱都好商量,只限杭州市内。 有意向给我发站内消息或者给我留个联系方式,我联系你。...
原创
61阅读
0评论
0点赞
发布博客于 11 年前

linux 内核tcp拥塞处理(一)

这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的,也就是说只要有一个段被判断丢失,它就会认为发生了拥塞.而现在还有另一种,也就是路由器来通知我们发生了拥塞,这里ip头还会有一个ECN的位(准确的说是两位),来表示已经发送拥塞,不过这里要注意首先收到ECN的是接受方,可是真正需要被通知的却是发送方,因此当接受方收到ECN之后,用下一个ack来通知发送方有拥塞发生了,然后发送方才会做出响应...
原创
87阅读
0评论
0点赞
发布博客于 11 年前

内核tcp协议栈SACK的处理

上一篇处理ack的blog中我们知道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理。这篇blog就主要来介绍内核如何处理sack段。SACK是包含在tcp的option中的,由于tcp的头的长度的限制,因此SACK也就是最多包含4个段,也就是32个字节。我们先来看tcp中的SACK段的表示:[code="java"]struct tcp...
原创
81阅读
0评论
0点赞
发布博客于 11 年前

09年看的书,电影以及听过的音乐

其实有一些是很早就看过或听过的,只不过今年加进去了,还有一些书就是没看完,比如haskell那本。。[img]http://dl.iteye.com/upload/attachment/194684/a030715f-6df4-3953-ae11-722f7d11dac8.jpg[/img][img]http://dl.iteye.com/upload/attachment...
原创
56阅读
0评论
0点赞
发布博客于 11 年前

内核tcp的ack的处理

我们来看tcp输入对于ack,段的处理。先是ack的处理,在内核中,处理ack段是通过tcp_ack来进行的。这个函数主要功能是:1 update重传队列,并基于sack来设置skb的相关buf。2 update发送窗口。3 基于sack的信息或者重复ack来决定是否进入拥塞模式。在看之前我们要知道tcp是累积确认的。为了解决带来的缺点,我们才需...
原创
93阅读
0评论
0点赞
发布博客于 11 年前

内核处理time_wait状态详解

这次来详细看内核的time_wait状态的实现,在前面介绍定时器的时候,time_wait就简单的介绍了下。这里我们会先介绍tw状态的实现,然后来介绍内核协议栈如何处理tw状态。首先我们要知道在linux内核中time_wait的处理是由tcp_time_wait这个函数来做得,比如我们在closing状态收到一个fin,就会调用tcp_time_wait.而内核为time_wait状态的...
原创
95阅读
0评论
0点赞
发布博客于 11 年前

linux已经不存在惊群现象

惊群也就是指多个进程阻塞在accept,当有连接完成,会唤醒所有进程。经过测试,发现现在的内核已经修复了这个问题,当有多个进程阻塞在accept,只会唤醒一个进程。下面这个是一篇论文,就是讲这个问题的。http://www.usenix.org/event/usenix2000/freenix/full_papers/molloy/molloy.pdf这里会先测...
原创
129阅读
0评论
0点赞
发布博客于 11 年前

tcp协议栈处理各种事件的分析

首先我们来看socket如何将一些状态的变化通知给对应的进程,比如可读,可写,出错等等。先来看sock结构中这几个相关域:[code="java"]struct sock {..........................wait_queue_head_t *sk_sleep;.....................................void ...
原创
139阅读
0评论
0点赞
发布博客于 12 年前

linux内核sk_buff的结构分析

我看的内核版本是2.6.32.在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是...
原创
98阅读
0评论
0点赞
发布博客于 12 年前

lua源码剖析(三)

这次简单的补充一下前面类型部分剩下的东西。首先我们要知道当我们想为lua来编写扩展的时候,有时候可能需要一些全局变量。可是这样会有问题,这是因为这样的话,我们就无法用于多个lua状态(也就是new 多个state).于是lua提供了三种可以代替全局变量的方法。分别是注册表,环境变量和upvalue。其中注册表和环境变量都是table。而upvalue也就是我们前面介绍的用来...
原创
90阅读
0评论
0点赞
发布博客于 12 年前

tcp的输入段的处理

tcp是全双工的协议,因此每一端都会有流控。一个tcp段有可能是一个数据段,也有可能只是一个ack,异或者即包含数据,也包含ack。如果是数据段,那么有可能是in-sequence的段,也有可能是out-of-order的段。如果是in-sequence的段,则马上加入到socket的receive队列中,如果是out-of-order的段,则会加入到socket的ofo队列。一旦当我们接收到数据...
原创
41阅读
0评论
0点赞
发布博客于 12 年前

nginx的内存管理

先来看内存池的实现,nginx的内存池实现的非常简单。这里内存池的一些图表可以看老朱同学的slides :http://blog.zhuzhaoyuan.com/2009/09/nginx-internals-slides-video/当内存池初始化的时候(下面会分析到)ngx_poll_s只相当于内存池的一个头,保存了当前内存池的一些必要信息而已。当从内存池存取数...
原创
294阅读
0评论
0点赞
发布博客于 12 年前

lua源码剖析(二)

这次紧接着上次的,将gc类型的数据分析完毕。谢谢[url=http://www.zhuzhaoyuan.com]老朱[/url]同学的指正,这里CClosure和LClosure理解有误.先来看闭包:可以看到闭包也是会有两种类型,这是因为在lua中,函数不过是一种特殊的闭包而已。[color=red]更新:这里CClosure表示是c函数,也就是和lua外部...
原创
77阅读
0评论
0点赞
发布博客于 12 年前

内核协议栈tcp层的内存管理

我们先来看tcp内存管理相关的几个内核参数,这些都能通过proc文件系统来修改:[code="java"]///内核写buf的最大值.extern __u32 sysctl_wmem_max;///协议栈读buf的最大值extern __u32 sysctl_rmem_max;[/code]这两个值在/proc/sys/net/core 下。这里要注意,这两个值的单位是...
原创
114阅读
0评论
0点赞
发布博客于 12 年前

lua源码剖析(一)

先来看lua中值的表示方式。[code="java"]#define TValuefields Value value; int tttypedef struct lua_TValue { TValuefields;} TValue;[/code]其中tt表示类型,value也就是lua中对象的表示。[code="java"]typedef union {...
原创
95阅读
0评论
0点赞
发布博客于 12 年前

gcc的几个自动优化

我的gcc版本是4.4.1先来看const和define以及enum定义,编译器会做什么样的优化:[code="java"]enum { constant=23 };#define CONSTANT 23static const int Static_Constant=23;const int Constant = 23;int foo() { a(...
原创
106阅读
0评论
0点赞
发布博客于 12 年前

intel IA-32架构简介

[size=medium][color=darkred]IA32的cpu操作模式[/color][/size]1保护模式:这个模式是cpu的native状态.它可以在一个保护的多任务的环境中直接执行 "real-address mode"的8086的软件.这个特性叫做virtual-8086模式.这个模式也就是cpu的一般工作模式.因为这个模式基本上打开了cpu的所有特性....
原创
136阅读
0评论
0点赞
发布博客于 12 年前

linux内核定时器的实现

由于linux还不是一个实时的操作系统,因此如果需要更高精度,或者更精确的定时的话,可能就需要打一些实时的补丁,或者用商用版的实时linux,.这里内的定时器最小间隔也就是1个tick.这里还有一个要注意的,我这里的分析并没有分析内核新的hrt 定时器.这个定时器是Monta Vista加入到内核的一个高精度的定时器的实现.先来看几个相关的数据结构.///这个是一个最主...
原创
77阅读
0评论
0点赞
发布博客于 12 年前

常用的内存管理算法的简要介绍

主要是介绍一下常用的内存管理算法以及相关的数据结构.三种类型:[size=medium]1 sequential fit[/size]包括first fit,next fit,以及best fit这种算法的实现基本来说都是基于一个双向链表或者循环链表来保存所有的free memory.而且一般都会使用kunth的boundary tag算法来合并临近的内存(这个算法可以...
原创
134阅读
0评论
0点赞
发布博客于 12 年前

linux内核中tcp连接的断开处理

我们这次主要来分析相关的两个断开函数close和shotdown以及相关的套接口选项SO_LINGER。这里要注意SO_LINGER对shutdown无任何影响。它只对close起作用。先来坎SO_LINGER所对应的数据结构:[code="java"]struct linger {///linger的开关 int l_onoff; /* Linger active *...
原创
310阅读
0评论
1点赞
发布博客于 12 年前

gdb学习笔记(一)

这里只是一个摘要。具体的细节还需要去看manual。1 info 用来描述你的程序的状态,比如info b就是显示出当前的程序的所有断点.2 set 用来设置一些环境变量的值,比如set prompt $.3 show用来描述gdb自己的状态.编译要用-g选项.然后用gdb +程序名,或者直接gdb后,用file + 文件名加载程序....
原创
125阅读
0评论
0点赞
发布博客于 12 年前

linux内核tcp的定时器管理(二)

这次我们来看后面的3个定时器;首先是keep alive定时器。这个定时器主要是由于一条连接可能长时间idle,此时就需要发送探测包,来探测对端是否存活,如果对端收到这个探测包,它会立即相应一个ack,而当接受到ack之后,我们就能确认对端是存活的。否则我们会认为这个连接除了问题。这个定时器是当一个新的连接变为establish状态的时候被激活,如果在当定时器超时还没有数据...
原创
51阅读
0评论
0点赞
发布博客于 12 年前

linux内核tcp的定时器管理(一)

在内核中tcp协议栈有6种类型的定时器:1 重传定时器。2 delayed ack定时器3 零窗口探测定时器上面三种定时器都是作为tcp状态机的一部分来实现的。4 keep-alive 定时器主要是管理established状态的连接。5 time_wait定时器主要是用来客户端关闭时的time_wait状态用到。6 syn-...
原创
91阅读
0评论
0点赞
发布博客于 12 年前

linux 内核tcp接收数据的实现

相比于发送数据,接收数据更复杂一些。接收数据这里和3层的接口是tcp_v4_rcv(我前面的blog有介绍3层和4层的接口的实现).而4层和用户空间,也就是系统调用是socket_recvmsg(其他的读取函数也都会调用这个函数).而这个系统调用会调用__sock_recvmsg.下面我们就先来看下这个函数。它的主要功能是初始化sock_iocb,以便与将来数据从内核空间拷贝到用户空间。然...
原创
71阅读
0评论
0点赞
发布博客于 12 年前

nginx的进程模型

nginx采用的也是大部分http服务器的做法,就是master,worker模型,一个master进程管理站个或者多个worker进程,基本的事件处理都是放在woker中,master负责一些全局初始化,以及对worker的管理。在nginx中master和worker的通信是通过socketpair来实现的,每次fork完一个子进程之后,将这个子进程的socketpaire句柄传递给前...
原创
48阅读
0评论
0点赞
发布博客于 12 年前

linux 内核tcp数据发送的实现

在分析之前先来看下SO_RCVTIMEO和SO_SNDTIMEO套接口吧,前面分析代码时没太注意这两个.这里算是个补充.SO_RCVTIMEO和SO_SNDTIMEO套接口选项可以给套接口的读和写,来设置超时时间,在unix网络编程中,说是他们只能用于读和写,而像accept和connect都不能用他们来设置.可是我在阅读内核源码的过程中看到,在linux中,accept和connect可...
原创
150阅读
0评论
0点赞
发布博客于 12 年前

ydb的内存模型

[url=http://arbow.iteye.com]阿宝[/url]同学推荐了这个东西,因此周末就大概看了下源码,这里就简要的分析下它的实现,下面是他的特性。项目地址在这里:http://code.google.com/p/ydb/[quote]# YDB is a key-value storage library.# Simple API, only 6 met...
原创
37阅读
0评论
0点赞
发布博客于 12 年前

tcp connection setup的实现(三)

先来看下accept的实现.其实accept的作用很简单,就是从accept队列中取出三次握手完成的socket,并将它关联到vfs上(其实操作和调用sys_socket时新建一个socket类似).然后返回.这里还有个要注意的,如果这个传递给accept的socket是非阻塞的话,就算accept队列为空,也会直接返回,而是阻塞的话就会休眠掉,等待accept队列有数据后唤醒他....
原创
59阅读
0评论
0点赞
发布博客于 12 年前

tcp connection setup的实现(二)

首先来看下内核如何处理3次握手的半连接队列和accept队列(其实也就是server端的三次握手的状态变换).而半连接队列和accept队列在内核如何表示,我们上次已经介绍过了,这里就不介绍了.首先我们知道当3层的数据包到达之后会调用4层的协议handle,tcp的话就是tcp_v4_rcv.如何调用可以看我前面的[url=http://simohayha.iteye.com/blog...
原创
95阅读
0评论
0点赞
发布博客于 12 年前

tcp connection setup的实现(一)

bind的实现:先来介绍几个地址结构.struct sockaddr 其实相当于一个基类的地址结构,其他的结构都能够直接转到sockaddr.举个例子比如当sa_family为PF_INET时,sa_data就包含了端口号和ip地址(in_addr结构).[code="java"]struct sockaddr { sa_family_t sa_family; ...
原创
76阅读
0评论
0点赞
发布博客于 12 年前

linux内核中socket的实现

首先来看整个与socket相关的操作提供了一个统一的接口sys_socketcall.下面就是它的代码片段:[code="java"]asmlinkage long sys_socketcall(int call, unsigned long __user *args){ unsigned long a[6]; unsigned long a0, a1; int e...
原创
104阅读
0评论
0点赞
发布博客于 12 年前

ip层和4层的接口实现分析

首先来看一下基于3层的ipv4以及ipv6实现的一些4层的协议:[img]/upload/attachment/133435/473e1b8c-da7e-3177-9fb2-ab467a8e0739.jpg[/img]这里要注意并没有IGMPV6,这是因为在ipv6中,它是作为iCMPv6的一部分实现的.首先我们要知道输入数据包的ip头中的protocol域标识...
原创
63阅读
0评论
0点赞
发布博客于 12 年前

glibc中strlen的实现

glibc中的strlen的实现主要的思想就是每次检测4个字节(long int)。这样的话就降低了循环的次数,从而从整体上提高了效率。这里它使用了两个技巧,一个是由于传进来的字符串的地址有可能不是4字节(long int)对其的,因此首先需要遍历字符串从而找到4字节对其的那个地址。然后再进行比较.第二个技巧就是如何高效的判断4个字节中是否有字节为0.下来来看源码,这个源码...
原创
84阅读
0评论
0点赞
发布博客于 12 年前

linux下ip协议(V4)的实现(五)

这次主要介绍一些ip层管理以及统计相关的东西.首先来看 long-living ip peer information.我们知道ip协议是无状态的协议.这里内核为了提升性能.为每个目的ip地址(换句话说,也就是和本机进行通信过的主机)保存了一些信息.peer子系统一般是被tcp,或者routing子系统所使用.这个信息的数据结构是inet_peer,它是一棵avl树...
原创
53阅读
0评论
0点赞
发布博客于 12 年前

linux下ip协议(V4)的实现(四)

这次主要介绍的是ip层的切片与组包的实现。首先来看一下分片好的帧的一些概念:1 第一个帧的offset位非0并且MF位为12 所有的在第一个帧和最后一个帧之间的帧都拥有长度大于0的域3 最后一个帧MF位为0 并且offset位非0。(这样就能判断是否是最后一个帧了).这里要注意在linux中,ip头的frag_off域包含了 rfcip头的定义中的nf,df...
原创
51阅读
0评论
0点赞
发布博客于 12 年前

linux下ip协议(V4)的实现(三)

这次我们来看数据包如何从4层传递到3层。先看下面的图,这张图表示了4层和3层之间(也就是4层传输给3层)的传输所需要调用的主要的函数:[img]/upload/attachment/124314/373c862c-6e5c-3ace-b190-9041ef8b03ca.jpg[/img]我们注意到3层最终会把帧用dst_output函数进行输出,而这个函数,我们上一次已...
原创
43阅读
0评论
0点赞
发布博客于 12 年前

linux下ip协议(V4)的实现(二)

这次主要介绍下forward和local delivery。上次我们提到当ip_rcv_finish完成后后调用相关的发送函数ip_forward或者ip_local_deliver.这次就主要介绍这两个函数。先来看forward。forward一般由下面几部组成:1 执行ip option2 确定这个包能被forward3 减小ttl,当ttl为0时,丢掉...
原创
52阅读
0评论
0点赞
发布博客于 12 年前

linux下ip协议(V4)的实现(一)

首先来看校验相关的一些结构:1 net_device结构:包含一个features的域,这个表示设备的一些特性(比如控制校验),下面的几个flag就是用来控制校验:[code="java"]#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */#define NETIF_F_NO_CSUM 4 ...
原创
57阅读
0评论
0点赞
发布博客于 12 年前

linux下ip层的一些概念

首先来看这个ip层的结构:[img]/upload/attachment/117377/434dc733-af31-3c35-8163-2d0325b4f7a3.jpg[/img]这里看到非常多的netfilter hook,这是因为netfilter主要是针对ip层的。ip层的主要任务有下面5个方面:1 ip数据包的校验2 防火墙的处理(也就是netf...
原创
55阅读
0评论
0点赞
发布博客于 12 年前

网桥在内核的实现

我们知道netdevice有一个priv域,这个域用来保存设备的私有数据,当这个设备是一个网桥的时候,priv域也就指向一个struct net_bridge.接下来看net_bridge以及相关的数据结构:[code="java"]struct net_bridge{///自旋锁 spinlock_t lock;///网桥所有端口的链表,其中每个元素都是一个net...
原创
71阅读
0评论
0点赞
发布博客于 12 年前

Spanning Tree Protocol介绍

Spanning Tree Protocol(STP)主要是用在网桥上,用来避免网络回路,并制造冗余连接(也就是保证网络的可靠性).这里只是一个大概的介绍,具体的还是要去看IEEE 的 802.1D STP的文档。先看下面的图:[img]/upload/attachment/111941/731a1ffc-da28-34ef-b0e2-3124116783bc.jpg[...
原创
247阅读
1评论
0点赞
发布博客于 12 年前

linux下的网桥介绍

网桥用来连接不同的网段。使不同的网段能够相互通信,看起来很像三层的路由。它能够有多个port,从而能够将数据帧从一个port复制到另一个port。这里要注意一点,linux下的网桥只能用于以太网。来看下示意图:[img]/upload/attachment/109009/59e160dd-4741-3749-86d1-c129997c34ab.jpg[/img]其中...
原创
163阅读
0评论
0点赞
发布博客于 12 年前

链路层到网络层的数据传递

我们知道在tcp/ip模型中,基本每一层都可以处理多重协议类型,那么当一个输入帧到达后,内核的每一层是如何来取得相应的处理函数呢?也就是说当我要把包传递给上层的时候,如何取得相应协议的处理函数。我们这里先来看从二层如何把把数据传递给三层。[code="java"]struct sk_buff {.................................... __b...
原创
80阅读
0评论
0点赞
发布博客于 12 年前

内核网络输出帧的处理

首先来看如何打开和关闭一个输出队列。帧的输出状态是通过device->state设为__LINK_STATE_XOFF来表示的。而打开和关闭队列也就是通过这个状态位来处理。[code="java"]static inline void netif_start_queue(struct net_device *dev){ netif_tx_start_queue(netdev...
原创
37阅读
0评论
0点赞
发布博客于 12 年前

libevent源码浅析(四)

最近刚刚一个项目自己用libevent,因此这几天又把libevent的代码拿出来翻了下,当初看的时候有些似是而非的东西,这次是基本没有了。这篇也算是前面几篇libevent的blog的补充了。[code="java"]struct event_base { const struct eventop *evsel; void *evbase; int event_count...
原创
49阅读
0评论
0点赞
发布博客于 12 年前

内核中接收网络帧的处理

我这里描述的只是2层的处理。首先,我们来看softnet_data这个结构,每个cpu都有这样的一个队列,它主要是用来存储incoming frame。由于他是每个cpu都有一个队列,因此在不同的cpu之间我们就不要任何锁来控制并发的处理这个帧队列。我们在操作系统层要取得帧数据,都是通过这个数据来读取。[code="java"]/* * Incoming packets...
原创
94阅读
0评论
0点赞
发布博客于 12 年前

内核中的中断处理

首先来看当网络接收帧到达时,设备如何唤醒驱动。1 轮询也就是内核不断的监测相应的寄存器,从而得到是否有网络帧到来。2中断当有数据时,设备执行一个硬件中断,然后内核调用相应的处理函数。这种处理当网络在高负载的情况时,效率会很低(中断太频繁)。并且会引起receive-livelock.这是因为内核处理输入帧分为了两部分,一部分是驱动复制帧到输入队列,一部分是内核执...
原创
76阅读
0评论
0点赞
发布博客于 12 年前

内核网络设备的注册与初始化

首先来看如何分配内存给一个网络设备。内核通过alloc_netdev来分配内存给一个指定的网络设备:[code="java"]#define alloc_netdev(sizeof_priv, name, setup) \ alloc_netdev_mq(sizeof_priv, name, setup, 1)struct net_device *alloc_netde...
原创
80阅读
0评论
0点赞
发布博客于 12 年前

linux内核组件初始化体系

先来看下内核初始化时调用的一些函数:[img]/upload/attachment/95457/fe56754f-15d8-39f6-aee8-10e8777c035a.jpg[/img]这里主要的初始化有三类:1 boot比如grub,u-boot传递给内核的参数,内核的处理。这里是调用parse_args.2 中断和时钟的初始化。3 初始化的函数,这里主...
原创
44阅读
0评论
0点赞
发布博客于 12 年前

pci设备的初始化

我们先来看下pci_driver结构,它的id_table是一个指向当前驱动所能处理的pci设备的id列表,由于每个pci设备都有一个唯一的标记,因此我们通过pci_device_id结构就可以标记不同的pci设备。driver则指向下一个pci驱动。[code="java"]struct pci_driver { struct list_head node; char *...
原创
50阅读
0评论
0点赞
发布博客于 12 年前

内核启动用户态的程序

内核启动用户态的应用程序是通过call_usermodehelper来调用的,比较常见的调用,比如modprobe. [code="java"]static inline intcall_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait)[/code]参数说明;path : 应...
原创
76阅读
0评论
0点赞
发布博客于 12 年前

网络设备的中断处理

我们这里描述的是硬件中断。设备和内核之间的交互有两种方法。1 polling(轮询)也就是kernel来操作交互,由kernel来检测某一个状态,看是否需要让设备做什么。2 interrupt(中断)设备来发起交互,设备发出一个硬件中断请求给kernel当他需要kernel的注意时。当中断来的时候被调用的函数称为interrupt handler...
原创
85阅读
0评论
0点赞
发布博客于 12 年前

内核中的notification chain浅析

内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些事件,其他多个子系统都很感兴趣,此时就需要用到notification chain.举个具体的例子,比如说一台主机由于某个网卡的损坏或其他原因不能使用,从而导致连接此网卡的网络不能使用,这个时侯就是notification chain.来通知路由表去除这个网络的路由表项。notification chain就是一个链表,...
原创
29阅读
0评论
0点赞
发布博客于 12 年前

libevent源码浅析(三)

这次我们来看libevent的信号的处理。在libevent中通过使用socketpair建立一对流管道,也就是全双工管道,来将信号事件与句柄事件统一起来。先来看数据结构:[code="java"]struct evsignal_info { struct event ev_signal; ///sig.evsignal_caught = 0; memset(&...
原创
85阅读
0评论
0点赞
发布博客于 12 年前

libevent源码浅析(二)

我们来看下libevent的定时器的实现在libevent中定时器的实现是通过基于最小堆的优先级队列来实现的。对于这两个数据结构比较陌生的可以去翻算法导论的6.5节。主要的源码都在min_heap.c中。我们先来看主要的数据结构:[code="java"]typedef struct min_heap{ struct event** p; ...
原创
62阅读
0评论
0点赞
发布博客于 12 年前

libevent源码浅析(一)

这里分析的是libevent-1.4.9。PS:前面还看了libev的源代码,妈的,那代码写的太猥亵了,相比较libevent代码写的好多了。。首先来看一下最主要的几个数据结构:eventop结构体是所有事件驱动模型的基类。所有的io复用类型都会实现此结构体里各种方法。[code="java"]struct eventop { const char *name;...
原创
281阅读
0评论
0点赞
发布博客于 12 年前

minix引导程序剖析之masterboot

大体的引导过程可以看我前面写的博客:http://simohayha.iteye.com/blog/269093masterboot的主要功能是从硬盘的一个已激活分区装载引导分区的第1个扇区的引导信息,并将控制权交给此引导程序。引导过程中,未分区磁盘和已分区磁盘的布局是不同的,已分区磁盘的话,第一个扇区是主引导记录和分区表,而masterboot就存放在这里,将由它来查...
原创
140阅读
0评论
0点赞
发布博客于 12 年前

linux下的time处理

在内核中有3个不同的时间:Wall time(real time), Process time和Monotonic time.Wall time,也就是rtc时钟。Process time,进程执行的时间。Monotonic time,也就是系统从boot后到当前的时间。表示时间的数据结构: [code="java"]typedef __timer_...
原创
50阅读
0评论
0点赞
发布博客于 12 年前

libev简单使用介绍

更详细的用法请看他的文档:http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod[code="java"]struct ev_loop *ev_default_loop (unsigned int flags)struct ev_loop *ev_loop_new (unsigned int flags)[/code]...
原创
224阅读
0评论
0点赞
发布博客于 13 年前

linux下的elf结构

[img]/upload/attachment/58875/d209d0c8-9704-325f-9933-bf7843dd86a8.jpg[/img]可以看到链接器和加载器看待elf是完全不同的,链接器看到的是由区段头部表描述的一系列逻辑区段的集合(也就是说它忽略了程序头部表)。而加载器则是看成是由程序头部表描述的一系列的段的集合(忽略了区段头部表)。elf它可以表示不同...
原创
61阅读
0评论
0点赞
发布博客于 13 年前

php的c扩展

在php中最核心的一个数据结构就是这个:[code="java"]typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht;...
原创
292阅读
0评论
0点赞
发布博客于 13 年前

linux下的管理内存相关的函数

[img]/upload/attachment/53603/aa2d5991-7414-3117-867b-c6bd2e86d30e.bmp[/img]malloc的实现,在linux下的实现是这样的,当所需要分配的内存大于128k,会用mmap(匿名映射)来实现。小于128k使用在堆分配(改天会分析下malloc函数的源码实现)。这里还有几个mallopt...
原创
59阅读
0评论
0点赞
发布博客于 13 年前

移植php5到arm linux遇到的问题

主要的问题是,我这里需要给php写动态扩展库,而当我移植完之后,phpinfo显示:[quote]standardDynamic Library support not available[/quote]这样的话,我写的动态链接库就无法加载。。这里的原因是当configure的时候他好像没有找到dlopen,因此这里我们需要configure完后强制他使用dlope...
原创
67阅读
0评论
0点赞
发布博客于 13 年前

linux下的数据对齐

数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当一个数被装载进内存,它的内存地址是它的数据大小的倍数,这个就是自然对齐。比如一个32位的数据,他被装载进内存的地址就是4的倍数,也就是地址最后两位是0.对齐方式是依赖于硬件的,有些架构对于数据的对齐要求很严格。如果这些系统装载进了没有对齐的数据将会引起一个processor trap.而有些系统则很安全,不过会使性能降低。...
原创
502阅读
0评论
0点赞
发布博客于 13 年前

boot sequence overview

原文在这里:http://www.os-forum.com/minix/boot/bootsequence.php当pc启动的时候,pc将会搜索磁盘(其实也就是你bois设置的启动顺序)上的一个magic number(0xAA55),这个number是在磁盘第一个扇区的起始510字节位移处。当magic number被发现,磁盘的第一个扇区将会被装载进地址为LOAD0FF(0...
原创
136阅读
0评论
0点赞
发布博客于 13 年前

linux下检测ip冲突

原理其实很简单,那就是广播一个arp包,然后recv,如果没有数据(这里要设置延时),那么说明这个ip是可用的,否则就检测这个数据是否为回复我们发出的arp的应答包.如果是则证明ip已被使用,否则继续等待.这里可以看下busybox的dhcp中的检测程序。networking/udhcp/arpping.c[code="c"]/* vi: set sw=4 ts=4: */...
原创
104阅读
0评论
0点赞
发布博客于 13 年前

今天碰到的一个问题

将位图用 bmptopnm 转成pcl6的打印语言,然后直接cat 到打印机,用管道做的,没想到文件过大的时候,管道会有延迟,这时打印机就直接傻逼,然后就将数据分别打印出来了。最后解决只能先生成pcl文件,然后再直接cat出去。。...
原创
38阅读
0评论
0点赞
发布博客于 13 年前

ftruncate和msync

[code="c"]int ftruncate(int fd, off_t length)int msync(void *addr, size_t len, int flags)[/code]首先,man手册里面ftruncate说是当length大于文件本身的大小的话,会扩大文件的话并补'\0'的,可是我在arm-linu-gcc 3.4下却不是。还有就是msync...
原创
104阅读
0评论
0点赞
发布博客于 13 年前

GUN C正则表达式

最近项目中要处理文本,因此就用了gun的正则表达式,它是posix风格的..我们一般使用的都是perl风格的,所以一开始使用可能会有一些不习惯.详细的区别可以在wiki上看到:http://en.wikipedia.org/wiki/Regular_expression头文件是regex.h可以在里面看到他所提供的接口.这里主要是3个函数和一个结构体:[quote]int ...
原创
87阅读
0评论
0点赞
发布博客于 13 年前

看代码看的头晕

最近工作需要在看ghostscript的代码,看得我头晕眼花,goto真不是个好东西...
原创
291阅读
0评论
0点赞
发布博客于 13 年前

[转帖]MISRA--作为工业标准的C编程规范

本文档转贴自孟岩的blog:http://blog.csdn.net/myan/archive/2002/12/26/1919.aspx MISRA--作为工业标准的C编程规范    MISRA (The Motor Industry Software Reliability Association汽车工业软件可靠性联会)是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产...
原创
67阅读
0评论
0点赞
发布博客于 13 年前

尘埃落定

4月1日离职到现在4个多月时间,看了nba总决赛和欧洲杯,游了上海,杭州.去了酒吧...最终决定去做嵌入式了,去做自己一直想做的底层开发了,明天要开始上班了,崭新的一页又被翻起了.....
原创
32阅读
0评论
0点赞
发布博客于 13 年前

wild world--skins的片尾曲

  英剧skins的第一季的最后一集的片尾曲,非常棒地说。 这部片也非常好看的说,强烈推荐。 
原创
121阅读
0评论
0点赞
发布博客于 13 年前

一个创建闭包的小技巧

一个小技巧,在Ola Bini 的blog上看到的。假设你想要这样一个类:创建这个类的时候send一个block给它,然后在后面可以通过某个方法名来调用这个block。[code="ruby"]class DoSomething def initialize (class ...
原创
60阅读
0评论
0点赞
发布博客于 13 年前

解决Colored Cubes问题

Engineering PuzzleYou have four colored cubes. Each side of each cube is a single color,and there are four colors: blue (B), red (R), green (G) and yellow (Y)Describing the six faces as fron...
原创
42阅读
0评论
0点赞
发布博客于 13 年前

代码大全读书笔记1

这么好的书,觉得写点东西,记录一下比较好。4.1选择编程语言。程序员使用熟悉的编程语言生产率高于使用不熟悉的编程语言,并且高级语言比低级语言的效率要高得多,作者列出了几种高级语言的每一行代码与等效的c语言代码行数之比。比如java是2.5,而perl和python就是6.而且编程语言影响程序员的思维随处可见,作者举了个他遇到的项目,那就是一群fortran程序员去写c++,最后写出...
原创
37阅读
0评论
0点赞
发布博客于 13 年前

Nonblocking I/O

在Nonblocking I/O中最重要的也就是三个类[quote]java.nio.channels.SelectableChanneljava.nio.channels.Selectorjava.nio.channels.SelectionKey[/quote]1 SelectableChannel默认情况下channels是阻塞的.我们可以设置一个channe...
原创
31阅读
0评论
0点赞
发布博客于 13 年前

一个介绍Grizzly的ppt

Grizzly看起来很诱人的说..http://www.scribd.com/doc/267405/-Java-NIO-with-Grizzly
原创
32阅读
0评论
0点赞
发布博客于 13 年前

大脑缺氧

离职手续办的真慢,没办法的说,不过下周开始就不需要上班了,最近发觉脑袋一直很沉,看书也看不进去,昨晚丁家猫同学告诉我,我才知道是大脑缺氧,我那边的工作环境就不说了,太封闭了,窗户都打不开,简直就和棺材一样,自己晚上睡得也比较晚。而且也有3,4年都没锻炼过了,准备周末去打打球,不然工作什么的效率太低了。。...
原创
63阅读
0评论
0点赞
发布博客于 13 年前

一些胡思乱想

比如很简单的一个斐波那契数列,如果纯粹从数学上来说,那就是[quote]f(n)=f(n-1)+f(n-2)当n>1时,而n=0时f(n)=0,当n=1时,f(n)=1[/quote]很容易我们就可以直接翻译为程序:[code="java"](define (f n) (cond ((= n 0) 0) ((= n 1) 1) ...
原创
33阅读
0评论
0点赞
发布博客于 13 年前

一些流行的书的缩写

PS:最近都没怎么写blog,主要是忙着离职手续,和手头上的活的交接。这个是在reddit看到的,就是一些很好的书的缩写:[quote]AIMA = Artificial Intelligence a Modern Approach by Stuart Russell and Peter NorvigAMOP = The Art of the Meta Object P...
原创
175阅读
0评论
0点赞
发布博客于 13 年前

[转帖]算法之美

原文在这里;http://www.douban.com/review/1325850/里面说的是这本书http://www.amazon.com/o/ASIN/0073523402/102-9052822-5114543?SubscriptionId=1100889MK2XY9PSTV5G2[quote]这是本很新的书,06年末发行,07年才慢慢出现于人们的视野。我在0...
原创
50阅读
0评论
0点赞
发布博客于 13 年前

工作的事情

工作的事情终于告一段落了,就要去广州了,这边厦门的离职手续正在办,希望能早点办完,其实也不能说现在的公司怎么怎么不好,只能说不适合自己吧,虽然和项目组的兄弟们呆的时间不长,只有1年,可是彼此之间还是很投机的,自己有时说话不对的,这里给兄弟们道歉了。这次找工作,要多谢dennis_zane同学了,我也说不出啥感谢的话,一切尽在不言中了。说起来很奇怪,记得当年我是最不想去的城市就是广州...
原创
34阅读
0评论
0点赞
发布博客于 13 年前

又一个失望的夜晚

5点打开pplive,落后0:1,我就知道没什么戏了,每年都期望欧冠有突破,每年都让人那么失望,不过运气也太不好了,一到关键时候,受伤的受伤,没状态的没状态。不过没关系,明年再来,不过中场我觉得老爹改买几个人了,阿奎拉尼,迪亚拉,夸雷斯马,我觉得都不错,维爱国还是卖了吧。馒头决定要辞职了,虽然我是个坚定的倒曼者,不过还是祝福他,一路走好,毕竟还是带给过我们很多欢乐。http://w...
原创
27阅读
0评论
0点赞
发布博客于 13 年前

自勉一下

这是一个好朋友送我的,最近工作的事弄得有点烦,拿出来再次自勉一下:[quote]心如规矩,志如尺衡,平静如水,正直如绳。[/quote]
原创
135阅读
0评论
0点赞
发布博客于 13 年前

发现了一个好东西LLVM

LLVM全称是 Low Level Virtual Machine[quote]LLVM is a robust system, particularly well suited for developing new mid-level language-independent analyses and optimizations of all sorts, including those...
原创
115阅读
0评论
0点赞
发布博客于 13 年前

ruby1.9中的Iterators

在ruby1.9中增加了External Iterators这中新的迭代类型,所有的Enumerable 都是External Iterators.而在ruby1.9之前的版本中的迭代都是internal iterator。何为external iterator呢,其实我认为也就是一个生成器了:[code="ruby"]iterator = 9.downto(1) ...
原创
27阅读
0评论
0点赞
发布博客于 13 年前

一个简单的ruby Metaprogram的例子

比如下面一个文件 people.txt[quote]name,age,weight,height"Smith, John", 35, 175, "5'10""Ford, Anne", 49, 142, "5'4""Taylor, Burt", 55, 173, "5'10""Zubrin, Candace", 23, 133, "5'6
原创
42阅读
0评论
0点赞
发布博客于 13 年前

Ruby Object Model

刚好看到,保存一下.
原创
39阅读
0评论
0点赞
发布博客于 13 年前