设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> 操作系统 >> FreeBSD平台 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
使用FreeBSD的原因
FreeBSD启动扇区代码分析…
FreeBSD操作系统的引导
FreeBSD的boot0阶段介绍
FreeBSD操作系统的boot2…
FreeBSD系统内核对象
调整FreeBSD的虚拟内存系…
FreeBSD 5.0硬盘安装指南
FreeBSD的Loader和内核初…
FreeBSD 5.0的强制访问控…
  FreeBSD中的SYSINIT框架         ★★★★★
FreeBSD中的SYSINIT框架
 

【导读】SYSINIT是一个通用的调用排序与分别执行机制的框架。FreeBSD目前使用它来进行内核的动态初始化。 SYSINIT是一个通用的调用排序与分别执行机制的框架。FreeBSD目前使用它来进行内核的动态初始化。SYSINIT使得FreeBSD的内核各子系统可以在内核或模块动态加载链接时被重整、添加、删除、替换,这样,内核和模块加载时就不必去修改一个静态的有序初始化安排表甚至重新编译内核。这个体系也使得内核模块(现在称为KLD可以与内核不同时编译、链接、在引导系统时加载,甚至在系统运行时加载。这些操作是通过“内核链接器”(kernel linker)和“链接器集合”(linker set)完成的。链接器集合(Linker Set)是一种链接方法。这种方法将整个程序源文件中静态申明的数据收集到一个可邻近寻址的数据单元中。 SYSINIT要依靠链接器获取遍布整个程序源代码多处申明的静态数据并把它们组成一个彼此相邻的数据块。这种链接方法被称为“链接器集合”(linker set)。SYSINIT使用两个链接器集合以维护两个数据集合,包含每个数据条目的调用顺序、函数、一个会被提交给该函数的数据指针。

SYSINIT按照两类优先级标识对函数排序以便执行。第一类优先级的标识是子系统的标识,给出SYSINIT分别执行子系统的函数的全局顺序,定义在中的枚举sysinit_sub_id内。第二类优先级标识在子系统中的元素的顺序,定义在中的枚举sysinit_elem_order内。 有两种时刻需要使用SYSINIT:系统启动或内核模块加载时,系统析构或内核模块卸载时。内核子系统通常在系统启动时使用SYSINIT的定义项以初始化数据结构。例如,进程调度子系统使用一个SYSINIT定义项来初始化运行队列数据结构。设备驱动程序应避免直接使用SYSINIT(),对于总线结构上的物理真实设备应使用DRIVER_MODULE()调用的函数先侦测设备的存在,如果存在,再进行设备的初始化。这一系统过程中,会做一些专门针对设备的事情,然后调用SYSINIT()本身。对于非总线结构一部分的虚设备,应改用DEV_MODULE()。

使用SYSINIT
接口

头文件

<SYS kernel.h>



宏

SYSINIT(uniquifier, subsystem, order, func, ident)

SYSUNINIT(uniquifier, subsystem, order, func, ident)

启动

宏SYSINIT()在SYSINIT启动数据集合中建立一个SYSINIT数据项,以便SYSINIT在系统启动或模块加载时排序并执行其中的函数。SYSINIT()有一个参数uniquifier,SYSINIT用它来标识数据项,随后是子系统顺序号、子系统元素顺序号、待调用函数、传递给函数的数据。所有的函数必须有一个恒量指针参数。

SYSINIT()的例子
#include 



void foo_null(void *unused)

{

        foo_doo();

}

SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);



struct foo foo_voodoo = {

        FOO_VOODOO;

}



void foo_arg(void *vdata)

{

        struct foo *foo = (struct foo *)vdata;

        foo_data(foo);

}

SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);

   

注意,SI_SUB_FOO和SI_ORDER_FOO应当分别在上面提到的枚举sysinit_sub_id和sysinit_elem_order之中。既可以使用已有的枚举项,也可以将自己的枚举项添加到这两个枚举的定义之中。你可以使用数学表达式微调SYSINIT的执行顺序。以下的例子示例了一个需要刚好要在内核参数调整的SYSINIT之前执行的SYSINIT。

调整SYSINIT()顺序的例子
static void

mptable_register(void *dummy __unused)

{



    apic_register_enumerator(&mptable_enumerator);

}



SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST,

    mptable_register, NULL);

析构

宏SYSUNINIT()的行为与SYSINIT()的相当,只是它将数据项填加至SYSINIT的析构数据集合。

SYSUNINIT()的例子
#include <SYS kernel.h>



void foo_cleanup(void *unused)

{

        foo_kill();

}

SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);



struct foo_stack foo_stack = {

        FOO_STACK_VOODOO;

}



void foo_flush(void *vdata)

{

}

SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2006-10-10
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:admin    责任编辑:admin 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持