亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

FreeBSD中的SYSINIT框架

系統 2303 0

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框架


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: a级日本理论片在线播放 | 九九综合 | 国内精品自在自线在免费 | 日本色色网 | 欧美xxxxbbbb在线播放 | 色综合天天操 | 全黄冷激性性视频 | 国产精品123区| 欧美精品99久久久久久人 | 在线99视频| 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | 成年女人a毛片免费视频 | 久久黄色网 | 日韩欧美国产偷亚洲清高 | 俄罗斯色视频 | 国产免费a视频 | 日韩亚洲成a人片在线观看 日韩亚洲第一页 | 日本一区视频在线 | 98精品国产综合久久 | 日韩免费在线视频观看 | 日韩欧美综合视频 | 国产欧美一区二区精品久久久 | 久久一区二区精品综合 | 成人国产在线24小时播放视频 | 九九99香蕉在线视频免费 | 国内精品久久久久影院一蜜桃 | 久久久成人啪啪免费网站 | 狠狠色噜狠狠狠狠色综合久 | 午夜a一级毛片一.成 | 色天天干 | 四虎精品永久免费 | 欧毛片 | 毛片在线观看网站 | 国产大学生一级毛片绿象 | 日韩国产综合 | 99精品视频在线免费观看 | 国产精品美女久久久久网 | 久久美剧 | 天天做天天做天天综合网 | 日韩新片王 | 久草视频网 |