Linux核心開發函數詳解__Oracle
來源:互聯網
上載者:User
MKDEV 功能 將主、次裝置號轉換成dev_t類型 主裝置號 major 次裝置號 minor
標頭檔
定義在<linux/cdev.h>中的宏
MKDEV(int major,int minor)
宏定義
#define MKDEV(major,minor) (((major) << MINORBITS) | (minor))
參數
major為主裝置號
minor為次裝置號
傳回值
成功執行返回dev_t類型的裝置編號
註解:
1 Linux裝置號
主裝置號用來表示一個特定的驅動程式。次裝置號用來表示使用該驅動程式的各
裝置。例如一個嵌入式系統,有兩個LED指示燈,LED燈需要獨立的開啟或者關閉。那麼
,可以寫一個LED燈的字元裝置驅動程式,可以將其主裝置號註冊成5號裝置,次裝置號
分別為1和2。這裡,次裝置號就分別表示兩個LED燈。
主裝置號相同的設 備是同類裝置(使用同一個驅動程式)。
有些裝置是對實際存在的物理硬體的抽象,有些裝置則是核心自身提供的功能(不依賴於特定的物理硬體,又稱為"虛擬設備")。
每個裝置在 /dev 目錄下都有一個對應的檔案(節點)。
可以通過 cat /proc/devices 命令查看當前已經載入的裝置驅動程式的主裝置號。
核心能夠識別的所有裝置都記錄在源碼樹下的 documentation/devices.txt 檔案中。
在 /dev 目錄下除了字元裝置和塊裝置節點之外還通常還會存在:fifo管道、socket、軟/硬串連、目錄。這些東西沒有主/次裝置號。
copy_to_user 作用:從核心區中讀取資料到使用者區
簡述:
#include <linux/uaccess.h>
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);
如果資料拷貝成功,則返回零;否則,返回沒有拷貝成功的資料位元組數。
*to是使用者空間的指標,
*from是核心空間指標,
n表示從核心空間向使用者空間拷貝資料的位元組數
註解:
1 __user宏
__user宏簡單告訴編譯器(通過 noderef)不應該解除這個指標的引用(因為在當前地址空間中它是沒有意義的)。
(void __user *)arg 指的是arg值是一個使用者空間的地址,不能直接進行拷貝等,要使用例如copy_from_user,copy_to_user等函數。
預設是核心空間,因為這是驅動,是在核心空間啟動並執行。