ioctl系统调用流程_第1页
ioctl系统调用流程_第2页
ioctl系统调用流程_第3页
ioctl系统调用流程_第4页
ioctl系统调用流程_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ioctl系统调用流程一、系统调用框架与系统调用相关的数据结构和函数系统调用函数名以“ sys_”头,后面是该系统调用的名字,由此构成了sys_ name()这样的函数名。在include/asm/中不同的体系结构为每一个系统调用定义了惟一的编号,假设用name来表示系统调用的名称,那么系统调用号与系统调用响应函数的关系是:以系统调用号_NR_name作为下标,可找出系统调用表sys_call_table中对应表项的内容,它也就是该系统调用的响应函数 sys_ name的入口地址。系统调用具体执行流程当执行一个系统调用时,处理器跳转到地址OxcOO。参考代码:arch/ppc/ker nel/

2、.=0xc00SystemCall:EXCEPTION_PROLOGstw r3,ORIG_GPR3(r21)li r20,MSR_KERNELrlwimi r20,r23,0,16,16bl tran sfer_to_ha ndlerong DoSyscallong ret_from_except有关DoSyscall,它在文件arch/ppc/kernel/中定义。这个函数最终使用系统调用编号把系统 调用表的地址和索引加载,操作系统使用系统调用表把系统调用编号翻译为特定的系统调 用。 系统调用表名为 sys_call_table ,在 arch/ppc/kernel/ 中定义。系统调用表包

3、含有实现每个系 统调用的函数的地址。_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() 。下面具体会说明 sys_ioctl() 的调 用过程。当函数调用完毕之后,返回到 DoSyscall() ,

4、它把控制权切换给 ret_from_except (在 arch/ppc/kernel/ 中定义) 。它会去检查那些在切换回用户空间之前需要完成的任务。如果没 有需要做的事情,那么就通过 restore 函数恢复用户进程的状态,并把控制权交还给用户程 序。二、 ioctl 系统调用的整个流程sys_ioctl()是整个ioctl系统调用过程中的最顶级函数,它需要对输入的参数进行预处理,检 查参数的合法性,然后调用底层的处理函数作更进一步的处理。分析函数 sys_ioctl() ,参考代码:fs/asmlinkage long sys_ioctl(unsigned int fd, unsigne

5、d 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_on_exec(fd, 1); break;case FIONCLEX:set_close_on_exec(

6、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;#endif if (on) filp-f_flags |= flag;else filp-f_flags &= flag;break;case FIOASYNC:if (error = get_user(on, (int *)arg) != 0) break;flag = on FASYNC :

7、0;if (flag A 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_flags &= FASYNC;break;default:if (S_ISREG(filp-f_dentry-d_inode-i_mode)error = file_ioctl(filp, cmd, arg);e

8、lse 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;其中调用到函数的说明: fget() 函数,它是用来获取操作文件的指针,在这篇文档里,我是使用 socket 创建了一个 文件描述符,fd = socket(AF_INET6, SOCK_DGRAM, 0);用户态的创建 socket()到内核中传给 函数 sys_socket()处理,sys_socket()

9、函数先调用函数 sock_create()创建 socket,然后把 socket 操作和文件操作关联起来,具体调用函数sock_map_fd()来实现,成功后把文件描述和文件结构 file 都保存在 sock-file 中。对于函数fget()函数,它首先调用fcheck函数,检查一下文件描述符fd是否对应一个打开的文件,如果是就获取该文件,调用函数 get_file() 把 f_count 加 1。具体看一下 fcheck 函数的执行,参考代码:include/linux/static inline struct file * fcheck(unsigned int fd)struct f

10、ile * file = NULL;struct files_struct *files = current-files;if (fd max_fds)file = files-fdfd;return file; filp-f_op-ioctl()函数,调用设备对应的ioctl函数,对于使用socket创建文件描述符,它应该调用 sock_ioctl() 函数,具体流程图如下:每一个设备都可以定义自己的 ioctl 命令字,命令编号的范围是 SIOCDEVPRIVATE 到SIOCDEVPRIVATE + 15。针对ipv6隧道,它定一个四个命令字, 分别是SIOCGETTUNNEL , SI

11、OCADDTUNNEL , SIOCCHGTUNNEL , SIOCDELTUNNEL 。用户空间通过 ioctl 系统调 用,最终调用到内核中定义的函数 ip6ip6_tnl_ioctl 。sock_ioctl() 函数调用中有关的内核函数:sock_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 (c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论