kernel的網路初始化順序:
core_initcall : sock_init
fs_initcall : inet_init
subsys_initcall : net_dev_init
device_initcall : 裝置驅動初始化
網路基礎系統初始化
第一步,使用core_initcall初始化巨集修飾sock_init函式,這個巨集指定了sock_init函式放在級別為1的**中,也就是說它的執行時最先進的一部分,此函式只是分配一些記憶體空間,以及建立了乙個sock_fs_type的檔案系統。在do_basic_setup中呼叫sock_init先於internet協議註冊被呼叫,因此基本的socket初始化必須在每乙個tcp/ip成員協議能註冊到socket層之前完成。
static
int __init sock_init(void)
sock_init函式看上去比較簡單,其實裡面完成了相當重要的工作。第一句呼叫sk_init(),其實不做什麼實質性的事,只是對一些變數進行賦值。
void __init sk_init(void)
else
if (totalram_pages >= 131072)
}
網路記憶體管理核心
skb_init函式
void __init skb_init(void)
函式的作用就是建立了兩個快取,skbuff_head_cache和skbuff_fclone_cache。協議中相關的資料都在這兩個快取中建立。
sk_buff結構
資料報在應用層成為data,在tcp層成為segment,在ip層成為packet,在資料鏈路層成為frame。linux核心中sk_buff{}結構來存放陣列,在inet socket和它以下的層次中用來存放網路接收到或需要傳送的資料,因此它需要設計的有足夠擴充套件性。
sk_buff結構:
sk_buff.pkt_type是指該資料報的型別,定義如下:
為了使用套接字緩衝區,核心建立了兩個後備快取記憶體lookaside cache,他們分別是skbuff_head_cache和skbuff_fclone_cache,協議棧中所使用到的所有sk_buff結構都是從這兩個後備快取記憶體中分配出來的。兩者的區別在於skbuff_head_cache在建立時指定的單位記憶體區域的大小是sizeof(struct sk_buff),可以容納任意數目的struct sk_buff,而skbuff_fclone_cache在建立時指定的單位記憶體區域大小是2*sizeof(struct sk_buff)+sizeof(atomic_t),它的最小區域單位是一對struct sk_buff和乙個引用計數,這一對sk_buff是轉殖的,即它們指向同一資料緩衝區,引用計數值是0,1,或2,表示這一對中有幾個sk_buff已被呼叫。
建立乙個套接字緩衝區,最常用的操作是alloc_skb,它在skbuff_head_cache中建立乙個struct sk_buff,如果要在skbuff_fclone_cache中建立,可以呼叫__alloc_skb,通過特定引數進行。
再end後面還有乙個結構體struct skb_shared_info:
struct skb_shared_info ;
這個結構體存放分隔儲存的資料片段,將資料分解為多個資料片段是為了使用分散/聚集i/o。
記憶體管理函式
在sk_buff{}中4個指標data、head、tail、end初始化的時候,data,head,tail都是指向申請到資料區的頭部,end指向資料區的尾部。在以後的操作中,一般都是通過data和tail來獲得在sk_buff中可用的資料區的開始和結尾。而head和end就表示sk_buff中存在的資料報最大可擴充套件的空間範圍。
以下為網路協議棧的記憶體管理函式
TCP IP協議棧初始化
這已經是第六篇了。但協議棧的初始化還沒有說完。不得不承認協議棧還是很複雜的。越是牛b的東西,就越複雜。就像一門手藝一樣,當你可以做到別人都不能達到的複雜度的時候,你就是大師了。還有人說,想要精通一樣技術,你必須重複它10萬次以上。子曰 溫故而知新 看多了,就能明白其中的奧秘了。當然一些實踐還是必不可...
ZigBee協議棧初始化網路啟動流程
zigbee的基本流程 由協調器的組網 建立pan id 終端裝置和路由裝置發現網路以及加入網路。1.1 進入程式入口main zmain.c中 c code int main void main 1.2 給任務新增id sapi.c中 c code 1.3 初始化zigbee協議棧網路 c cod...
網路協議的初始化dev add pack
在資料報接收過程的那篇筆記中可以知道,在資料報的處理函式netif receive skb中,會先看ptype all中是否有註冊的協議,如果有,則呼叫相應的處理函式,然後再到ptype base中,找到合適的協議,將skb傳送到相關協議的處理函式.比如ip協議 ip rcv 或者arp arp r...