netfilter與使用者空間通訊二法
宣告:此文章只是
陳鑫在linux 系統核心空間與使用者空間通訊的實現與分析
的筆記,結合自己在一些開源專案看到的體會,僅此而已。原理性的東西都在
陳鑫
1先說明一下環境。linux 核心**的執行環境有三種:使用者上下文環境、硬中斷環境和軟中斷環境。但三種環境的侷限性分兩種,因為軟中斷環境只是硬中斷環境的延續。
核心態環境
介紹侷限性
使用者上下文
核心態**的執行與一使用者空間程序相關,如系統呼叫中**的執行環境。
不可直接將本地變數傳遞給使用者態的記憶體區,因為核心態和使用者態的記憶體對映機制不同。
硬中斷和軟中斷環境
硬中斷或軟中斷過程中**的執行環境,如 ip 資料報的接收**的執行環境,網路裝置的驅動程式等。
不可直接向使用者態記憶體區傳遞資料;
**在執行過程中不可阻塞。
2傳統程序間通訊的侷限性。
linux 傳統的程序間通訊有很多,如各類管道、訊息佇列、記憶體共享、訊號量等等。但它們都無法介於核心態與使用者態使用,原因如表:
通訊方法
無法介於核心態與使用者態的原因
管道(不包括命名管道)
侷限於父子程序間的通訊。
訊息佇列
在硬、軟中斷中無法無阻塞地接收資料。
訊號量無法介於核心態和使用者態使用。
記憶體共享
需要訊號量輔助,而訊號量又無法使用。
套接字在硬、軟中斷中無法無阻塞地接收資料。
3解決辦法。linux核心態與使用者態程序通訊方法的提出與實現。分為
使用者上下文環境、硬中斷和軟中斷環境兩種情況。
3.1
使用者上下文環境
執行在使用者上下文環境中的**是可以阻塞的,這樣,便可以使用訊息佇列和 unix 域套接字來實現核心態與使用者態的通訊。但這些方法的資料傳輸效率較低,linux 核心提供 copy_from_user()/copy_to_user() 函式來實現核心態與使用者態資料的拷貝,但這兩個函式會引發阻塞,所以不能用在硬、軟中斷中。一般將這兩個特殊拷貝函式用在類似於系統呼叫一類的函式中,此 類函式在使用中往往"穿梭"於核心態與使用者態。
3.2
硬、軟中斷環境
比起使用者上下文環境,硬中斷和軟中斷環境與使用者態程序無絲毫關係,而且執行過程不能阻塞。在 linux 2.4 版以後版本的核心中,幾乎全部的中斷過程與使用者態程序的通訊都是使用 netlink 套接字實現的,netlink 套接字的最大特點是對中斷過程的支援,同時還使用 netlink 實現了 ip queue 工具,但 ip queue 的使用有其侷限性,不能自由地用於各種中斷過程。還有重要的一點:netlink 套接字是不用經過tcp/ip協議棧處理的,效率方面沒的說。贊。說
了這麼多,都是別人的東西。但是磨刀不誤砍柴工,沒有前面的知識鋪墊,只怕你對怎麼樣,為什麼這樣用也是一知半解,這可是工程技術人員的大忌。
4
netfilter與使用者空間通訊二法
netfilter的五個鉤子在核心tcp/ip協議棧的作用和布局,我就不廢話了。
楊沙洲的
linux netfilter實現機制和擴充套件技術
還不錯滴。
法1:nf_sockopt_ops通訊方式
此法在核心模組中註冊nf_register_sockopt乙個
nf_sockopt_ops結構體。比如:
[cpp]view plain
copy
static
struct
nf_sockopt_ops nso = ;
其中命令字不能和核心已有的重複,宜大不宜小。命令字很重要,是用來做識別符號的。set/get處理函式是直接由使用者空間的
set/getsockopt函式呼叫的。
setsockopt函式向核心寫資料,用getsockopt向核心讀資料。
從上圖可以看到,其實此法的本質,就是使用 copy_from_user()/copy_to_user()完成核心和使用者的通訊的,
效率其實不高,
多用在傳遞控制
選項資訊,不適合做大量的資料傳輸。
法2:netlink套接字
上圖總結:
法一:多用在使用者上下文環境,適合做控制選項,傳遞少量的控制資訊。
法二:多用在
硬、軟中斷環境,也就是處理
網路資料報的接收等,適合大量處理資料的傳輸。我用它粗略實現過類似
ethereal的功能,層層吧ip分組剝開。
二者使用環境不一樣,使用目的不一樣,完全可以在一起發揮更大的作用。
使用者態 核心態
前戲 我們知道計算機主要分為三部分,硬體,作業系統和應用程式,然後硬體的頭腦cpu才是控制核心態和使用者態的大佬 作業系統 作業系統是直接和硬體打交道的,作業系統在核心態下執行,從而可以訪問整個硬體 應用程式 應用程式直接和使用者互動,但是應用程式不能直接操作硬體,應用程式在使用者態下執行,但是有時...
Linux使用者態和核心態通訊
linux環境下使用者態和核心態通訊機制主要有 ioctl procfs和netlink,下面分別對各種實現進行簡要分析。1 ioctl 在核心態建立裝置檔案,並提供read write和ioctl等操作介面,1 核心態部分 define dev name usr static struct cde...
核心態和使用者態通訊 一 認識
linux中的程序間的通訊機制源自於unix平台上的程序通訊機制。unix的兩大分支at t unix和bsd unix在程序通訊實現機制上的各有所不同,前者形成了執行在單個計算機上的system v ipc,後者則實現了基於socket的程序間通訊機制。同時linux也遵循ieee制定的posix...