sys - open

sys_open()´úÂë·ÖÎö

Ó¦ÓóÌÐòÔÚ²Ù×÷ÈκÎÒ»¸öÎļþ֮ǰ£¬±ØÐëÏȵ÷ÓÃopen()À´´ò¿ª¸ÃÎļþ£¬¼´Í¨ÖªÄÚºËн¨Ò»¸ö´ú±í¸ÃÎļþµÄ½á¹¹£¬²¢ÇÒ·µ»Ø¸ÃÎļþµÄÃèÊö·û(Ò»¸öÕûÊý)£¬¸ÃÃèÊö·ûÔÚ½ø³ÌÄÚΨһ¡£open()µÄ¸ñʽÈçÏ£º

int open(const char * pathname,int oflag, mode_t mode ) pathname:´ú±íÐèÒª´ò¿ªµÄÎļþµÄÎļþÃû£»

oflag£º±íʾ´ò¿ªµÄ±êʶ£¬¾ßÌåµÄÄÚºËÖ§³ÖÈçϱê¼Çλ£º

O_ACCMODE<0003>: ¶ÁдÎļþ²Ù×÷ʱ£¬ÓÃÓÚÈ¡³öflagµÄµÍ2λ¡£

O_RDONLY<00>: Ö»¶Á´ò¿ª

O_WRONLY<01>: ֻд´ò¿ª

O_RDWR<02>: ¶Áд´ò¿ª

O_CREAT<0100>: Îļþ²»´æÔÚÔò´´½¨£¬ÐèÒªmode_t

O_EXCL<0200>: Èç¹ûͬʱָ¶¨ÁËO_CREAT£¬¶øÎļþÒѾ­´æÔÚ£¬Ôò³ö´í

O_NOCTTY<0400>: Èç¹ûpathname´ú±íÖÕ¶ËÉ豸£¬Ôò²»½«´ËÉ豸·ÖÅä×÷Ϊ´Ë½ø³ÌµÄ¿ØÖÆÖÕ¶Ë

O_TRUNC<01000>: Èç¹û´ËÎļþ´æÔÚ£¬¶øÇÒΪֻ¶Á»òֻд³É¹¦´ò¿ª£¬Ôò½«Æä³¤¶È½Ø¶ÌΪ0

O_APPEND<02000>: ÿ´Îдʱ¶¼¼Óµ½ÎļþµÄβ¶Ë

O_NONBLOCK<04000>: Èç¹ûp a t h n a m eÖ¸µÄÊÇÒ»¸öF I F O¡¢Ò»¸ö¿éÌØÊâÎļþ»òÒ»¸ö×Ö·ûÌØÊâÎļþ£¬Ôò´ËÑ¡ÔñÏîΪ´ËÎļþµÄ±¾´Î´ò¿ª²Ù×÷ºÍºóÐøµÄI / O²Ù×÷ÉèÖ÷Ç×èÈû·½Ê½¡£

O_NDELAY

O_SYNC<010000>: ʹÿ´Îwrite¶¼µÈµ½ÎïÀíI/O²Ù×÷Íê³É¡£

FASYNC<020000>: ¼æÈÝBSDµÄfcntlͬ²½²Ù×÷

O_DIRECT<040000>: Ö±½Ó´ÅÅ̲Ù×÷±êʶ£¬Ã¿´Î¶Áд¶¼²»Ê¹ÓÃÄÚºËÌṩµÄ»º´æ£¬Ö±½Ó¶Áд´ÅÅÌÉ豸

O_LARGEFILE<0100000>: ´óÎļþ±êʶ

O_DIRECTORY<0200000>: ±ØÐëÊÇĿ¼

O_NOFOLLOW<0400000>: ²»»ñÈ¡Á¬½ÓÎļþ

O_NOATIME<01000000>: ÔÝÎÞ

µ±Ð´´½¨Ò»¸öÎļþʱ£¬ÐèÒªÖ¸¶¨mode²ÎÊý£¬ÒÔÏÂ˵Ã÷µÄ¸ñʽÈçºê¶¨ÒåÃû³Æ<ʵ¼Ê³£ÊýÖµ>: ÃèÊöÈçÏ£º

S_IRWXU<00700>£ºÎļþÓµÓÐÕßÓжÁдִÐÐȨÏÞ

S_IRUSR (S_IREAD)<00400>£ºÎļþÓµÓÐÕß½öÓжÁȨÏÞ

