FreeBSD 内核中的SYSINIT分析

2009-05-13 03:54:13来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


    FreeBSD kernel是一个膨大的系统, 对于这样一个大系统, 里面往往包含了大量的子系统和模块,当系统初始化时这些模块就需要初始化, 按照通常的思路,这些初始化过程必须在某处被显式地调用,这样一来,当你新增某个模块,你必须再修改那个系统初始化的地方来调用这个新增模块的初始化过程, 而且由于ANSI C语言的限制,调用某个函数最好先声明,这样当系统的初始化过程开始增加时, 那个调用初始化过程的文件开始大量包含那些本来不相关的头文件, 偶合度就增加了, 这是一种不好的设计.  
  FreeBSD为了应付这种情况, 使用一种叫做SYSINIT的机制. 我们知道FreeBSD使用一种叫做 ELF的二进制目标执行文件格式. 这种文件格式允许文件内部组织成结构化的方式, 文件内部可以由不同的组成部分(section), FreeBSD正是利用了这种机制.  
  FreeBSD使用GNU GCC作为其C语言编译器, 这种编译器允许在C源程序中嵌入汇编语言代码, FreeBSD通过在C源程序中加入汇编指令来在目标文件中增加额外的section, 在文件 /sys/sys/linker_set.h中定义如下:  
#ifdef __alpha__
#define MAKE_SET(set, sym)                                             
        static void const * const __set_##set##_sym_##sym = &sym;      
        __asm(".align 3");                                             
        __asm(".section .set." #set ",\"aw\"");                        
        __asm(".quad " #sym);                                          
        __asm(".previous")
#else
#define MAKE_SET(set, sym)   
#define MAKE_SET(set, sym)                                             
        static void const * const __set_##set##_sym_##sym = &sym;      
        __asm(".section .set." #set ",\"aw\"");                        
        __asm(".long " #sym);                                          
        __asm(".previous")

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:FreeBSD 5 内核源代码分析之中断处理

下一篇:使用计算机COM控制FreeBSD