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];  
};


你可能感兴趣的:(Linux虚拟文件系统--open())