Linux虚拟文件系统--open()


open()系统调用用来打开一个文件,本文就VFS层,对open系统调用的过程进行一个简单的分析。

  1. SYSCALL_DEFINE3(open, constchar __user *, filename, int, flags, int, mode)
  2. {
  3. long ret;
  4. if (force_o_largefile())
  5. flags |= O_LARGEFILE;
  6. ret = do_sys_open(AT_FDCWD, filename, flags, mode);
  7. /* avoid REGPARM breakage on x86: */
  8. asmlinkage_protect(3, ret, filename, flags, mode);
  9. return ret;
  10. }

force_o_largefile()用来判断系统是否为32位的,如果不是32位,也就是说为64位,则将O_LARGEFILE置位,主体工作由do_sys_open()来做

  1. long do_sys_open(int dfd, constchar __user *filename, int flags, int mode)
  2. {
  3. char *tmp = getname(filename);//拷贝文件名字符串到内核空间
  4. int fd = PTR_ERR(tmp);
  5. if (!IS_ERR(tmp)) {
  6. fd = get_unused_fd_flags(flags);//为文件分配一个文件描述符
  7. if (fd >= 0) {
  8. //实际的OPEN操作处理
  9. struct file *f = do_filp_open(dfd, tmp, flags, mode, 0);
  10. if (IS_ERR(f)) {
  11. put_unused_fd(fd);
  12. fd = PTR_ERR(f);
  13. } else {
  14. fsnotify_open(f->f_path.dentry);
  15. fd_install(fd, f);
  16. }
  17. }
  18. putname(tmp);
  19. }
  20. return fd;
  21. }

open操作是特定于某个进程进行的,因此涉及到了VFS中特定于进程的结构,这里简单的介绍下

struct files_struct { 
  /*
  * read mostly part
  */ 
    atomic_t count; 
    struct fdtable *fdt; 
    struct fdtable fdtab; 
  /*
  * written part on a separate cache line in SMP
  */ 
    spinlock_t file_lock ____cacheline_aligned_in_smp; 
    int next_fd; 
    struct embedded_fd_set close_on_exec_init; 
    struct embedded_fd_set open_fds_init; 
    struct file * fd_array[NR_OPEN_DEFAULT]; 
};

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容