天天看點

Linux核心協定棧-初始化流程分析

本文主要針對linux-3.19.3版本的核心簡單分析核心協定棧初始化涉及到的主要步驟和關鍵函數,不針對協定的解析以及資料包的處理流程做具體分析,後續有機會再詳細分析

1.準備

linux核心協定棧本身建構在虛拟檔案系統之上,是以對linux vfs不太了解的可以參考核心源碼根目錄下documentation/filesystems/vfs.txt,另外,socket接口層,協定層,裝置層的許多資料結構涉及到記憶體管理,是以對基本虛拟記憶體管理,slab緩存,頁高速緩存不太了解的也可以查閱相關文檔。

源碼涉及的主要檔案位于net/socket.c,net/core,include/linux/net*

2.開始

開始分析前,這裡有些小技巧可以快速定位到主要的初始化函數,在分析其他子系統源碼時也可以采用這個技巧

Linux核心協定棧-初始化流程分析
Linux核心協定棧-初始化流程分析

這裡*__initcall宏是設定初始化函數位于核心代碼段.initcall#id.init的位置其中id代表優先級level,小的一般初始化靠前,定義在include/linux/init.h,使用gcc的attribute擴充。而各個level的初始化函數的調用流程基本如下:

Linux核心協定棧-初始化流程分析

3.詳細分析

可以看到pure_initcall(net_ns_init)位于0的初始化level,基本不依賴其他的初始化子系統,是以從這個開始

下面分析core_init(sock_init):

進入core_init(sock_init):

core_init(net_inuse_init)

core_init(netpoll_init)

Linux核心協定棧-初始化流程分析

subsys_initcall(proto_init)

subsys_initcall(net_dev_init)

fs_initcall(sysctl_core_init)

Linux核心協定棧-初始化流程分析

4.總結

本文主要按照關于核心協定棧的各個子系統的*_initcall的調用順序分析了幾個核心的初始化步驟,包括socket層,協定層,裝置層等,整個初始化過程還是比較簡單的,主要涉及一些資料結構和緩存等的初始化,但是整個核心協定棧的對資料包的處理流程并不能很好地呈現,後續有機會再分析從系統調用開始整個資料包的收發流程。

ref: linux 3.19.3 source tree

繼續閱讀