Linux系統呼叫 ioctl

2022-08-22 00:18:11 字數 2090 閱讀 6560

ioctl 是裝置驅動程式中裝置控制介面函式,通過指定的命令來實現對應的操作。

驅動程式

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

在linux核心2.6.36以後版本中使用上面兩個函式取代了ioctl()。

協議cmd

第二個引數 cmd 為使用者與驅動的 「協議」,可以是任意 int 型資料,但是為了確保該 「協議」 的唯一性,ioctl 命令應該使用更科學嚴謹的方法賦值,在linux中,提供了一種 ioctl 命令的統一格式,將 32 位 int 型資料劃分為四個位段。

核心提供了巨集來生成ioctl命令:

#define _ioc(dir,type,nr,size) \

(((dir) << _ioc_dirshift) | \

((type) << _ioc_typeshift) | \

((nr) << _ioc_nrshift) | \

((size) << _ioc_sizeshift))

dir(direction,ioctl 命令訪問模式(資料傳輸方向),佔據 2 bit,可以為_ioc_none_ioc_read_ioc_write_ioc_read | _ioc_write,分別指示了四種訪問模式:無資料、讀資料、寫資料、讀寫資料;

type(device type),裝置型別,佔據 8 bit,又稱為 「幻數」 或者 「魔數」,可以為任意 char 型字元,例如『a』、』b』、』c』 等等,其主要作用是使 ioctl 命令有唯一的裝置標識;

nr(number),命令編號/序數,佔據 8 bit,可以為任意 unsigned char 型資料,取值範圍 0~255,如果定義了多個 ioctl 命令,通常從 0 開始編號遞增;

size,涉及到 ioctl 函式 第三個引數 arg ,佔據 13bit 或者 14bit(體系相關,arm 架構一般為 14 位),指定了 arg 的資料型別及長度;

通常,為了方便會使用巨集 _ioc() 衍生的介面來直接定義 ioctl 命令:

#define _io(type,nr)        _ioc(_ioc_none,(type),(nr),0)	//定義不帶引數的 ioctl 命令

#define _ior(type,nr,size) _ioc(_ioc_read,(type),(nr),(_ioc_typecheck(size))) //定義 帶寫引數的 ioctl 命令(copy_from_user)

#define _iow(type,nr,size) _ioc(_ioc_write,(type),(nr),(_ioc_typecheck(size))) //定義 帶讀引數的ioctl命令(copy_to_user)

#define _iowr(type,nr,size) _ioc(_ioc_read|_ioc_write,(type),(nr),(_ioc_typecheck(size))) //定義帶讀寫引數的 ioctl 命令

同時,核心還提供了反向解析ioctl命令的巨集介面:

#define _ioc_dir(nr)        (((nr) >> _ioc_dirshift) & _ioc_dirmask)

#define _ioc_type(nr) (((nr) >> _ioc_typeshift) & _ioc_typemask)

#define _ioc_nr(nr) (((nr) >> _ioc_nrshift) & _ioc_nrmask)

#define _ioc_size(nr) (((nr) >> _ioc_sizeshift) & _ioc_sizemask)

linux系統ioctl使用示例

linux系統ioctl使用示例 these were writed and collected by kf701,you can use and modify them but no warranty.contact with me kf 701 21cn.com 程式1 檢測介面的 inet a...

linux系統ioctl使用示例

程式4 include include include include include include include include include include define base value 257 int main int argc,char argv int mixer fd 0 c...

Linux系統中ioctl 用法

一 什麼是ioctl。ioctl是裝置驅動程式中對裝置的i o通道進行管理的函式。所謂對i o通道進行管理,就 是對裝置的一些特性進行控制,例如串列埠的傳輸波特率 馬達的轉速等等。它的呼叫個數 如下 int ioctl int fd,ind cmd,其中fd就是使用者程式開啟裝置時使用open函式返...