版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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_PROLOGstw r3,ORIG_GPR3(r21)li r20,MSR_KERNELrlwimi r20,r23,0,16,16bl transfer_to_handler.long DoSyscall.long ret_from_except有关DoSyscall,它在文件arch/ppc/kernel/entry.S 中定义。这个函数最终使用系统调用编号把系统调用表的地址和索引加载,操作系统使用系统调用表把系统调用编号翻译为特定的系统调用。系统调用表名为 sys
3、_call_table,在 arch/ppc/kernel/misc.S 中定义。系统调用表包含有实现每个系统调用的函数的地址。 _GLOBAL(sys_call_table).long sys_ni_syscalllong sys_getegid.long sys_acct.long sys_umount.long sys_ni_syscall.long sys_ioctl.long sys_fcntl 当DoSyscall 找到正确的系统调用地址后,它把调用指定的系统调用函数。如要做系统ioctl调用,对应的系统调用号为54,它把调用函数sys_ioctl()。下面具体
4、会说明sys_ioctl()的调用过程。当函数调用完毕之后,返回到 DoSyscall(),它把控制权切换给 ret_from_except(在 arch/ppc/kernel/entry.S 中定义)。它会去检查那些在切换回用户空间之前需要完成的任务。如果没有需要做的事情,那么就通过 restore 函数恢复用户进程的状态,并把控制权交还给用户程序。二、ioctl系统调用的整个流程sys_ioctl()是整个ioctl系统调用过程中的最顶级函数,它需要对输入的参数进行预处理,检查参数的合法性,然后调用底层的处理函数作更进一步的处理。分析函数sys_ioctl(),参考代码: fs/
5、ioctl.casmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)struct file * filp;unsigned int flag;int on, error = -EBADF;filp = fget(fd);if (!filp)goto out;error = 0;TRACE_FILE_SYSTEM(TRACE_EV_FILE_SYSTEM_IOCTL,fd,cmd,NULL);lock_kernel();switch (cmd) case FIOCLEX:set_close_o
6、n_exec(fd, 1);break;case FIONCLEX:set_close_on_exec(fd, 0);break;case FIONBIO: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;case FIOASYNC:if (erro
7、r = 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);else error = -ENOTTY;if (error != 0)break;if (on)filp->f_flags |= FASYNC;elsefilp->f_flag
8、s &= FASYNC;break;default:if (S_ISREG(filp->f_dentry->d_inode->i_mode)error = file_ioctl(filp, cmd, arg);else if (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:return error;&
9、#160;其中调用到函数的说明: 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函数,检查一下文件描述符
10、fd是否对应一个打开的文件,如果是就获取该文件,调用函数get_file()把f_count加1。具体看一下fcheck函数的执行,参考代码: include/linux/file.hstatic inline struct file * fcheck(unsigned int fd) struct file * file = NULL; struct files_struct *files = current->files;if (fd < files->max_fds)file = files->fdfd;return file; filp->f_o
11、p->ioctl()函数,调用设备对应的ioctl函数,对于使用socket创建文件描述符,它应该调用sock_ioctl()函数,具体流程图如下:每一个设备都可以定义自己的ioctl命令字,命令编号的范围是SIOCDEVPRIVATE到SIOCDEVPRIVATE + 15。针对ipv6隧道,它定一个四个命令字,分别是SIOCGETTUNNEL,SIOCADDTUNNEL,SIOCCHGTUNNEL,SIOCDELTUNNEL。用户空间通过ioctl系统调用,最终调用到内核中定义的函数ip6ip6_tnl_ioctl。 sock_ioctl()函数调用中有关的内核函数:soc
12、k_ioctlinet6_ioctldev_ioctldev_ifsioc sock_ioctl()功能::直接调用一个协议特定的函数,如:当socket family是PF_INET6,调用函数inet6_ioctl。 inet6_ioctl()功能:v6对应socket的ioctl内核函数,根据不同的case情况,作相应的处理。 case SIOCADDRT:case SIOCDELRT: return(ipv6_route_ioctl(cmd,(void *)arg);当ioctl命令字不满足上述各种case情况时: default:if (cmd >= SIO
13、CDEVPRIVATE) &&(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)。这里的句柄是一个函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育机构校长劳动合同3篇
- 新版项目软件合同3篇
- 提前终止月嫂合同3篇
- 安装工程合同中的技术解析3篇
- 数码相机购买合同3篇
- 摩托车位转让合同模板3篇
- 教育培训机构店长劳动合同3篇
- 旅游产品销售员招聘合同3篇
- 新版银行抵押贷款合同3篇
- 新媒体合作协议书3篇
- GB 1886.342-2021食品安全国家标准食品添加剂硫酸铝铵
- 期末复习必背作文 鲁教版八年级上册英语全册
- 2023年全科医师转岗培训理论考试试题及答案
- 电力系统三相短路电流计算的基本方法课件
- 福建省莆田市各县区乡镇行政村村庄村名明细及行政区划代码
- 汉字起源与发展(最新完美版)
- 网络安全的应急预案(精选13篇)
- 抚顺齐隆化工有限公司5万吨-年热聚树脂项目环境影响评价文件
- sy4209-《石油天然气建设工程施工质量验收规范-天然气净化厂建设工程》
- 2021年12月英语六级听力试题、原文及答案 两套
- AQL2.5抽检标准
评论
0/150
提交评论