linux 裝置驅動之ioctrl
1,where come from?
ioctrl(或者說unlocked_ioctl/compat_ioctl)是file_operations結構體的函式指標
struct file_operations ;
2,who am i
在使用者空間,ioctl是乙個系統呼叫, 作用於乙個檔案描述符; 它接收乙個確定要進行的
命令的數字和(可選地)另乙個引數, 常常是乙個指標.這些
命令可以核心空間和使用者空間之間進行資料互動。這些命令可以從驅動拷貝相關的資料結構到使用者空間。
3,所謂的命令(cmd)是什麼?
在kernel層,對於乙個32bit的系統,分成了4個域,分段如下@include/uapi/asm-generic/ioctl.h
2bits(讀寫區)_ioc_dirbits
14bits(資料大小區)_ioc_sizebits
8bits(magic)_ioc_typebits
8bits(命令序號)_ioc_nrbits
31 30
/ 29 28 ... 17 16
/ 15 14 ... 9 8
/ 7 6 ... 1 0
所謂的magic區,無非就是不同驅動使用乙個字母來標識。比如ldd3,
#define scull_ioc_magic '
k'#define scull_iocsquantum _iow(scull_ioc_magic, 1, int)
4,為什麼不使用「粗暴」的,乙個unsigned int值來代替乙個cmd?
我認為,使用乙個32bit的不同位來表示乙個cmd,能包含更多的資訊,節省了記憶體
5,如何使用?
5.1,在應用層和kernel使用同乙個cmd定義的h檔案,來使用cmd
'i',20,sizeof(short))
'i',20,sizeof(short))
5.2,
在應用層呼叫這個命令,device_fd為對應的裝置檔案
val = (i<<16) | repeat_key_map[i];
val);
在kernel層,將會做相應的處理
先把&val傳進來的值copy_from_user,然後使用這個val值
static long remote_config_ioctl(struct file *filp, unsigned int
cmd, unsigned long
args)
6,另外:ioctl相關的巨集,讀ioctl.h就知道了。
#define _io(type,nr) _ioc(_ioc_none,(type),(nr),0)
#define _ior(type,nr,size) _ioc(_ioc_read,(type),(nr),(_ioc_typecheck(size)))
#define _iow(type,nr,size) _ioc(_ioc_write,(type),(nr),(_ioc_typecheck(size)))
#define _iowr(type,nr,size) _ioc(_ioc_read|_ioc_write,(type),(nr),(_ioc_typecheck(size)))
#define _ior_bad(type,nr,size) _ioc(_ioc_read,(type),(nr),sizeof(size))
#define _iow_bad(type,nr,size) _ioc(_ioc_write,(type),(nr),sizeof(size))
#define _iowr_bad(type,nr,size) _ioc(_ioc_read|_ioc_write,(type),(nr),sizeof(size))
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...
linux驅動之塊裝置驅動
塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...