#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();//分配FD do_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.c SYSCALL_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函数 else do_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函数 else ret = do_sync_read(file, buf, count, pos);//异步读 (4)、poll系统调用 poll() ---> //fs/select.c SYSCALL_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.c SYSCALL_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.c sys_mmap(); ---> do_mmap2();---> do_mmap_pgoff();---> mmap_region();---> file->f_op->mmap(file, vma); (6)、close系统调用 close(); ---> //fs/open.c SYSCALL_DEFINE1(close, unsigned int, fd);---> filp_close(filp, files);---> if (filp->f_op && filp->f_op->flush) filp->f_op->flush(filp, id);