ioctl系統(tǒng)調(diào)用流程

ioctl系統(tǒng)調(diào)用流程

ID:19296333

大小:39.50 KB

頁數(shù):7頁

時(shí)間:2018-09-30

ioctl系統(tǒng)調(diào)用流程_第1頁
ioctl系統(tǒng)調(diào)用流程_第2頁
ioctl系統(tǒng)調(diào)用流程_第3頁
ioctl系統(tǒng)調(diào)用流程_第4頁
ioctl系統(tǒng)調(diào)用流程_第5頁
資源描述:

《ioctl系統(tǒng)調(diào)用流程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、ioctl系統(tǒng)調(diào)用流程一、系統(tǒng)調(diào)用框架·與系統(tǒng)調(diào)用相關(guān)的數(shù)據(jù)結(jié)構(gòu)和函數(shù)系統(tǒng)調(diào)用函數(shù)名以“sys_”開頭,后面是該系統(tǒng)調(diào)用的名字,由此構(gòu)成了sys_name()這樣的函數(shù)名。在include/asm/unistd.h中不同的體系結(jié)構(gòu)為每一個(gè)系統(tǒng)調(diào)用定義了惟一的編號(hào),假設(shè)用name來表示系統(tǒng)調(diào)用的名稱,那么系統(tǒng)調(diào)用號(hào)與系統(tǒng)調(diào)用響應(yīng)函數(shù)的關(guān)系是:以系統(tǒng)調(diào)用號(hào)__NR_name作為下標(biāo),可找出系統(tǒng)調(diào)用表sys_call_table中對應(yīng)表項(xiàng)的內(nèi)容,它也就是該系統(tǒng)調(diào)用的響應(yīng)函數(shù)sys_name的入口地址?!は到y(tǒng)調(diào)用具體執(zhí)行流程當(dāng)執(zhí)行一個(gè)系統(tǒng)調(diào)用時(shí),處理器跳轉(zhuǎn)到地址0xc00。參

2、考代碼:?arch/ppc/kernel/head.S.=0xc00SystemCall:EXCEPTION_PROLOGstwr3,ORIG_GPR3(r21)lir20,MSR_KERNELrlwimir20,r23,0,16,16bltransfer_to_handler.longDoSyscall.longret_from_except有關(guān)DoSyscall,它在文件arch/ppc/kernel/entry.S中定義。這個(gè)函數(shù)最終使用系統(tǒng)調(diào)用編號(hào)把系統(tǒng)調(diào)用表的地址和索引加載,操作系統(tǒng)使用系統(tǒng)調(diào)用表把系統(tǒng)調(diào)用編號(hào)翻譯為特定的系統(tǒng)調(diào)用。系統(tǒng)調(diào)用表名為sys_ca

3、ll_table,在arch/ppc/kernel/misc.S中定義。系統(tǒng)調(diào)用表包含有實(shí)現(xiàn)每個(gè)系統(tǒng)調(diào)用的函數(shù)的地址。?_GLOBAL(sys_call_table).longsys_ni_syscalllongsys_getegid.longsys_acct.longsys_umount.longsys_ni_syscall.longsys_ioctl.longsys_fcntl?當(dāng)DoSyscall找到正確的系統(tǒng)調(diào)用地址后,它把調(diào)用指定的系統(tǒng)調(diào)用函數(shù)。如要做系統(tǒng)ioctl調(diào)用,對應(yīng)的系統(tǒng)調(diào)用號(hào)為54,它把調(diào)用函數(shù)sys_ioctl()。下面具體會(huì)說明sys_ioc

4、tl()的調(diào)用過程。當(dāng)函數(shù)調(diào)用完畢之后,返回到DoSyscall(),它把控制權(quán)切換給ret_from_except(在arch/ppc/kernel/entry.S中定義)。它會(huì)去檢查那些在切換回用戶空間之前需要完成的任務(wù)。如果沒有需要做的事情,那么就通過restore函數(shù)恢復(fù)用戶進(jìn)程的狀態(tài),并把控制權(quán)交還給用戶程序。二、ioctl系統(tǒng)調(diào)用的整個(gè)流程sys_ioctl()是整個(gè)ioctl系統(tǒng)調(diào)用過程中的最頂級函數(shù),它需要對輸入的參數(shù)進(jìn)行預(yù)處理,檢查參數(shù)的合法性,然后調(diào)用底層的處理函數(shù)作更進(jìn)一步的處理。分析函數(shù)sys_ioctl(),參考代碼:?fs/ioctl.ca

5、smlinkagelongsys_ioctl(unsignedintfd,unsignedintcmd,unsignedlongarg){structfile*filp;unsignedintflag;inton,error=-EBADF;filp=fget(fd);if(!filp)gotoout;error=0;TRACE_FILE_SYSTEM(TRACE_EV_FILE_SYSTEM_IOCTL,fd,cmd,NULL);lock_kernel();switch(cmd){caseFIOCLEX:set_close_on_exec(fd,1);break;ca

6、seFIONCLEX:set_close_on_exec(fd,0);break;caseFIONBIO:if((error=get_user(on,(int*)arg))!=0)break;flag=O_NONBLOCK;#ifdef__sparc__if(O_NONBLOCK!=O_NDELAY)flag

7、=O_NDELAY;#endifif(on)filp->f_flags

8、=flag;elsefilp->f_flags&=~flag;break;caseFIOASYNC:if((error=get_user(on,(int*)arg))!=0)break;fl

9、ag=on?FASYNC:0;if((flag^filp->f_flags)&FASYNC){if(filp->f_op&&filp->f_op->fasync)error=filp->f_op->fasync(fd,filp,on);elseerror=-ENOTTY;}if(error!=0)break;if(on)filp->f_flags

10、=FASYNC;elsefilp->f_flags&=~FASYNC;break;default:if(S_ISREG(filp->f_dentry->d_inode->i_mode))error=file

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。