日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

FreeBSD中的SYSINIT框架

系統(tǒng) 2478 0

SYSINIT是一個通用的調(diào)用排序與分別執(zhí)行機(jī)制的框架。FreeBSD目前使用它來進(jìn)行內(nèi)核的動態(tài)初始化。SYSINIT使得FreeBSD的內(nèi)核各子系統(tǒng)可以在內(nèi)核或模塊動態(tài)加載鏈接時被重整、添加、刪除、替換,這樣,內(nèi)核和模塊加載時就不必去修改一個靜態(tài)的有序初始化安排表甚至重新編譯內(nèi)核。這個體系也使得內(nèi)核模塊(現(xiàn)在稱為KLD可以與內(nèi)核不同時編譯、鏈接、在引導(dǎo)系統(tǒng)時加載,甚至在系統(tǒng)運行時加載。這些操作是通過"內(nèi)核鏈接器"(kernel linker)和"鏈接器集合"(linker set)完成的。鏈接器集合(Linker Set)是一種鏈接方法。這種方法將整個程序源文件中靜態(tài)申明的數(shù)據(jù)收集到一個可鄰近尋址的數(shù)據(jù)單元中。 SYSINIT要依靠鏈接器獲取遍布整個程序源代碼多處申明的靜態(tài)數(shù)據(jù)并把它們組成一個彼此相鄰的數(shù)據(jù)塊。這種鏈接方法被稱為"鏈接器集合"(linker set)。SYSINIT使用兩個鏈接器集合以維護(hù)兩個數(shù)據(jù)集合,包含每個數(shù)據(jù)條目的調(diào)用順序、函數(shù)、一個會被提交給該函數(shù)的數(shù)據(jù)指針。?
SYSINIT按照兩類優(yōu)先級標(biāo)識對函數(shù)排序以便執(zhí)行。第一類優(yōu)先級的標(biāo)識是子系統(tǒng)的標(biāo)識,給出SYSINIT分別執(zhí)行子系統(tǒng)的函數(shù)的全局順序,定義在
中的枚舉sysinit_sub_id內(nèi)。第二類優(yōu)先級標(biāo)識在子系統(tǒng)中的元素的順序,定義在中的枚舉sysinit_elem_order內(nèi)。 有兩種時刻需要使用SYSINIT:系統(tǒng)啟動或內(nèi)核模塊加載時,系統(tǒng)析構(gòu)或內(nèi)核模塊卸載時。內(nèi)核子系統(tǒng)通常在系統(tǒng)啟動時使用SYSINIT的定義項以初始化數(shù)據(jù)結(jié)構(gòu)。例如,進(jìn)程調(diào)度子系統(tǒng)使用一個SYSINIT定義項來初始化運行隊列數(shù)據(jù)結(jié)構(gòu)。設(shè)備驅(qū)動程序應(yīng)避免直接使用SYSINIT(),對于總線結(jié)構(gòu)上的物理真實設(shè)備應(yīng)使用DRIVER_MODULE()調(diào)用的函數(shù)先偵測設(shè)備的存在,如果存在,再進(jìn)行設(shè)備的初始化。這一系統(tǒng)過程中,會做一些專門針對設(shè)備的事情,然后調(diào)用SYSINIT()本身。對于非總線結(jié)構(gòu)一部分的虛設(shè)備,應(yīng)改用DEV_MODULE()。

使用SYSINIT

接口

頭文件

<sys/kernel.h>

?

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

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

啟動


宏SYSINIT()在SYSINIT啟動數(shù)據(jù)集合中建立一個SYSINIT數(shù)據(jù)項,以便SYSINIT在系統(tǒng)啟動或模塊加載時排序并執(zhí)行其中的函數(shù)。SYSINIT()有一個參數(shù)uniquifier,SYSINIT用它來標(biāo)識數(shù)據(jù)項,隨后是子系統(tǒng)順序號、子系統(tǒng)元素順序號、待調(diào)用函數(shù)、傳遞給函數(shù)的數(shù)據(jù)。所有的函數(shù)必須有一個恒量指針參數(shù)。
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應(yīng)當(dāng)分別在上面提到的枚舉sysinit_sub_id和sysinit_elem_order之中。既可以使用已有的枚舉項,也可以將自己的枚舉項添加到這兩個枚舉的定義之中。你可以使用數(shù)學(xué)表達(dá)式微調(diào)SYSINIT的執(zhí)行順序。以下的例子示例了一個需要剛好要在內(nèi)核參數(shù)調(diào)整的SYSINIT之前執(zhí)行的SYSINIT。

調(diào)整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);

析構(gòu)


宏SYSUNINIT()的行為與SYSINIT()的相當(dāng),只是它將數(shù)據(jù)項填加至SYSINIT的析構(gòu)數(shù)據(jù)集合。?

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 永嘉县| 五峰| 宝丰县| 南宫市| 安顺市| 肥西县| 凌云县| 锦州市| 江阴市| 丰宁| 建水县| 十堰市| 定襄县| 葵青区| 田东县| 土默特右旗| 社旗县| 长丰县| 三江| 东海县| 阳西县| 黎平县| 密山市| 长丰县| 安丘市| 新龙县| 垣曲县| 内丘县| 扎鲁特旗| 兴国县| 美姑县| 韩城市| 甘孜县| 安义县| 商城县| 崇礼县| 德钦县| 仙桃市| 磴口县| 佛山市| 桦甸市|