資源描述:
《linux內(nèi)核ioctl網(wǎng)絡控制框架實現(xiàn)分析》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、linux內(nèi)核IOCTL網(wǎng)絡控制框架實現(xiàn)分析目錄一、概述.二、用戶空間ioctl控制函數(shù)調(diào)用形式.三、內(nèi)核主要函數(shù)調(diào)用框架四、IOCTL框架源代碼分析4.1、入口函數(shù):sys_ioctl4.2、入口函數(shù)跳轉(zhuǎn)4.3、sock_ioctl函數(shù)4.4、二次跳轉(zhuǎn)4.5、structproto_ops結(jié)構(gòu)實例.4.6、inet_ioctl函數(shù)4.7、網(wǎng)絡主要結(jié)構(gòu)相關字段相互引用圖.五、調(diào)用實踐1.編寫運行于用戶空間的控制程序2.內(nèi)核功能支持2.1、修改內(nèi)核相關代碼2.2、編譯內(nèi)核3.運行控制程序4.查看結(jié)果六、結(jié)
2、束語七、參考資料一、概述從ioctl這個名稱上看,它是設備驅(qū)動程序中對設備的I/O通道進行管理的函數(shù)。所謂對I/O通道進行管理,就是對設備的一些特性進行控制,例如串口的傳輸波特率、馬達的轉(zhuǎn)速等等,但實際上ioctl所處理的對象并不限制是真正的I/O設備,還可以是其它任何一個內(nèi)核設備.ioctl以系統(tǒng)調(diào)用的形式提供了一條用戶與內(nèi)核交互的便捷途徑。當前一些寬帶計費網(wǎng)關、防火墻系統(tǒng)均利用Ioctl與內(nèi)核良好的通信互動特點支持用戶對基于內(nèi)核模塊的軟件系統(tǒng)的控制.本文針對i386平臺下的ioctl內(nèi)核網(wǎng)絡源代碼控
3、制框架進行剖析解釋,在文章最后列舉一個實例,通過編程實踐展示如何通過ioctl控制函數(shù)實現(xiàn)自定義的功能的控制,使讀者可以對ioctl實現(xiàn)原理有一個全面的認識,本文只對ioctl實現(xiàn)流程框架做一定的敘述,并不會深入到具體的控制函數(shù)。為了更好的閱讀本文,要求讀者對Linux下的網(wǎng)絡編程有一定的了解。本文約定:1、以下內(nèi)容如果沒有特殊說明,均參照linux內(nèi)核2.4.0版本2、“->”箭頭符表示函數(shù)調(diào)用關系,如sys_socket->sock_map_fd表示sys_socket函數(shù)調(diào)用的sock_map_f
4、d函數(shù)。3、第五節(jié)的實踐是在redhat9上實現(xiàn),基于2.4.20內(nèi)核,但本文所述在2.4內(nèi)核下都適用。二、用戶空間ioctl控制函數(shù)調(diào)用形式通過man2ioctl命令查看ioctl函數(shù)的調(diào)用形式類似如下:#includeintioctl(intd,intrequest,...);其中d就是用戶程序打開設備時使用open函數(shù)返回的文件描述符,request就是用戶程序?qū)υO備的控制命令,至于后面的省略號,則是一些補充參數(shù),一般最多一個,有或沒有是和request的意義相關的,詳情
5、請參考man2ioctl_list以了解更多。ioctl函數(shù)是文件結(jié)構(gòu)中的一個屬性分量,就是說如果驅(qū)動程序提供了對ioctl的支持,用戶就可以在用戶程序中使用ioctl函數(shù)控制設備的I/O通道或其它一些自己想要控制且設備支持的功能。三、內(nèi)核主要函數(shù)調(diào)用框架內(nèi)核實現(xiàn)ioctl()函數(shù)的是sys_ioctl(),在內(nèi)核中主要調(diào)用框架圖如下,它清晰地給我們展示ioctl的控制傳遞框架,我們接下來的內(nèi)容將根據(jù)此圖向大家做詳細的解釋:四、IOCTL框架源代碼分析根據(jù)前面的圖示,我們從入口函數(shù)sys_ioctl開始
6、分析:4.1、入口函數(shù):sys_ioctl以下源碼在fs/ioctl.c中,其中刪除了部分與網(wǎng)絡控制關系不大的代碼:asmlinkagelongsys_ioctl(unsignedintfd,unsignedintcmd,unsignedlongarg){…//根據(jù)fd獲取文件結(jié)構(gòu)(structfile)lock_kernel();switch(cmd){caseFIOCLEX://對文件設置專用標志,通知內(nèi)核自動關閉打開的文件…caseFIONCLEX://與FIOCLEX標志相反,清除專用標志…ca
7、seFIONBIO://將文件操作設置成阻塞/非阻塞…caseFIOASYNC://將文件操作設置成同步/異步IO…//以上省略的代碼是關于具體的磁盤文件系統(tǒng)的控制處理,//關于socket的阻塞或非阻塞等設置很簡單,有興趣的讀者直接閱讀源碼吧default://文件其它部分的處理被放在了default部分error=-ENOTTY;if(S_ISREG(filp->f_dentry->d_inode->i_mode))//普通文件error=file_ioctl(filp,cmd,arg);//els
8、eif(filp->f_op&&filp->f_op->ioctl)//socket控制在此處理error=filp->f_op->ioctl(filp->f_dentry->d_inode,filp,cmd,arg);}unlock_kernel();fput(filp);out:returnerror;}注意上面藍色字體部分,即為調(diào)用網(wǎng)絡部分的代碼入口。大家注意在default情況下,有個S_ISREG宏對文件類型作判斷,其定義在inc