核心原始碼解讀基礎

2021-07-10 13:10:37 字數 1792 閱讀 1541

module_init巨集的定義

第一段**:

typedef int (*initcall_t)(void);

......

#define  __define_initcall(level,fn,id)\

static initcall_t  __initcall_##fn##id __attribute_used_ \

__attribute__((__section__(".initcall" level ".init"))) = fn

......

#define device_initcall(fn) __define_initcall("6",fn,6)

......

#define __initcall(fn)device_inicall(fn)

......

#define module_init(x)__initcall(x)

第二段**:

#define initcalls \

*(.initcall0.init)\

*(.initcall0s.init)\

......

*(.initcall7.init)\

*(.initcall7s.init)

第三段**:

.initcall.init :at(addr(.imitcall.init) - load_offset)

第四段**:

static void __init do_initcalls(void)

flush_sheduled_work(); }

第五段**:

typedef int (*initcall_t)(void);

......

#define module_init(initfn)\

static inline initcall_t __inittest(void)\

int init_module(void) __attribute__((alias(#initfn)));

天書一樣的**,但畢竟還是可以理解的,只不過需要一些核心知識和良好的c語言基礎。

c語言**中的"#"與"##"的用法:

(1)"#"的使用

eg:#define printfstr(arg)printf("%s",#arg)

printfstr(output) ->prinf("%s","output")

eg:#define show(var) printf(#var"= %d\n",var);

show(number) -> printf("number = %d\n",var);

(2) "##"的使用

eg:#define join(a,b) a##b

strlen_s(join(var,123),sizeof(join(var,123)))->strlen_s(var123,sizeof(var123))

gcc中的attrbute()

__attribute__可以設定函式屬性,變數屬性,型別屬性

__attribute__的section子項使用方式:

__attribute__((section("section_name")))將作用的函式或資料放入指定名為"section_name"的段

通過__attribute__((alias(#initfn)))為函式定義乙個別名

當從核心態返回到使用者態的時候,要檢查是否進行排程,而排程要看兩個條件:

1.preempt_count是否為0

2.rescheduled是否置位

未完待續

原始碼基礎 核心類

分別列舉client nameserver broker三個部分的核心類,rocketmq的功能實現跟這些類密不可分。有時間的話,可以一一弄清楚每個類的具體作用。對於生產訊息來說,我們一般接觸的第乙個類就是它。defaultmqproducer producer new defaultmqprodu...

openTLD 原始碼解讀

首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...

thinkphp原始碼解讀

thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...