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