FreeBSD 内核中的SYSINIT分析
2009-05-13 03:54:13来源:未知 阅读 ()
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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 分析squid的日志,罗列出一天最多的点击url 2009-05-13
- 分析工作迁移到 NetBSD 5.0 2009-05-13
- FreeBSD下authlib出现Input/output error的分析及解决一例 2009-05-13
- 系统上电时的启动代码分析 2009-05-13
- /sys/i386/i386/locore.s分析笔记 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash