Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...
深夜睡不著,點(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle11 不更新记录,oracl
- 下一篇: linux 其他常用命令