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 <sys/kernel.h>

 

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);

SRC=http://os.51cto.com/art/200511/11446.htm

FreeBSD中的SYSINIT框架【转】的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 4.2. 构建一个搜索查询 搜索数据是几乎所有应用的一个基本功能.它一般是动态的,因 ...

  3. eclipse中SSH三大框架环境搭建<三>

    相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...

  4. eclipse中SSH三大框架环境搭建<二>

    通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...

  5. 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一

    细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework        ADO.NET Entity Framework 是微软以 ADO.N ...

  6. eclipse中SSH三大框架环境搭建<一>

    这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...

  7. Android 进阶 Android 中的 IOC 框架 【ViewInject】 (下)

    上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...

  8. IOS 中的CoreImage框架

    IOS 中的CoreImage框架(framework) - time4cnblogs 时间 2014-03-15 00:24:00  博客园-所有随笔区原文  http://www.cnblogs. ...

  9. ethtool 在 Linux 中的实现框架和应用

    转载:http://www.ibm.com/developerworks/cn/linux/1304_wangjy_ethtools/index.html?ca=dat- 王 俊元, 软件工程师, I ...

随机推荐

  1. 常用协议(SPI, UART, I2C)

    SPI: SPI是全双工的同步串行接口,数据速率可达几Mbps,在一般应用中有4根信号线:MOSI, MISO, SCK, SS. 根据时钟极性(CPOL)及相位(CPHA)不同可以组合成4种工作模式 ...

  2. Docker使用Dockerfile创建Centos(tomcat+jdk)镜像

    原文链接:https://blog.csdn.net/qq_37936542/article/details/80824389 Docker构建镜像的方法主要有两种:    (1)使用docker c ...

  3. 【习题 3-8 UVA - 202】Repeating Decimals

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 余数出现循环节. 就代表出现了循环小数. [代码] #include <bits/stdc++.h> using nam ...

  4. C#学习笔记——常量、字段以及事件

    一 常量与字段 (一) 常量 常量总是被视为静态成员,而不是实例成员.定义常量将导致创建元数据.代码引用一个常量时,编译器会在定义常量的程序集的元数据中查找该符号,提取常量的值,并将值嵌入IL中.由于 ...

  5. js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言

    js进阶 12-16 jquery如何实现通过点击按钮和按下组合键两种方式提交留言 一.总结 一句话总结:实现按下组合键提交留言是通过给input加keydown事件,判断按键的键码来实现的. 1.如 ...

  6. Let's do our own full blown HTTP server with Netty--转载

    原文地址:http://adolgarev.blogspot.com/2013/12/lets-do-our-own-full-blown-http-server.html Sometimes ser ...

  7. netty检测系统工具PlatformDependent

    1. 检测jdk版本 @SuppressWarnings("LoopStatementThatDoesntLoop") private static int javaVersion ...

  8. 每日技术总结:filter(),Bscroll

    前言: 这是一个vue的电商项目,使用express后端提供数据. 1.filter()函数. 事情是这样的.我从数据库拿到了所有分类数据. 分类有三个等级.父类,子类,孙类这样.但它们都在同一张表里 ...

  9. simple-word-Highlighter 支持网址正则表达式匹配

  10. 9.12 Binder系统_Java实现_内部机制_Client端

    Java实现中client端的RPC层(java实现)如何通过JNI来调用IPC层(C++实现)发送数据 TestServer通过addService向Service_manager注册的时候Test ...