使用者態核心態通訊(二)

2021-07-02 08:09:02 字數 2740 閱讀 8400

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...