linux使用者態與核心態通訊及如何編寫核心模組

2021-08-20 14:03:54 字數 1346 閱讀 6199

通訊方式:procfs/socket/syscall/ioctl

常用的是socket/syscall/ioctl.

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

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

編寫核心模組:

編寫乙個核心模組首先要確保核心開啟了config_modules巨集,並且已經編譯了核心。

需要新增標頭檔案

編寫核心模組必須要實現乙個init方法和乙個exit方法。由於模組是可以在核心執行過程中動態的載入和解除安裝的,因此,在載入模組時要指定乙個init方法作為入口函式,同樣的,在解除安裝模組的時候,exit方法可以做一些清理工作。

乙個最簡單的核心模組的實現如下:

#include static int __init ***_init(void)  

static void __exit ***_exit(void)

module_init(***_init);

module_exit(***_exit);

編寫makefile

makefile

obj-m += testm.o
編譯

make -c /lib/modules/`uname -r`/build m=$pwd

安裝

make -c /lib/modules/`uname -r`/build m=$pwd modules_install

模組a中定義了函式funca(),在模組b中想使用這個函式,那麼在編寫模組a時,就要使用export_symbol巨集將funca()函式匯出。在模組a中**的寫法:

int funca(void)  

export_symbol(funca);

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資源等。為了使上...