首页 ioctl系统调用流程

ioctl系统调用流程

举报
开通vip

ioctl系统调用流程如有侵权,请联系网站删除,仅供学习与交流【精品文档】第PAGE8页ioctl系统调用流程ioctl系统调用流程一、系统调用框架与系统调用相关的数据结构和函数系统调用函数名以“sys_”开头,后面是该系统调用的名字,由此构成了sys_name()这样的函数名。在include/asm/unistd.h中不同的体系结构为每一个系统调用定义了惟一的编号,假设用name来表示系统调用的名称,那么系统调用号与系统调用响应函数的关系是:以系统调用号__NR_name作为下标,可找出系统调用表sys_call_table中...

ioctl系统调用流程
如有侵权,请联系网站删除,仅供学习与交流【精品文档】第PAGE8页ioctl系统调用流程ioctl系统调用流程一、系统调用框架与系统调用相关的数据结构和函数系统调用函数名以“sys_”开头,后面是该系统调用的名字,由此构成了sys_name()这样的函数名。在include/asm/unistd.h中不同的体系结构为每一个系统调用定义了惟一的编号,假设用name来 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示系统调用的名称,那么系统调用号与系统调用响应函数的关系是:以系统调用号__NR_name作为下标,可找出系统调用表sys_call_table中对应表项的内容,它也就是该系统调用的响应函数sys_name的入口地址。系统调用具体执行流程当执行一个系统调用时,处理器跳转到地址0xc00。参考代码: 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_call_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_ioctl()的调用过程。当函数调用完毕之后,返回到DoSyscall(),它把控制权切换给ret_from_except(在arch/ppc/kernel/entry.S中定义)。它会去检查那些在切换回用户空间之前需要完成的任务。如果没有需要做的事情,那么就通过restore函数恢复用户进程的状态,并把控制权交还给用户程序。二、ioctl系统调用的整个流程sys_ioctl()是整个ioctl系统调用过程中的最顶级函数,它需要对输入的参数进行预处理,检查参数的合法性,然后调用底层的处理函数作更进一步的处理。 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 函数sys_ioctl(),参考代码:fs/ioctl.casmlinkagelongsys_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;caseFIONCLEX: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|=O_NDELAY;#endifif(on)filp->f_flags|=flag;elsefilp->f_flags&=~flag;break;caseFIOASYNC:if((error=get_user(on,(int*)arg))!=0)break;flag=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|=FASYNC;elsefilp->f_flags&=~FASYNC;break;default:if(S_ISREG(filp->f_dentry->d_inode->i_mode))error=file_ioctl(filp,cmd,arg);elseif(filp->f_op&&filp->f_op->ioctl)error=filp->f_op->ioctl(filp->f_dentry->d_inode,filp,cmd,arg);}unlock_kernel();fput(filp);out:returnerror;}其中调用到函数的说明:★fget()函数,它是用来获取操作文件的指针,在这篇文档里,我是使用socket创建了一个文件描述符,fd=socket(AF_INET6,SOCK_DGRAM,0);用户态的创建socket()到内核中传给函数sys_socket()处理,sys_socket()函数先调用函数sock_create()创建socket,然后把socket操作和文件操作关联起来,具体调用函数sock_map_fd()来实现,成功后把文件描述和文件结构file都保存在sock->file中。对于函数fget()函数,它首先调用fcheck函数,检查一下文件描述符fd是否对应一个打开的文件,如果是就获取该文件,调用函数get_file()把f_count加1。具体看一下fcheck函数的执行,参考代码:include/linux/file.hstaticinlinestructfile*fcheck(unsignedintfd){structfile*file=NULL;structfiles_struct*files=current->files;if(fdmax_fds)file=files->fd[fd];returnfile;★filp->f_op->ioctl()函数,调用设备对应的ioctl函数,对于使用socket创建文件描述符,它应该调用sock_ioctl()函数,具体流程图如下:每一个设备都可以定义自己的ioctl命令字,命令编号的范围是SIOCDEVPRIVATE到SIOCDEVPRIVATE+15。针对ipv6隧道,它定一个四个命令字,分别是SIOCGETTUNNEL,SIOCADDTUNNEL,SIOCCHGTUNNEL,SIOCDELTUNNEL。用户空间通过ioctl系统调用,最终调用到内核中定义的函数ip6ip6_tnl_ioctl。sock_ioctl()函数调用中有关的内核函数:sock_ioctlinet6_ioctldev_ioctldev_ifsioc■sock_ioctl()功能::直接调用一个协议特定的函数,如:当socketfamily是PF_INET6,调用函数inet6_ioctl。■inet6_ioctl()功能:v6对应socket的ioctl内核函数,根据不同的case情况,作相应的处理。caseSIOCADDRT:caseSIOCDELRT:return(ipv6_route_ioctl(cmd,(void*)arg));当ioctl命令字不满足上述各种case情况时:default:if((cmd>=SIOCDEVPRIVATE)&&(cmd<=(SIOCDEVPRIVATE+15)))return(dev_ioctl(cmd,(void*)arg));该设备自己定义了一些ioctl命令字范围在SIOCDEVPRIVATE到SIOCDEVPRIVATE+15之间),调用函数dev_ioctl实现对该设备指定的ioctl命令的操作。■dev_ioctl()功能:用来处理所有设备接口的ioctl请求,只是一个包装器,实际的动作把由dev_ifsioc()来实现。dev_ioctl做的只是检查这个调用是否具有了正当的权限。■dev_ifsioc()功能:真正处理所有设备接口的ioctl请求。具体操作说明:函数首先要做的一些事情包括得到与ifr.ifr_name相匹配的设备的结构,但这是在实现特定的接口命令之后。这些特定的接口命令被放置到一个巨大的switch语句之中。其中SIOCDEVPRIVATE命令和其他的在0x89F0到0x89FF之间的代码把出现在switch语句中的一个分支——default语句中,代码最后还增加了对无线网络的支持。内核执行时会检查表示设备的结构变量中,是否已经定义了一个与设备相关的ioctl句柄(handler)。这里的句柄是一个函数指针,它在表示设备的结构变量中do_ioctl部分。如果已经设置了这个句柄,那么内核把会执行它。如ipv6隧道设备体,在初始化时,就作了说明:dev->do_ioctl=ip6ip6_tnl_ioctl,其中函数ip6ip6_tnl_ioctl就是该设备对应的ioctl句柄,由于隧道设备是自己定义的ioctl命令字,因而执行应在default语句中,进而调用到自己定义的ioctl处理函数ip6ip6_tnl_ioctl。
本文档为【ioctl系统调用流程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥17.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
人生旅程
暂无简介~
格式:doc
大小:59KB
软件:Word
页数:8
分类:初中语文
上传时间:2021-12-14
浏览量:8