现在的位置: 首页 >> 操作系统 >> FreeBSD >> FreeBSD 内核中的SYSINIT分析
添加时间:2005-8-21 来源:网教中国 作者:
FreeBSD 内核中的SYSINIT分析

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")
#endif
#define TEXT_SET(set, sym) MAKE_SET(set, sym)
#define DATA_SET(set, sym) MAKE_SET(set, sym)

程序一旦在某处调用DATA_SET宏指令, 就会将相应的汇编符号加入到目标文件. 例如: int myint;DATA_SET(myset, myint);
这两句话将导致在目标文件中创建一个myset section, 并且myint的地址将被放入这个 section中. 

系统的初始化必须按严格的顺序进行, 为此FreeBSD定义了很多子系统的顺序号, 这些顺序连同SYSINIT的许多相关定义在/sys/sys/kernel.h头文件中: 



enum sysinit_sub_id {
        SI_SUB_DUMMY            = 0x0000000,    /* not executed; for linker*/
        SI_SUB_DONE             = 0x0000001,    /* processed*/
        SI_SUB_CONSOLE          = 0x0800000,    /* console*/
        SI_SUB_COPYRIGHT        = 0x0800001,    /* first use of console*/
        SI_SUB_TU

[1] [2] [3] [4] [5] [6]  下一页


上一篇:FreeBSD 5.0中强制访问控制机制的使用与源代码分析 (2 下一篇:FreeBSD编译内核详解
大部分文章摘自网上,如有侵犯您的权益请与我们联系,我们会第一时间进行处理,谢谢! [ 打印文章 ] [ 关闭窗口 ]
推荐文章
·FreeBSD handbook中文版 9 配制F
·FreeBSD 升级系统
·Ports & Package
·FreeBSD kernel 编译大法(二)ker
·FreeBSD 上使用Kerberos 5认证
·FreeBSD 5.x 中 gbfs 的修正,及
·FreeBSD 安装Linuxigd
·FreeBSD 使用cvsd创建安全的cvs
·FreeBSD trafcount命令介绍
·FreeBSD入门安装及汉化
相关文章
 
最新文章
·FreeBSD连载(94):基于NAT的负载
·FreeBSD连载(93):反向代理负载
·FreeBSD连载(92):基于DNS的负载
·FreeBSD连载(91):提升静态网页
·FreeBSD连载(90):单服务器性能
·FreeBSD连载(89):CGI和SSI的安
·FreeBSD连载(88):安全连接方式S
·FreeBSD连载(87):基于用户的访
·FreeBSD连载(86):对IP地址和域
·FreeBSD连载(85):配置Apache服(
Google