`
simohayha
  • 浏览: 1407398 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论
文章列表
我们先来看下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 ...
内核启动用户态的应用程序是通过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 ...
我们这里描述的是硬件中断。 设备和内核之间的交互有两种方法。 1 polling(轮询) 也就是kernel来操作交互,由kernel来检测某一个状态,看是否需要让设备做什么。 2 interrupt(中断) 设备来发起交互,设备发出一个硬件中断请求给kernel当他需要kernel的注意时。 当中断来的时候被调用的函数称为interrupt handler,他必须通过设备的驱动来安装。当一个设备驱动注册一个NIC(Network Interface Card),他请求并标记了一个IRQ,然后他为这个中断请求注册一个回调函数. 其中注册回调函数与remove回调函数用下面的两个方 ...
内核中的很多子系统都是联系很紧密的,因此有可能某个子系统的某些事件,其他多个子系统都很感兴趣,此时就需要用到notification chain. 举个具体的例子,比如说一台主机由于某个网卡的损坏或其他原因不能使用,从而导致连 ...
这次我们来看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 。 ...
在内核中有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,区别是第一个不是线程安全的,第二个 ...

linux下的elf结构

可以看到链接器和加载器看待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 ...
在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 ...
主要的问题是,我这里需要给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); ...
Global site tag (gtag.js) - Google Analytics