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.