日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...

發(fā)布時(shí)間:2024/4/13 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

深夜睡不著,點(diǎn)根煙起來寫點(diǎn)兒東西吧。

一個(gè)驅(qū)動(dòng)程序除了具備讀寫設(shè)備的能力之外,其也應(yīng)當(dāng)具有對硬件控制的能力。在Windows下用戶層代碼使用API函數(shù)DeviceIoControl,通過傳入驅(qū)動(dòng)句柄,驅(qū)動(dòng)控制碼,以及相應(yīng)的輸入輸出緩沖區(qū)等參數(shù)即可完成對驅(qū)動(dòng)程序的控制,并且Windows中這些參數(shù)都是相對獨(dú)立的,換句話說你可以完全自定義緩沖區(qū)的大小等信息,其緩沖區(qū)大小是一個(gè)DWORD類型的數(shù)據(jù),所表示的大小也是一個(gè)可觀的數(shù)值。而在Linux下,驅(qū)動(dòng)的控制通過ioctl來完成,而ioctl種的緩沖區(qū)信息卻不是獨(dú)立的。

應(yīng)用程序使用ioctl

/*

fd:文件描述符

cmd:控制命令

...:可選參數(shù):插入*argp,具體內(nèi)容依賴于cmd

*/

int ioctl(int fd,unsigned long cmd,...);

ioctl中,緩沖區(qū)的信息不是獨(dú)立的,其大小被整合到了相應(yīng)的cmd中。在Linux中一個(gè)是這樣子定義一個(gè)cmd命令的:

設(shè)備類型

序列號

數(shù)據(jù)方向

數(shù)據(jù)尺寸

8 bit

8 bit

2 bit

8~14 bit

可以看出,數(shù)據(jù)尺寸只占用了8~14Bit,其最大表示的范圍為2^14Byte,這個(gè)數(shù)值似乎有點(diǎn)兒小了。

Linux中提供了一些宏定義來協(xié)助定義命令:

//nr為序號,datatype為數(shù)據(jù)類型,如int

_IO(type, nr ) //沒有參數(shù)的命令

_IOR(type, nr, datatype) //從驅(qū)動(dòng)中讀數(shù)據(jù)

_IOW(type, nr, datatype) //寫數(shù)據(jù)到驅(qū)動(dòng)

_IOWR(type,nr, datatype) //雙向傳送

跟進(jìn)這些宏定義:

/* used to create numbers */

#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))

不難看出,這些宏定義都是基于_IOC這個(gè)宏定義,其中_IOC_TYPECHECK也就是 sizeof操作,也就是說如果我們使用了_IO、_IOR、_IOW、_IOWR這些宏去定義一個(gè)命令的時(shí)候,我們必須要要知道緩沖區(qū)的數(shù)據(jù)類型!然而情況下,應(yīng)用程序并不能事先知道緩沖區(qū)的實(shí)際大小,而這個(gè)時(shí)候只需要使用_IOC這個(gè)宏定義去創(chuàng)建我們的命令,并且動(dòng)態(tài)指定相關(guān)的大小即可。

自定義|動(dòng)態(tài)指定緩沖區(qū)的大小

根據(jù)上面的分析可以知道,只需要使用_IOC宏定義即可事先動(dòng)態(tài)緩沖區(qū)。

IOCTL使用大緩沖區(qū)的問題

上面的cmd組成表已經(jīng)很清晰的告訴我們,cmd中使用8~14Bit表示的緩沖區(qū)的大小,然而在某些情況下2^14Byte的緩沖區(qū)是不夠的,例如你讀取進(jìn)程鏈表的數(shù)據(jù),這時(shí)候緩沖區(qū)就不夠用了。

一般情況下,例如我們指定緩沖區(qū)大小為10,那么一般而言我們認(rèn)為緩沖區(qū)大小為10Byte,然而我們可不可以把10看做是10個(gè)int嗎?這當(dāng)然是可以的!這個(gè)時(shí)候我們只需要把10看做是一個(gè)數(shù)據(jù)類型的計(jì)數(shù),這時(shí)候10就不在是10個(gè)Byte了,她的尺寸就變成與只想對應(yīng)的數(shù)據(jù)類型有關(guān)了,例如看作是10個(gè)自定義的struct,那么這個(gè)10能夠表示的數(shù)據(jù)大小就很可觀了。

掃碼領(lǐng)個(gè)紅包作為打賞吧~~

(余額寶支付時(shí)可抵現(xiàn))

喜歡 (0)or分享 (0)

總結(jié)

以上是生活随笔為你收集整理的Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。