Linux核心態與使用者態通訊的常用方法

2021-07-12 01:02:28 字數 1609 閱讀 3315

最近做的事情很多地方用到linux驅動層與應用層的通訊,在此總結下常見的並且在我工作中用到的通訊方法。

由於每種方法都可以找到大量的示例**,同時還有詳細的函式手冊,我就不貼**了。只列下相關的方法和乙個鏈結。

syscall的範圍就廣了,通過註冊字元裝置可以使用mmap和ioctl等來進行操作,要注意的是在核心態ioctl已經被廢棄,現在應該使用unlocked_ioctl,需要自己來加鎖。

使用者態通過系統暴露出來的系統呼叫來進行操作,如mmap,ioctl,open,close,read,write,核心態通過建立共享記憶體remap_pfn_range或者copy_to_user, copy_from_user來進行操作。

選擇哪種方式需要考慮是使用者態單程序與核心態通訊還是多程序的通訊,還要考慮通訊的資料量。根據不同的需求來使用不同的方法。

procfs

/proc目錄是系統模擬出來的乙個檔案系統,本身並不存在於磁碟上,其中的檔案都表示核心引數的資訊,這些資訊分兩類,一類是可都可寫的,這類引數都在「/proc/sys」目錄下,另一類是唯讀的,就是「/proc/sys」目錄之外的其他目錄和檔案,當然這只是一種慣例,實際在其他目錄下建立可讀寫的/proc檔案也是可以的。

/proc檔案系統是乙個特殊的軟體建立的檔案系統, 核心用來輸出訊息到外界. /proc 下的每個檔案都綁到乙個核心函式上, 當檔案被讀的時候即時產生檔案內容. 我們已經見到一些這樣的檔案起作用; 例如, /proc/modules, 常常返回當前已載入的模組列表.

/proc 在 linux 系統中非常多地應用. 很多現代 linux 發布中的工具, 例如 ps, top, 以及 uptime, 從 /proc 中獲取它們的資訊. 一些裝置驅動也通過 /proc 輸出資訊.

在 /proc 下新增檔案是不鼓勵的. /proc 檔案系統在核心開發者看作是有點無法控制的混亂, 它已經遠離它的本來目的了(是提供關於系統中執行的程序的資訊). 建議新**中使資訊可獲取的方法是利用 sysfs. 如同建議的, 使用 sysfs 需要對 linux 裝置模型的理解.

核心和使用者空間進行通訊,大概有如下幾種方式可以考慮:

採用記憶體對映的方式,將核心位址對映到使用者態。這種方式最直接,可以適用大量的資料傳輸機制。這種方式的缺點是很難進行「業務控制」,沒有一種可靠的機制保障核心和使用者態的調動同步,比如訊號量等都不能跨核心、使用者層使用。因此記憶體對映機制一般需要配合一種「訊息機制」來控制資料的讀取,比如採用「訊息」型別的短資料通道來完成乙個可靠的資料讀取功能。

ioctl機制,ioctl機制可以在驅動中擴充套件特定的ioctl訊息,用於將一些狀態從核心反應到使用者態。ioctl有很好的資料同步保護機制,不要擔心核心和使用者層的資料訪問衝突,但是ioctl不適合傳輸大量的資料,通過和記憶體對映結合可以很好的完成大量資料交換過程。但是,ioctl的發起方一定是在使用者態,因此如果需要核心態主動發起乙個通知訊息給使用者層,則非常的麻煩。可能需要使用者態程式採用輪詢機制不停的ioctl。

其他一些方式比如系統呼叫必須通過使用者態發起,proc方式不太可靠和實時,用於除錯資訊的輸出還是非常合適的。

通過前面的專案背景,我需要一種可以在核心態主動發起訊息的通知方式,而使用者態的程式最好可以採用一種「阻塞呼叫」的方式等待訊息。這樣的模型可以最大限度的節省cpu的排程,同時可以滿足及時處理的要求,最終選擇了netlink完成通訊的過程。

Linux使用者態和核心態通訊

linux環境下使用者態和核心態通訊機制主要有 ioctl procfs和netlink,下面分別對各種實現進行簡要分析。1 ioctl 在核心態建立裝置檔案,並提供read write和ioctl等操作介面,1 核心態部分 define dev name usr static struct cde...

Linux 核心態與使用者態

使用者態 ring3 執行於使用者態的 則要受到處理器的諸多檢查,它們只能訪問對映其位址空間的頁表項中規定的在使用者態下可訪問頁面的虛擬位址,且只能對任務狀態段 tss 中i o 許可位圖 i o permission bitmap 中規定的可訪問埠進行直接訪問 核心態 ring0 在處理器的儲存保...

Linux核心態與使用者態

如上圖所示,從巨集觀上來看,linux作業系統的體系架構分為使用者態和核心態 或者使用者空間和核心 核心從本質上看是一種軟體 控制計算機的硬體資源,並提供上層應用程式執行的環境。使用者態即上層應用程式的活動空間,應用程式的執行必須依託於核心提供的資源,包括cpu資源 儲存資源 i o資源等。為了使上...