系统调用

[cpp]  view plain copy
  1. #define SYSCALL_DEFINE0(name)      asmlinkage long sys_##name(void)  
  2. #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)  
  3. #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)  
  4. #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)  
  5. #define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)  
  6. #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)  
  7. #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)  
  8. --->  
  9.     #define SYSCALL_DEFINEx(x, sname, ...) __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)  
  10.     --->  
  11.         asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))  
  12.   
  13.   
  14. (1)、open系统调用  
  15. open(); --->  
  16.     /*/fs/open.c*/  
  17.     SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode);--->  
  18.         do_sys_open(); --->  
  19.             fd = get_unused_fd_flags();//分配FD  
  20.             do_filp_open(); --->  
  21.     /*普通文件*/-->  __open_namei_create();--->   //这里打开文件  
  22.                         vfs_create(); --->  
  23.                             dir->i_op->create(dir, dentry, mode, nd);  
  24.                       
  25.     /*驱动文件*/-->  filp = nameidata_to_filp(&nd, open_flag);--->//这里打开驱动文件  
  26.                         __dentry_open(); --->  
  27.                             //如果没有提供open回调函数,并且驱动中有open接口  
  28.                             //那么就调用驱动的open()函数  
  29.                             open = f->f_op->open;  
  30.       
  31.       
  32.   
  33. (2)、write系统调用  
  34. write(); --->  
  35.     //fs/read_write.c  
  36.     SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,size_t, count);--->  
  37.         vfs_write(file, buf, count, &pos);--->  
  38.             if (file->f_op->write)  
  39.                 ret = file->f_op->write(file, buf, count, pos); //调用实现的write函数  
  40.             else  
  41.                 do_sync_write();--->  
  42.                     ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);//异步写  
  43.                       
  44. (3)、read系统调用  
  45. read(); --->  
  46.     SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count); --->  
  47.         vfs_read(); --->  
  48.             if (file->f_op->read)  
  49.                 ret = file->f_op->read(file, buf, count, pos);//这里调用read函数  
  50.             else  
  51.                 ret = do_sync_read(file, buf, count, pos);//异步读  
  52.               
  53.   
  54. (4)、poll系统调用  
  55. poll() --->  
  56.     //fs/select.c  
  57.     SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,long, timeout_msecs);--->  
  58.         do_sys_poll(); --->  
  59.             do_poll(); --->  
  60.                 do_pollfd(); --->  
  61.                     file->f_op->poll(file, pwait); //驱动程序里实现的poll函数  
  62.                 poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack);//真正进入睡眠  
  63.                   
  64.                   
  65. (5)、select系统调用  
  66. select(); --->  
  67.     SYSCALL_DEFINE5(select,..........);--->  
  68.         core_sys_select(); --->  
  69.             do_select(); --->  
  70.                 poll_initwait(&table);  
  71.                 for(;;){  
  72.                     mask = (*f_op->poll)(file, wait); //调用poll函数  
  73.                     ....  
  74.                     poll_schedule_timeout();//真正进入睡眠  
  75.                 }  
  76.                 poll_freewait(&table);  
  77.                   
  78.               
  79. (6)、ioctl系统调用  
  80. ioctl(); --->  
  81.     //fs/ioctl.c  
  82.     SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg);--->  
  83.         do_vfs_ioctl();--->  
  84.             vfs_ioctl(filp, cmd, arg); --->  
  85.                 if (filp->f_op->unlocked_ioctl)   
  86.                     filp->f_op->unlocked_ioctl(filp, cmd, arg);  
  87.                 else if (filp->f_op->ioctl)  
  88.                     filp->f_op->ioctl(filp->f_path.dentry->d_inode,filp, cmd, arg);  
  89.                       
  90.                   
  91. (7)、mmap系统调用  
  92. mmap(); --->  
  93.     //arch/powerpc/kernel/syscall.c  
  94.     sys_mmap(); --->  
  95.         do_mmap2();--->  
  96.             do_mmap_pgoff();--->  
  97.                 mmap_region();--->  
  98.                     file->f_op->mmap(file, vma);  
  99.                           
  100.           
  101.   
  102. (6)、close系统调用  
  103. close(); --->  
  104.     //fs/open.c  
  105.     SYSCALL_DEFINE1(close, unsigned int, fd);--->  
  106.         filp_close(filp, files);--->  
  107.             if (filp->f_op && filp->f_op->flush)  
  108.                 filp->f_op->flush(filp, id);  
  109.               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值