ioctl裝置控制 筆記

2021-06-06 12:56:22 字數 2463 閱讀 5787

使用者層:

原型:int ioctl(int fd, unsigned long cmd, ...)

說明:其中原點表示可選引數,存在與否依賴於控制命令(第二個引數)是否涉及到與裝置的資料互動;

驅動層:

原型:int

說明:cmd引數是從使用者層傳下來,可選引數arg以乙個unsigned long 的形式傳遞(為乙個整數或為一

個指標),如果cmd命令不涉及資料傳輸,則arg無任何意義;

用法步驟:

1、定義命令

ioctl命令編碼劃分為幾個階段,在include/asm/ioctl.h中定義:型別(幻數)、序號、傳遞方向、引數

的大小。在documention/ioctl-number.txt中羅列了在核心中已經使用的幻數。

其中:type:幻數(型別):表明哪個裝置的命令,8位寬;

number:序號:表面裝置命令中的第幾個,8位寬;

direction:資料傳遞的方向:常見的巨集定義有:_ioc_none(沒有資料傳送),_ioc_read(從裝置

讀),_ioc_write(從裝置寫),資料傳送是從應用層的觀點來看待;

size:使用者資料的大小。(13/14位寬,視處理器而定)

_io(type, nr)    //沒有引數的命令

_ior(type, nr, datatype)     //從驅動中讀資料

_iow(type, nr, datatype)     //寫資料到驅動

_iowr(type, nr, datatype)     //雙向傳輸,type和number成員作為引數被傳遞

定義命令範例:

#define mem_ioc_magic     'm'

#define mem_iocset    _iow(mem_ioc_magic, 0, int)

#define mem_iocgqset    _iow(mem_ioc_magic, 1, int)

2、實現ioctl

包括三個環節:1、返回值  2,引數使用   3命令操作

注:當命令號不能匹配任何乙個裝置所支援的命令時,通常返回-einval (非法引數)

引數檢查:

如果是乙個整數,可以直接使用,如果是指標,首先得確保使用者位址的有效性;

不需要檢測的有:

copy_form_user, copy_to_user, get_user, put_user;

需要檢測的有:__get_user, __put_user;

引數檢查方法(函式):

原型:int access_ok(int type, const void *addr, unsigned long size)

其中:第乙個引數是verify_read 還是 verify_write, 用來表明是讀使用者記憶體還是寫使用者記憶體。addr

引數是要操作的使用者記憶體位址,size是操作的長度。如果ioctl需要從使用者空間讀乙個整數,則size參

等於sizeof(int)。

access_ok返回乙個布林值,1 是成功(訪問都沒問題), 0 是失敗(訪問有問題), 如果該函式返回失

敗,則返回-efault;

引數檢查範例:

if(_ioc_dir(cmd) & _ioc_read)

err = !access_ok(verify_write, (void __user*)arg, _ioc_size(cmd));

else if(_ioc_dir(cmd) & _ioc_write)

err = !access_ok(verify_wread, (void __user*)arg, _ioc_size(cmd));

if(err)

return -efault;

範例:使用者層:

cmd = memdev_iocprint;

if (ioctl(fd, cmd, &arg) < 0)

/* 呼叫命令memdev_iocsetdata */

printf("<--- call memdev_iocsetdata --->\n");

cmd = memdev_iocsetdata;

arg = 2007;

if (ioctl(fd, cmd, &arg) < 0)

/* 呼叫命令memdev_iocgetdata */

printf("<--- call memdev_iocgetdata --->\n");

cmd = memdev_iocgetdata;

if (ioctl(fd, cmd, &arg) < 0)

驅動層:

int memdev_ioctl(struct inode *inode, struct file *filp,

unsigned int cmd, unsigned long arg)

return ret;

}

裝置控制介面(ioctl 函式)

int ioctl struct inode struct file unsigned int,unsigned long 這是驅動程式裝置控制介面函式 ioctl函式 的核心原型定義,struct inode 和 struct file 描述了操作的檔案,unsigned int 描述了ioctl...

裝置控制介面ioctl詳解

int ioctl struct inode struct file unsigned int,unsigned long 這是驅動程式裝置控制介面函式 ioctl函式 的核心原型定義,struct inode 和struct file 描述了操作的檔案,unsigned int 描述了ioctl命...

裝置驅動程式學習筆記 4 裝置控制ioctl方法

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 linux 裝置驅動程式 第六章。2.參考俞永昌的 裝置驅動開發技術及應用 以及 documentation ioctl number.txt 和include asm ioctl.h 兩個檔案。3.裝置控制 io...