Linux核心空間和使用者空間傳遞資料

2021-06-05 15:21:35 字數 1312 閱讀 3091

通常情況下,應用程式通過核心介面訪問驅動程式,因此,驅動程式需要和應用程式交換資料。linux將儲存器分為「核心空間」和「使用者空間」。作業系統和驅動程式在核心空間執行,應用程式在使用者空間執行,兩者不能簡單地使用指標傳遞資料。因為linux系統使用了虛擬記憶體機制,使用者空間的記憶體可能被換出,當核心空間使用使用者空間指標時,對應的資料可能不在記憶體中。linux核心提供了多個函式和巨集用於核心空間和使用者空間傳遞資料。主要有:access_ok(),copy_to_user(),copy_from_user,put_user,get_user。

1.access_ok()

函式原型:int access_ok(int type,unsigned long addr,unsigned long size)

函式access_ok()用於檢查指定位址是否可以訪問。引數type為訪問方式,可以為verify_read(可讀),verify_write(可寫)。addr為要操作的位址,size為要操作的空間大小(以位元組計算)。函式返回1,表示可以訪問,0表示不可以訪問。

2.copy_to_user()和copy_from_user()

函式原型:unsigned long copy_to_user(void *to,const void *from,unsigned long len)

unsigned long copy_from_user(void *to,const void *from,unsigned long len)

這兩個函式用於核心空間與使用者空間的資料交換。copy_to_user()用於把資料從核心空間拷貝至使用者空間,copy_from_user()用於把資料從使用者空間拷貝至核心空間。第乙個引數to為目標位址,第二個引數from為源位址,第三個引數len為要拷貝的資料個數,以位元組計算。這兩個函式在內部呼叫access_ok()進行位址檢查。返回值為未能拷貝的位元組數。

3.get_user()和put_user()

函式原型:int get_user(x,p)

int put_user(x,p)

這是兩個巨集,用於乙個基本資料(1,2,4位元組)的拷貝。get_user()用於把資料從使用者空間拷貝至核心空間,put_user()用於把資料從核心空間拷貝至使用者空間。x為核心空間的資料,p為使用者空間的指標。這兩個巨集會呼叫access_ok()進行位址檢查。拷貝成功,返回0,否則返回-efault。

4.還有兩個函式__copy_to_user()和__copy_from_user(),功能與copy_to_user()和copy_from_user()相同,只是不進行位址檢查。還有兩個巨集__get_user()和__put_user(),功能與get_user()和put_user()相同,也不進行位址檢查。

Linux核心空間和使用者空間

在linux系統中存在程序的概念 程序的分類 使用者程序 執行在使用者空間的程序被稱為使用者程序 核心程序 執行在核心空間的程序被稱為核心程序 程序的空間 系統會為每乙個程序分0 4g的虛擬定址空間,在4g的空間中 0 3g 屬於使用者空間,用來執行使用者的相關程序 3 4g 屬於核心空間,用來執行...

使用者空間和核心空間

應用程式是從頭到尾執行單個任務。模組只是預先註冊自己以便服務於將來的某個請求,模組初始化函式的任務就是為以後呼叫模組函式預先做準備,就像模組說 我在這,並且我能做這些工作。模組的退出函式將在模組被解除安裝前呼叫,他告訴核心 我要離開了,不要再讓我做任何事了。應用程式在退出時,可以不管資源的釋放或其他...

linux核心空間與使用者空間

核心空間和使用者空間是作業系統理論的基礎之一,即核心功能模組執行在核心空間,而應用程式執行在使用者空間。現代的cpu都具有不同的操作模式,代表不同的級別,不同的級別具有不同的功能,在較低的級別中將禁止某些操作。linux系統設計時利用了這種硬體特性,使用了兩個級別,最高端別和最低級別,核心執行在最高...