ioctl系统调用流程

ioctl系统调用流程

ID:19296333

大小:39.50 KB

页数:7页

时间:2018-09-30

ioctl系统调用流程_第1页
ioctl系统调用流程_第2页
ioctl系统调用流程_第3页
ioctl系统调用流程_第4页
ioctl系统调用流程_第5页
资源描述:

《ioctl系统调用流程》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、ioctl系统调用流程一、系统调用框架·与系统调用相关的数据结构和函数系统调用函数名以“sys_”开头,后面是该系统调用的名字,由此构成了sys_name()这样的函数名。在include/asm/unistd.h中不同的体系结构为每一个系统调用定义了惟一的编号,假设用name来表示系统调用的名称,那么系统调用号与系统调用响应函数的关系是:以系统调用号__NR_name作为下标,可找出系统调用表sys_call_table中对应表项的内容,它也就是该系统调用的响应函数sys_name的入口地址。·系统调用具体执行流程当执行一个系统调用时,处理器跳转到地址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有关DoSyscall,它在文件arch/ppc/kernel/entry.S中定义。这个函数最终使用系统调用编号把系统调用表的地址和索引加载,操作系统使用系统调用表把系统调用编号翻译为特定的系统调用。系统调用表名为sys_ca

3、ll_table,在arch/ppc/kernel/misc.S中定义。系统调用表包含有实现每个系统调用的函数的地址。 _GLOBAL(sys_call_table).longsys_ni_syscalllongsys_getegid.longsys_acct.longsys_umount.longsys_ni_syscall.longsys_ioctl.longsys_fcntl 当DoSyscall找到正确的系统调用地址后,它把调用指定的系统调用函数。如要做系统ioctl调用,对应的系统调用号为54,它把调用函数sys_ioctl()。下面具体会说明sys_ioc

4、tl()的调用过程。当函数调用完毕之后,返回到DoSyscall(),它把控制权切换给ret_from_except(在arch/ppc/kernel/entry.S中定义)。它会去检查那些在切换回用户空间之前需要完成的任务。如果没有需要做的事情,那么就通过restore函数恢复用户进程的状态,并把控制权交还给用户程序。二、ioctl系统调用的整个流程sys_ioctl()是整个ioctl系统调用过程中的最顶级函数,它需要对输入的参数进行预处理,检查参数的合法性,然后调用底层的处理函数作更进一步的处理。分析函数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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。