linux 裝置驅動之IOCTRL

2021-06-27 20:41:33 字數 1901 閱讀 1479

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結構,初始化...