核心態和使用者態通訊 一 認識

2021-08-14 20:23:05 字數 1254 閱讀 4639

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處於使用者態,只能通過中斷的方式進入核心態。一般程式一開始都是執行於使用者態,當程式需要使用系統資源時,就必須通過呼叫軟中斷進入核心態。當乙個任務 程序 執行系統呼叫而陷入核心...