S_IWUSR (S_IWRITE)<00200>£ºÎļþÓµÓÐÕß½öÓÐдȨÏÞ

S_IXUSR (S_IEXEC)<00100>£ºÎļþÓµÓÐÕß½öÓÐÖ´ÐÐȨÏÞ

S_IRWXG<00070>£º×éÓû§ÓжÁдִÐÐȨÏÞ

S_IRGRP<00040>£º×éÓû§½öÓжÁȨÏÞ

S_IWGRP<00020>£º×éÓû§½öÓÐдȨÏÞ

S_IXGRP<00010>£º×éÓû§½öÓÐÖ´ÐÐȨÏÞ

S_IRWXO<00007>£ºÆäËûÓû§ÓжÁдִÐÐȨÏÞ

S_IROTH<00004>£ºÆäËûÓû§½öÓжÁȨÏÞ

S_IWOTH<00002>£ºÆäËûÓû§½öÓÐдȨÏÞ

S_IXOTH<00001>£ºÆäËûÓû§½öÓÐÖ´ÐÐȨÏÞ

µ±open()ϵͳµ÷ÓýøÈëÄÚºËʱºò£¬×îÖÕµ÷Óõĺ¯ÊýΪ

SYSCALL_DEFINE3(open, const char __user*, filename, int, flags, int,mode)

ʵ¼ÊÏ൱ÓÚµ÷Óãº

asmlinkage long sys_open(const char __user *filename, int flags, int mode)

¸Ãº¯ÊýλÓÚfs/open.cÖУ¬ÏÂÃæ½«»á·ÖÎöÆä¾ßÌåµÄʵÏÖ¹ý³Ì¡£

1. 2. 3. 4. 5. 6. 7. 8. 9.

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode) {

long ret;

//ÅжÏϵͳÊÇ·ñÖ§³Ö´óÎļþ£¬¼´ÅжÏlongµÄλÊý£¬Èç¹û64Ôò±íʾ֧³Ö´óÎļþ£» if (force_o_largefile()) flags |= O_LARGEFILE;

//Íê³ÉÖ÷ÒªµÄopen¹¤×÷£¬AT_FDCWD±íʾ´Óµ±Ç°Ä¿Â¼¿ªÊ¼²éÕÒ ret = do_sys_open(AT_FDCWD, filename, flags, mode);

10. /* avoid REGPARM breakage on x86: */

11. asmlinkage_protect(3, ret, filename, flags, mode); 12. return ret; 13. }

¸Ãº¯ÊýÖ÷Òªµ÷ÓÃdo_sys_open()À´Íê³É´ò¿ª¹¤×÷£¬do_sys_open()µÄ´úÂë·ÖÎöÈçÏ¡£

