Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...
深夜睡不著,點根煙起來寫點兒東西吧。
一個驅動程序除了具備讀寫設備的能力之外,其也應當具有對硬件控制的能力。在Windows下用戶層代碼使用API函數DeviceIoControl,通過傳入驅動句柄,驅動控制碼,以及相應的輸入輸出緩沖區等參數即可完成對驅動程序的控制,并且Windows中這些參數都是相對獨立的,換句話說你可以完全自定義緩沖區的大小等信息,其緩沖區大小是一個DWORD類型的數據,所表示的大小也是一個可觀的數值。而在Linux下,驅動的控制通過ioctl來完成,而ioctl種的緩沖區信息卻不是獨立的。
應用程序使用ioctl
/*
fd:文件描述符
cmd:控制命令
...:可選參數:插入*argp,具體內容依賴于cmd
*/
int ioctl(int fd,unsigned long cmd,...);
ioctl中,緩沖區的信息不是獨立的,其大小被整合到了相應的cmd中。在Linux中一個是這樣子定義一個cmd命令的:
設備類型
序列號
數據方向
數據尺寸
8 bit
8 bit
2 bit
8~14 bit
可以看出,數據尺寸只占用了8~14Bit,其最大表示的范圍為2^14Byte,這個數值似乎有點兒小了。
Linux中提供了一些宏定義來協助定義命令:
//nr為序號,datatype為數據類型,如int
_IO(type, nr ) //沒有參數的命令
_IOR(type, nr, datatype) //從驅動中讀數據
_IOW(type, nr, datatype) //寫數據到驅動
_IOWR(type,nr, datatype) //雙向傳送
跟進這些宏定義:
/* 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這個宏定義,其中_IOC_TYPECHECK也就是 sizeof操作,也就是說如果我們使用了_IO、_IOR、_IOW、_IOWR這些宏去定義一個命令的時候,我們必須要要知道緩沖區的數據類型!然而情況下,應用程序并不能事先知道緩沖區的實際大小,而這個時候只需要使用_IOC這個宏定義去創建我們的命令,并且動態指定相關的大小即可。
自定義|動態指定緩沖區的大小
根據上面的分析可以知道,只需要使用_IOC宏定義即可事先動態緩沖區。
IOCTL使用大緩沖區的問題
上面的cmd組成表已經很清晰的告訴我們,cmd中使用8~14Bit表示的緩沖區的大小,然而在某些情況下2^14Byte的緩沖區是不夠的,例如你讀取進程鏈表的數據,這時候緩沖區就不夠用了。
一般情況下,例如我們指定緩沖區大小為10,那么一般而言我們認為緩沖區大小為10Byte,然而我們可不可以把10看做是10個int嗎?這當然是可以的!這個時候我們只需要把10看做是一個數據類型的計數,這時候10就不在是10個Byte了,她的尺寸就變成與只想對應的數據類型有關了,例如看作是10個自定義的struct,那么這個10能夠表示的數據大小就很可觀了。
掃碼領個紅包作為打賞吧~~
(余額寶支付時可抵現)
賞
喜歡 (0)or分享 (0)
總結
以上是生活随笔為你收集整理的Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: oracle11 不更新记录,oracl
 - 下一篇: linux敏感目录文件,Windows系