系统调用

来源:互联网 发布:淘宝女棉拖 编辑:程序博客网 时间:2024/06/10 16:41
#define SYSCALL_DEFINE0(name)   asmlinkage long sys_##name(void)#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)--->#define SYSCALL_DEFINEx(x, sname, ...) __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)--->asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))(1)、open系统调用open(); --->/*/fs/open.c*/SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode);--->do_sys_open(); --->fd = get_unused_fd_flags();//分配FDdo_filp_open(); --->/*普通文件*/-->__open_namei_create();--->//这里打开文件vfs_create(); --->dir->i_op->create(dir, dentry, mode, nd);/*驱动文件*/-->filp = nameidata_to_filp(&nd, open_flag);--->//这里打开驱动文件__dentry_open(); --->//如果没有提供open回调函数,并且驱动中有open接口//那么就调用驱动的open()函数open = f->f_op->open;(2)、write系统调用write(); --->//fs/read_write.cSYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,size_t, count);--->vfs_write(file, buf, count, &pos);--->if (file->f_op->write)ret = file->f_op->write(file, buf, count, pos); //调用实现的write函数elsedo_sync_write();--->ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);//异步写(3)、read系统调用read(); --->SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count); --->vfs_read(); --->if (file->f_op->read)ret = file->f_op->read(file, buf, count, pos);//这里调用read函数elseret = do_sync_read(file, buf, count, pos);//异步读(4)、poll系统调用poll() --->//fs/select.cSYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,long, timeout_msecs);--->do_sys_poll(); --->do_poll(); --->do_pollfd(); --->file->f_op->poll(file, pwait); //驱动程序里实现的poll函数poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack);//真正进入睡眠(5)、select系统调用select(); --->SYSCALL_DEFINE5(select,..........);--->core_sys_select(); --->do_select(); --->poll_initwait(&table);for(;;){mask = (*f_op->poll)(file, wait); //调用poll函数....poll_schedule_timeout();//真正进入睡眠}poll_freewait(&table);(6)、ioctl系统调用ioctl(); --->//fs/ioctl.cSYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg);--->do_vfs_ioctl();--->vfs_ioctl(filp, cmd, arg); --->if (filp->f_op->unlocked_ioctl) filp->f_op->unlocked_ioctl(filp, cmd, arg);else if (filp->f_op->ioctl)filp->f_op->ioctl(filp->f_path.dentry->d_inode,filp, cmd, arg);(7)、mmap系统调用mmap(); --->//arch/powerpc/kernel/syscall.csys_mmap(); --->do_mmap2();--->do_mmap_pgoff();--->mmap_region();--->file->f_op->mmap(file, vma);(6)、close系统调用close(); --->//fs/open.cSYSCALL_DEFINE1(close, unsigned int, fd);--->filp_close(filp, files);--->if (filp->f_op && filp->f_op->flush)filp->f_op->flush(filp, id);

原创粉丝点击