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

FreeBSD 內(nèi)核中的SYSINIT分析

FreeBSD;kernel是一個膨大的系統(tǒng),;對于這樣一個大系統(tǒng),;里面往往包含了大量的子系統(tǒng)和模塊,當(dāng)系統(tǒng)初始化時這些模塊就需要初始化,;按照通常的思路,這些初始化過程必須在某處被顯式地調(diào)用,這樣一來,當(dāng)你新增某個模塊,你必須再修改那個系統(tǒng)初始化的地方來調(diào)用這個新增模塊的初始化過程,;而且由于ANSI;C語言的限制,調(diào)用某個函數(shù)最好先聲明,這樣當(dāng)系統(tǒng)的初始化過程開始增加時,;那個調(diào)用初始化過程的文件開始大量包含那些本來不相關(guān)的頭文件,;偶合度就增加了,;這是一種不好的設(shè)計.;

FreeBSD為了應(yīng)付這種情況,;使用一種叫做SYSINIT的機(jī)制.;我們知道FreeBSD使用一種叫做;ELF的二進(jìn)制目標(biāo)執(zhí)行文件格式.;這種文件格式允許文件內(nèi)部組織成結(jié)構(gòu)化的方式,;文件內(nèi)部可以由不同的組成部分(section),;FreeBSD正是利用了這種機(jī)制.;

FreeBSD使用GNU;GCC作為其C語言編譯器,;這種編譯器允許在C源程序中嵌入?yún)R編語言代碼,;FreeBSD通過在C源程序中加入?yún)R編指令來在目標(biāo)文件中增加額外的section,;在文件;/sys/sys/linker_set.h中定義如下:;



#ifdef;__alpha__
#define;MAKE_SET(set,;sym);;;;;;
static;void;const;*;const;__set_##set##_sym_##sym;=;&sym
__asm(".align;3");;;;;;;
__asm(".section;.set.";#set;","aw"");;
__asm(".quad;";#sym);;;;
__asm(".previous")
#else
#define;MAKE_SET(set,;sym);;;
#define;MAKE_SET(set,;sym);;;;;;
static;void;const;*;const;__set_##set##_sym_##sym;=;&sym
__asm(".section;.set.";#set;","aw"");;
__asm(".long;";#sym);;;;
__asm(".previous")
#endif
#define;TEXT_SET(set,;sym);MAKE_SET(set,;sym)
#define;DATA_SET(set,;sym);MAKE_SET(set,;sym)

程序一旦在某處調(diào)用DATA_SET宏指令,;就會將相應(yīng)的匯編符號加入到目標(biāo)文件.;例如:;int;myint;DATA_SET(myset,;myint);
這兩句話將導(dǎo)致在目標(biāo)文件中創(chuàng)建一個myset;section,;并且myint的地址將被放入這個;section中.;

系統(tǒng)的初始化必須按嚴(yán)格的順序進(jìn)行,;為此FreeBSD定義了很多子系統(tǒng)的順序號,;這些順序連同SYSINIT的許多相關(guān)定義在/sys/sys/kernel.h頭文件中:;



enum;sysinit_sub_id;{
SI_SUB_DUMMY;;;;=;0x0000000,;;;;/*;not;executed;;for;linker*/
SI_SUB_DONE;;;;;=;0x0000001,;;;;/*;processed*/
SI_SUB_CONSOLE;;=;0x0800000,;;;;/*;console*/
SI_SUB_COPYRIGHT=;0x0800001,;;;;/*;first;use;of;console*/
SI_SUB_TUNABLES;=;0x0700000,;;;;/*;establish;tunable;values;*/
SI_SUB_VM;;;;;;;=;0x1000000,;;;;/*;virtual;memory;system;init*/
SI_SUB_KMEM;;;;;=;0x1800000,;;;;/*;kernel;memory*/
SI_SUB_KVM_RSRC;=;0x1A00000,;;;;/*;kvm;operational;limits*/
SI_SUB_CPU;;;;;;=;0x1e00000,;;;;/*;CPU;resource(s)*/
SI_SUB_KLD;;;;;;=;0x1f00000,;;;;/*;KLD;and;module;setup;*/
SI_SUB_INTRINSIC=;0x2000000,;;;;/*;proc;0*/
SI_SUB_VM_CONF;;=;0x2100000,;;;;/*;config;VM,;set;limits*/
SI_SUB_RUN_QUEUE=;0x2200000,;;;;/*;the;run;queue*/
SI_SUB_CREATE_INIT;;;;;;=;0x2300000,;;;;/*;create;the;init;process;*/
SI_SUB_DRIVERS;;=;0x2400000,;;;;/*;Let;Drivers;initialize;*/
SI_SUB_CONFIGURE=;0x3800000,;;;;/*;Configure;devices;*/
SI_SUB_VFS;;;;;;=;0x4000000,;;;;/*;virtual;file;system*/
SI_SUB_CLOCKS;;;=;0x4800000,;;;;/*;real;time;and;stat;clocks*/
SI_SUB_MBUF;;;;;=;0x5000000,;;;;/*;mbufs*/
SI_SUB_CLIST;;;;=;0x5800000,;;;;/*;clists*/
SI_SUB_SYSV_SHM;=;0x6400000,;;;;/*;System;V;shared;memory*/
SI_SUB_SYSV_SEM;=;0x6800000,;;;;/*;System;V;semaphores*/
SI_SUB_SYSV_MSG;=;0x6C00000,;;;;/*;System;V;message;queues*/
SI_SUB_P1003_1B;=;0x6E00000,;;;;/*;P1003.1B;realtime;*/
SI_SUB_PSEUDO;;;=;0x7000000,;;;;/*;pseudo;devices*/
SI_SUB_EXEC;;;;;=;0x7400000,;;;;/*;execve();handlers;*/
SI_SUB_PROTO_BEGIN;;;;;;=;0x8000000,;;;;/*;XXX:;set;splimp;(kludge)*/
...
};

子系統(tǒng)內(nèi)還有順序號:
enum;sysinit_elem_order;{
SI_ORDER_FIRST;;=;0x0000000,;;;;/*;first*/
SI_ORDER_SECOND;=;0x0000001,;;;;/*;second*/
SI_ORDER_THIRD;;=;0x0000002,;;;;/*;third*/

推薦閱讀