linux中的程序間的通訊機制源自於unix平台上的程序通訊機制。unix的兩大分支at&t unix和bsd unix在程序通訊實現機制上的各有所不同,前者形成了執行在單個計算機上的system v ipc,後者則實現了基於socket的程序間通訊機制。同時linux也遵循ieee制定的posix ipc標準,在三者的基礎上實現以下幾種主要的ipc機制:管道(pipe)和命名管道(name pipe),訊號(signal),訊息佇列(message queue),共享記憶體(shared memory),訊號量(semaphore),套接字(socket)。通過這些ipc機制,使用者空間程序之間可以完成互相通訊。而為了完成核心空間和使用者空間之間的通訊,linux提供了基於socket的netlink通訊機制,可以實現核心與使用者空間資料的及時交換。
linux作業系統中當cpu處於核心狀態時,可以分為有使用者上下文的狀態和執行硬體、軟體中斷兩種。其中當處於有使用者上下文時,由於核心態和使用者態的記憶體對映機制不同,不可直接將本地變數傳給使用者態的記憶體區;處於硬體、軟體中斷時,無法直接向使用者記憶體去傳遞資料,**執行不可中斷。
他們都無法直接在核心態和使用者態之間使用,原因如下:
目前linux提供了
解決核心態和使用者態通訊機制
處於有使用者上下文時,可以使用linux提供的copy_to_user()和copy_from_user()函式完成,但由於這兩個函式可能阻塞,因此不能在硬體、軟體中斷的過程中使用。
linux將記憶體空間分為兩部分,將最高位元組的一部分,供核心使用,稱為「核心空間」,而較低位元組的一部分,則為「使用者空間」
處理器狀態:
a. 核心態,執行於程序上下文,核心代表程序執行於核心空間;
b. 核心態,執行於中斷上下文,包括硬中斷和軟中斷;
c. 使用者態,執行於使用者空間安。
核心態環境
進入核心態的方式
侷限性說明
程序上下文
在程序中通過系統呼叫進入核心態,核心態**與該程序相關
核心空間和程序空間的虛擬位址不同,不能直接傳遞資訊
該程序的頁表基位址依然在頁表基位址暫存器(如x86中的cr3)中,核心空間中可以使用__user強制使用使用者空間的位址,從而進行資料互動
中斷上下文
硬體觸發中斷,或核心中掛接軟中斷。不與特定的程序相關
a.核心空間和程序空間的虛擬位址不同,不能直接傳遞資訊;b.中斷中不能睡眠,不能執行引起阻塞的函式
由於中斷觸發的隨機性,中斷上下文核心態不與特定的經常相關
處於硬、軟體中斷時,主要分為兩類:
Linux使用者態和核心態通訊
linux環境下使用者態和核心態通訊機制主要有 ioctl procfs和netlink,下面分別對各種實現進行簡要分析。1 ioctl 在核心態建立裝置檔案,並提供read write和ioctl等操作介面,1 核心態部分 define dev name usr static struct cde...
使用者態核心態通訊(二)
netfilter與使用者空間通訊二法 宣告 此文章只是 陳鑫在linux 系統核心空間與使用者空間通訊的實現與分析 的筆記,結合自己在一些開源專案看到的體會,僅此而已。原理性的東西都在 陳鑫 1先說明一下環境。linux 核心 的執行環境有三種 使用者上下文環境 硬中斷環境和軟中斷環境。但三種環境...
核心態和使用者態
在核心態下,cpu可執行任何指令,在使用者態下cpu只能執行非特權指令。當cpu處於核心態,可以隨意進入使用者態 而當cpu處於使用者態,只能通過中斷的方式進入核心態。一般程式一開始都是執行於使用者態,當程式需要使用系統資源時,就必須通過呼叫軟中斷進入核心態。當乙個任務 程序 執行系統呼叫而陷入核心...