1. long do_sys_open(int dfd, const char__user *filename, int flags, int mode) 2. {

3. //½«Óû´ò¿ªµÄÎļþÃû¿½±´µ½ÄÚºËÖÐ,¸Ãº¯ÊýµÄ·ÖÎö¼ûÏÂÎÄ£» 4. char *tmp = getname(filename); 5. int fd = PTR_ERR(tmp); 6.

7. if (!IS_ERR(tmp)) {

8. //´Ó½ø³ÌµÄÎļþ±íÖÐÕÒµ½Ò»¸ö¿ÕÏеÄÎļþ±íÖ¸Õ룬Èç¹û³ö´í£¬Ôò·µ»Ø£¬¼ûÏÂÎÄ˵Ã÷£» 9. fd = get_unused_fd_flags(flags); 10. if (fd >= 0) {

11. //Ö´Ðдò¿ª²Ù×÷£¬¼ûÏÂÎÄ˵Ã÷£¬dfd=AT_FDCWD;

12. struct file *f = do_filp_open(dfd, tmp, flags, mode, 0); 13. if (IS_ERR(f)) { 14. put_unused_fd(fd);

15. fd = PTR_ERR(f); 16. } else {

17. fsnotify_open(f);

18. //Ìí¼Ó´ò¿ªµÄÎļþ±ífµ½µ±Ç°½ø³ÌµÄÎļþ±íÊý×éÖÐ,¼ûÏÂÎÄ˵Ã÷£» 19. fd_install(fd, f); 20. } 21. }

22. putname(tmp); 23. }

24. return fd; 25. }

1. ¸Ãº¯ÊýÖ÷Òª·ÖΪÈçϼ¸¸ö²½ÖèÀ´Íê³É´ò¿ªÎļþµÄ²Ù×÷£º 2. 1.½«ÎļþÃû²ÎÊý´ÓÓû§Ì¬¿½±´ÖÁÄںˣ¬µ÷Óú¯Êýget_name()£»

3. 2.´Ó½ø³ÌµÄÎļþ±íÖÐÕÒµ½Ò»¸ö¿ÕÏеÄÎļþ±íÖ¸Õ룬µ÷ÓÃÁ˺¯Êýget_unused_fd_flgas()£» 4. 3.Íê³ÉÕæÕýµÄ´ò¿ª²Ù×÷£¬µ÷Óú¯Êýdo_filp_open()£»

5. 4.½«´ò¿ªµÄÎļþÌí¼Óµ½½ø³ÌµÄÎļþ±íÊý×éÖУ¬µ÷Óú¯Êýfd_install()£» 6. char * getname(const char __user * filename) 7. {

8. char *tmp, *result; 9.

10. result = ERR_PTR(-ENOMEM); 11. //´ÓÄں˻º´æÖзÖÅä¿Õ¼ä£» 12. tmp = __getname(); 13. if (tmp) {

14. //½«ÎļþÃû´ÓÓû§Ì¬¿½±´ÖÁÄÚºË̬£»

15. int retval = do_getname(filename, tmp); 16. result = tmp;

17. //Èç¹û¿½±´Ê§°Ü£¬Ôòµ÷ÓÃ__putname()ÊÍ·Å__getname()ÖÐÉêÇëµÄ¿Õ¼ä£» 18. if (retval < 0) { 19. __putname(tmp);

20. result = ERR_PTR(retval); 21. } 22. }

23. audit_getname(result); 24. return result;

25. }

26. ¸Ãº¯ÊýÖ÷ÒªµÄÈÎÎñÊǽ«ÎļþÃûfilename´ÓÓû§Ì¬¿½±´ÖÁÄÚºË̬£º 27. 1.Ê×Ïȵ÷ÓÃ__getname()À´´ÓÄں˻º´æÖзÖÅä¿Õ¼ä£»

28. 2.µ÷ÓÃdo_getname()½«ÎļþÃûfilename´ÓÓû§Ì¬¿½±´ÖÁÄÚºË̬tmpÖУ¬Èç¹û³É¹¦£¬Ôò·µ»Ø±£´æÓû§Ãû

µÄÄں˻º³åÇøµÄÆðʼµØÖ·£¬·ñÔò£¬µ÷ÓÃ__putname()ÊÍ·Å1ÖÐÉêÇëµÄÄں˻º³åÇø£» 29. get_unused_fd_flags(flags)

30. #define get_unused_fd_flags(flags) alloc_fd(0, (flags)) 31. int alloc_fd(unsigned start, unsigned flags) 32. {

33. //»ñµÃµ±Ç°½ø³ÌµÄfiles_struct ½á¹¹£»

34. struct files_struct *files = current->files; 35. unsigned int fd; 36. int error;

37. struct fdtable *fdt; 38.

39. spin_lock(&files->file_lock); 40. repeat:

41. fdt = files_fdtable(files); 42. fd = start;

43. //´ÓÉÏÒ»´Î´ò¿ªµÄfdµÄÏÂÒ»¸öfd¿ªÊ¼ËÑË÷¿ÕÏеÄfd 44. if (fd < files->next_fd) 45. fd = files->next_fd; 46. //ѰÕÒ¿ÕÏеÄfd£¬·µ»ØÖµÎª¿ÕÏеÄfd 47. if (fd < fdt->max_fds)

48. fd = find_next_zero_bit(fdt->open_fds->fds_bits, 49. fdt->max_fds, fd);

50. //Èç¹ûÓбØÒª£¬¼´´ò¿ªµÄfd³¬¹ýmax_fds,ÔòÐèÒªexpandµ±Ç°½ø³ÌµÄfd±í£»

51. //·µ»ØÖµerror<0±íʾ³ö´í£¬error=0±íʾÎÞÐèexpand£¬error=1±íʾ½øÐÐÁËexpand£» 52. error = expand_files(files, fd); 53. if (error < 0) 54. goto out; 55. 56. /*

57. * If we needed to expand the fs array we 58. * might have blocked - try again.

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@) ËÕICP±¸20003344ºÅ-4