linux内核中的tasklet机制

2010年6月6日 没有评论 9,188 人阅读过  

tasklet是IO驱动程序中实现可延迟函数的一种首选的方法,一个tasklet只可以在一个CPU上同步地执行,不同的tasklet可以在不同地CPU上同步地执行。

tasklet的实现是建立在两个软件中断的基础之上的,即HI_SOFTIRQ和TASKLET_SOFTIRQ,本质上没有什么区别,只不过HI_SOFTIRQ的优先级更高一些,建立在HI_SOFTIRQ上的tasklet会早于TASKLET_SOFTIRQ执行。

tasklet链表是存放在tasklet_vec和tasklet_hi_vec这两个数组里面的,数组的长度就是cpu的个数,这是两个percpu数组。linux为smp定义了一系列的宏用于初始化获取删除percpu变量

1
DEFINE_PER_CPU(struct tasklet_struct , tasklet_vec)

这个宏的作用是创建一个类型为tasklet_struct类型的tasklet_vec数组,这个数组即属于percpu数据…

...
分类: Linux 标签:

linux内核中的软中断的实现

2010年6月5日 没有评论 9,960 人阅读过  

最近在阅读linux内核源码,把自己的一些理解发上来,一方面看到的朋友可以帮我指正我理解偏差的地方,别一方面也算是做一个简单的总结。

首先调用open_softirq()函数来初始化软件中断处理函数,将软件中断处理函数根据软中断的下标号插入到softirq_vec数组中,实现过程很简单如下:

1
2
3
4
void open_softirq(int nr, void (*action)(struct softirq_action *))
{
	softirq_vec[nr].action = action;
}

softirq_vec数据有32个元素,对应的是可以有32个软件中断,但实际上linux只是使用了其中的6个软中断,相应的每一个CPU都会有一个对应的32位的掩码__softirq_pending描述挂起的软中断,每一位对应一个软件中断,__soctirq_penging在irq_cpustat_t中定义,如下:…

...
分类: Linux 标签:

DNS解析协议的C语言简单实现

2010年5月11日 9 条评论 22,950 人阅读过  

仔细看了看DNS协议的相关东西,其实实际编程的时候根本用不到DNS细节的东西,要获取域名的时候经终端下用hos […]

...
分类: Protocol 标签: , ,

Slackware系统中为LaTeX安装CJK解决中文问题

2010年5月8日 7 条评论 10,922 人阅读过  

过几天要做presentation,想借这个机会把LaTeX好好学学,今天在解决中文问题的时候着实把我卡住了, […]

...
分类: LaTeX 标签: ,

gstreamer播放wav文件

2010年5月6日 3 条评论 10,664 人阅读过  

有网友留言希望我在飞信上加上声音提示,下午的时候整了整,很早以前写过一个直接操作/dev/dsp的小程序用来播 […]

...
分类: C/C++ 标签: , ,

State of Peer-to-Peer Communication across NAT(rfc5128中文)

2010年4月29日 1 条评论 10,436 人阅读过  

翻译了一下RFC5128,并为我拙劣的英语水准和汉语言表达技巧感到汗颜,如果有人不幸搜到这篇文章,英语不是太差 […]

...
分类: Protocol 标签: , ,

Peer-to-Peer Architecture

2010年4月28日 没有评论 6,777 人阅读过  

阅读了rfc5694,从里面挑了一些概念点的东西翻译了一下,这篇rfc是对p2p体系统结构的一个大体的介绍,没 […]

...
分类: Protocol 标签:

对于飞信文件p2p文件传输的疑惑

2010年4月27日 1 条评论 9,325 人阅读过  

近期在写飞信文件传输部分的代码,又分析了一下飞信文件传输的协议。 飞信的文件传输应该有三种模式,p2p,rel […]

...
分类: My Life 标签: , , ,

STUN协议的C程序

2010年4月26日 2 条评论 13,543 人阅读过  

写了一个小程序测试STUN协议,只可惜国内没有可用的STUN Server,UDP协议又不能穿透HTTP代理,所以我在教育网内没法测试更多功能了,只能写这么多,发出去的包wireshark显示为STUN,但由于测试用Server是国外的服务器,不加代理没法访问,所以就没办法了…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
 
#define STUN_SERVER_IP "132.177.123.13"
#define STUN_SERVER_PORT 3478
 
int socketfd;
 
struct stun_header{
	unsigned short type;
	unsigned short length;
	unsigned int transId1;
	unsigned int transId2;
	unsigned int transId3;
	unsigned int transId4;
};
 
struct mapped_address{
	unsigned padding : 8;
	unsigned family : 8;
	unsigned short port;
	unsigned int address;
};
 
int 
init_socket(){
	socketfd = socket(AF_INET , SOCK_DGRAM , 0);
}
 
int 
stun_rand(){
	srand(time(NULL));
	return rand();
}
 
struct stun_header* 
build_stun_header(unsigned short type){
 
	struct stun_header *header ;
 
	header = (struct stun_header*)malloc(sizeof(struct stun_header));
	header->type = htons(type);
	header->length = 0;
	header->transId1 = stun_rand();
	header->transId2 = stun_rand();
	header->transId3 = stun_rand();
	header->transId4 = stun_rand();
 
	return header;
}
 
int 
udp_send(void *data , int len
		, const char *ip , int port){
 
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr(ip);
	addr.sin_port = htons(port);
 
	return sendto(socketfd , data , len , 0
			, (struct sockaddr*)&addr , sizeof(struct sockaddr));
 
}
 
int 
main(int argc , char *argv[]){
 
	init_socket();
	struct stun_header recv_header;
	struct sockaddr_in addr;
	size_t length;
 
	struct stun_header* header
		= build_stun_header(0x0001);
 
	udp_send(header , sizeof(struct stun_header)
			, STUN_SERVER_IP , STUN_SERVER_PORT);
 
	length = sizeof(struct sockaddr);
	recvfrom(socketfd , (void*)&recv_header , sizeof(recv_header) , 0
			, (struct sockaddr*)&addr , &length);
 
	return 0;
}
...
分类: C/C++ 标签: , , ,

STUN协议简介(部分翻译自rfc3489)

2010年4月26日 1 条评论 10,541 人阅读过  

STUN( Simple Traversal of User Datagram Protocol (UDP) […]

...
分类: Protocol 标签: , ,