- 浏览: 1407398 次
- 性别:
- 来自: 火星
-
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
文章列表
我们先来看下pci_driver结构,它的id_table是一个指向当前驱动所能处理的pci设备的id列表,由于每个pci设备都有一个唯一的标记,因此我们通过pci_device_id结构就可以标记不同的pci设备。
driver则指向下一个pci驱动。
struct pci_driver {
struct list_head node;
char *name;
const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */
int (*probe) (struct p ...
- 2009-04-13 00:06
- 浏览 3245
- 评论(0)
内核启动用户态的应用程序是通过call_usermodehelper来调用的,比较常见的调用,比如modprobe.
static inline int
call_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait)
参数说明;
path : 应用程序的位置
argv : 传递给用户态应用程序的参数
envp: 传递给应用程序的环境变量
wait : 调用用户态应用程序的内核程序是否等到用户态程序退出后才退出。
使用的例子:
我们来看kmod.c的源码,它通过调用用户态的modprob ...
- 2009-04-06 01:40
- 浏览 3186
- 评论(0)
我们这里描述的是硬件中断。
设备和内核之间的交互有两种方法。
1 polling(轮询)
也就是kernel来操作交互,由kernel来检测某一个状态,看是否需要让设备做什么。
2 interrupt(中断)
设备来发起交互,设备发出一个硬件中断请求给kernel当他需要kernel的注意时。
当中断来的时候被调用的函数称为interrupt handler,他必须通过设备的驱动来安装。当一个设备驱动注册一个NIC(Network Interface Card),他请求并标记了一个IRQ,然后他为这个中断请求注册一个回调函数.
其中注册回调函数与remove回调函数用下面的两个方 ...
- 2009-04-06 01:19
- 浏览 2178
- 评论(0)
内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些事件,其他多个子系统都很感兴趣,此时就需要用到notification chain.
举个具体的例子,比如说一台主机由于某个网卡的损坏或其他原因不能使用,从而导致连 ...
- 2009-03-28 01:55
- 浏览 2561
- 评论(0)
这次我们来看libevent的信号的处理。
在libevent中通过使用socketpair建立一对流管道,也就是全双工管道,来将信号事件与句柄事件统一起来。
先来看数据结构:
struct evsignal_info {
struct event ev_signal; ///<所属的event
int ev_signal_pair[2]; ///<创建的流管道
int ev_signal_added; ///<信号是否已被加入到event中的标记。
volatile sig_atomic_t evsignal_caught; ///&l ...
我们来看下libevent的定时器的实现
在libevent中定时器的实现是通过基于最小堆的优先级队列来实现的。
对于这两个数据结构比较陌生的可以去翻算法导论的6.5节。
主要的源码都在min_heap.c中。
我们先来看主要的数据结构:
typedef struct min_heap
{
struct event** p;
unsigned n, a;
} min_heap_t;
在这个数据结构中 p也就是整个优先级队列,而这个优先级队列的每个节点都是一个struct *event.n表示这个队列的元素个数。a表示这个队列的大小.
接下来来看几个主要的方法 ...
这里分析的是libevent-1.4.9。
PS:前面还看了libev的源代码,妈的,那代码写的太猥亵了,相比较libevent代码写的好多了。。
首先来看一下最主要的几个数据结构:
eventop结构体是所有事件驱动模型的基类。所有的io复用类型都会实现此结构体里各种方法。
struct eventop {
const char *name; ///<事件驱动名称
void *(*init)(struct event_base *); //<初始化
int (*add)(void *, struct event *); ///<加入新的事件监测 ...
大体的引导过程可以看我前面写的博客:
http://simohayha.iteye.com/blog/269093
masterboot的主要功能是从硬盘的一个已激活分区装载引导分区的第1个扇区的引导信息,并将控制权交给此引导程序。
引导过程中,未分区磁盘和已分区磁盘的布局是不同的,已分区磁盘的话,第一个扇区是主引导记录和分区表,而masterboot就存放在这里,将由它来查找激活分区的引导块(也就是在激活分区的第一个扇区里面),也就是下一次我们要分析的bootblock程序。而未分区磁盘的话第一个扇区直接存储的就是引导块。然后由引导块去加载引导程序也就是boot monitor 。
...
- 2009-01-15 21:45
- 浏览 3194
- 评论(0)
在内核中有3个不同的时间:
Wall time(real time), Process time和Monotonic time.
Wall time,也就是rtc时钟。
Process time,进程执行的时间。
Monotonic time,也就是系统从boot后到当前的时间。
表示时间的数据结构:
typedef __timer_t timer_t;
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Micr ...
更详细的用法请看他的文档:
http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod
struct ev_loop *ev_default_loop (unsigned int flags)
struct ev_loop *ev_loop_new (unsigned int flags)
这两个函数都是默认初始化一个loop,区别是第一个不是线程安全的,第二个 ...
可以看到链接器和加载器看待elf是完全不同的,链接器看到的是由区段头部表描述的一系列逻辑区段的集合(也就是说它忽略了程序头部表)。而加载器则是看成是由程序头部表描述的一系列的段的集合(忽略了区段头部表)。
elf它可以表示不同类型的二进制文件(由e_type来决定):
#define ET_NONE 0
#define ET_REL 1 //可重定位
#define ET_EXEC 2 //可执行
#define ET_DYN 3 //动态链接库
#define ET_CORE 4
#define ET_LOPROC 0xff00
...
- 2008-12-12 00:20
- 浏览 5206
- 评论(0)
在php中最核心的一个数据结构就是这个:
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct _zval_struct {
/* Variable inform ...
malloc的实现,在linux下的实现是这样的,当所需要分配的内存大于128k,会用mmap(匿名映射)来实现。小于128k使用在堆分配(改天会分析下malloc函数的源码实现)。
这里还有几个
mallopt(int param,int value);
这个函数能设置一些内存分配管理的参数,也就是设置param为value的值(比如我们想要强制所分配的内存是mmap分配的)。具体的参数可以去看man手册。
使用这个很简单,就是在使用malloc之前设置就好了。
struct mallinfo mallinfo(void);
可以看下mallinfo结构体的结构;
s ...
- 2008-11-27 00:56
- 浏览 4499
- 评论(1)
主要的问题是,我这里需要给php写动态扩展库,而当我移植完之后,phpinfo显示:
引用standard
Dynamic Library support not available
这样的话,我写的动态链接库就无法加载。。
这里的原因是当configure的时候他好像没有找到dlopen,因此这里我们需要configure完后强制他使用dlopen.
首先修改php的Makefile.在开始出添加LDFLAGS += -ldl ,这里是为了链接dlopen库。
然后修改main/php.h 在开始处添加#define HAVE_LIBDL 1 ,这个宏是为了交叉编译时强制使 ...
数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当一个数被装载进内存,它的内存地址是它的数据大小的倍数,这个就是自然对齐。比如一个32位的数据,他被装载进内存的地址就是4的倍数,也就是地址最后两位是0.
对齐方式是依赖于硬件的,有些架构对于数据的对齐要求很严格。如果这些系统装载进了没有对齐的数据将会引起一个processor trap.而有些系统则很安全,不过会使性能降低。
这里如果我们想要更大的数据对齐边界,比如按页来对齐,这时我们可以使用这个函数:
posix_memalign(void **memptr, size_t alignment, size_t size);
...