12 linux驅動 核心空間使用者空間資料傳遞

2021-10-07 07:39:37 字數 1361 閱讀 6296

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()相同,也不進行位址檢查。

12 linux網路程式設計概述

linux網路優勢 linux為使用者提供了完善的,強大的網路功能。1 完善的內建網路。2 linux免費提供了大量支援internet的軟體,internet是在unix領域中建立並且繁榮的。3 使用者能通過一些linux命令完成內部資訊或檔案的傳輸。4 遠端訪問。5 安全可靠。網路層協議。主要包...

1 2 Linux環境安裝Perl

linux 開發環境 執行環境 需要安裝perl 系統自帶 vim centos搭建 安裝vim root vm1 bin yun install y vim 公升級perl版本 系統安裝後,檢視centos自帶的perl 解除安裝自帶的perl root vm1 perl 5.30.1 confi...

1 2 Linux基本命令

切皆命令 切皆檔案 注意 命令與命令直接要用空格隔開 shell命令 用來代替滑鼠和鍵盤來控制linux 比如我們可以開啟 刪除檔案 查詢 關機 我們知道linux的目錄結構為樹狀結構,最頂級的目錄為根目錄 其他目錄通過掛載可以將它們新增到樹中,通過解除掛載可以移除它們。絕對路徑 路徑的寫法,由根目...