日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

FreeBSD系統(tǒng)內(nèi)核對(duì)象

內(nèi)核對(duì)象,也就是Kobj,為操作系統(tǒng)內(nèi)核提供了一種面向?qū)ο蟮腃語(yǔ)言編程方式 。被操作的數(shù)據(jù)也承載操作它的方法 。這使得在不破壞二進(jìn)制兼容性的前提下,某一個(gè)接口能夠增/減相應(yīng)的操作 。Kobj工作時(shí),產(chǎn)生方法的描述 。每個(gè)描述有一個(gè)唯一的標(biāo)識(shí)和一個(gè)缺省函數(shù) 。某個(gè)描述的地址被用來(lái)在一個(gè)類的方法表里唯一的標(biāo)識(shí)方法 。構(gòu)建一個(gè)類,就是要建立一張方法表,并將這張表關(guān)聯(lián)到一個(gè)或多個(gè)函數(shù)(方法);這些函數(shù)(方法)都帶有方法描述 。使用前,類要被編譯 。編譯時(shí)要為這個(gè)類分配一些緩存 。在方法表中的每個(gè)方法描述都會(huì)被指派一個(gè)唯一的標(biāo)識(shí),除非已經(jīng)被其它引用它的類在編譯時(shí)指派了標(biāo)識(shí) 。對(duì)于每個(gè)將要被使用的方法,都會(huì)由腳本生成一個(gè)函數(shù)(方法查找函數(shù)),以解析外來(lái)參數(shù),并在被查詢時(shí)給出方法描述的地址 。被生成的函數(shù)(方法查找函數(shù))憑著那個(gè)方法描述的唯一標(biāo)識(shí)按Hash的方法查找對(duì)象的類的緩存 。如果這個(gè)方法不在緩存中,函數(shù)會(huì)查找使用類的方法表 。如果這個(gè)方法被找到了,類里的相關(guān)函數(shù)(也就是某個(gè)方法的實(shí)現(xiàn)代碼)就會(huì)被使用 。否則,這個(gè)方法描述的缺省函數(shù)將被使用 。這些過(guò)程可被表示如下: 對(duì)象->緩存<->類
如何使用Kobj
結(jié)構(gòu)
struct kobj_method
函數(shù)void kobj_class_compile(kobj_class_t cls);
void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);
void kobj_class_free(kobj_class_t cls);
kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);
void kobj_init(kobj_t obj, kobj_class_t cls);
void kobj_delete(kobj_t obj, struct malloc_type *mtype);宏KOBJ_CLASS_FIELDS
KOBJ_FIELDS
DEFINE_CLASS(name, methods, size)
KOBJMETHOD(NAME, FUNC)頭文件
建立一個(gè)接口的模板
使用Kobj的第一步是建立一個(gè)接口 。建立接口包括建立模板的工作 。建立模板可用腳本src/sys/kern/makeobjops.pl完成,它會(huì)產(chǎn)生申明方法的頭文件和代碼,腳本還會(huì)生成方法查找函數(shù) 。在這個(gè)模板中如下關(guān)鍵詞會(huì)被使用: #include, INTERFACE, CODE, METHOD, STATICMETHOD, 和 DEFAULT. #include語(yǔ)句的整行內(nèi)容將被一字不差的復(fù)制到被生成的代碼文件的頭部 。
例如: #include 關(guān)鍵詞INTERFACE用來(lái)定義接口名 。這個(gè)名字將與每個(gè)方法名接合在一起,形成 [interface name]_[method name] 。語(yǔ)法是:INTERFACE [接口名]; 例如: INTERFACE foo; 關(guān)鍵詞CODE會(huì)將它的參數(shù)一字不差的復(fù)制到代碼文件中 。語(yǔ)法是CODE { [任何代碼] }; 例如:
CODE {
struct foo * foo_alloc_null(struct bar *)
{
return NULL;
}
};【FreeBSD系統(tǒng)內(nèi)核對(duì)象】關(guān)鍵詞METHOD用來(lái)描述一個(gè)方法 。語(yǔ)法是: METHOD [返回值類型] [方法名] { [對(duì)象 [, 參數(shù)若干]] }; 例如:
METHOD int bar {
struct object *;
struct foo *;
struct bar;
};關(guān)鍵詞DEFAULT跟在關(guān)鍵詞METHOD之后,是對(duì)關(guān)鍵詞METHOD的補(bǔ)充 。它給這個(gè)方法補(bǔ)充上缺省函數(shù) 。語(yǔ)法是: METHOD [返回值類型] [方法名] { [對(duì)象; [其它參數(shù)]] }DEFAULT [缺省函數(shù)]; 例如:
METHOD int bar {
struct object *;
struct foo *;
int bar;
} DEFAULT foo_hack;關(guān)鍵詞STATICMETHOD類似關(guān)鍵詞METHOD 。對(duì)于每個(gè)Kobj對(duì)象,一般其頭部都有一些Kobj專有的數(shù)據(jù) 。METHOD定義的方法就假設(shè)這些專有數(shù)據(jù)位于對(duì)象頭部;假如對(duì)象頭部沒有這些專有數(shù)據(jù),這些方法對(duì)這個(gè)對(duì)象的訪問(wèn)就可能出錯(cuò) 。而STATICMETHOD定義的對(duì)象可以不受這個(gè)限制:這樣描述出的方法,其操作的數(shù)據(jù)不由這個(gè)類的某個(gè)對(duì)象實(shí)例給出,而是全都由調(diào)用這個(gè)方法時(shí)的操作數(shù)(譯者注:即參數(shù))給出 。這也對(duì)于在某個(gè)類的方法表之外調(diào)用這個(gè)方法有用 。
其它完整的例子:

推薦閱讀