Chinaunix首页 | 论坛 | 博客
  • 博客访问: 282684
  • 博文数量: 57
  • 博客积分: 1764
  • 博客等级: 上尉
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-09 18:14
文章分类

全部博文(57)

文章存档

2012年(24)

2011年(33)

分类: LINUX

2011-11-17 22:21:19

   当内核加载了VFS后,在内核空间中就可以像用户空间一样创建和处理文件,只是接口有所不同。
   用户空间   内核空间
   open()         sys_open()  filp_open()
     close()         sys_close()  filp_close()
     read()          sys_read()   filp_read()
     write()          sys_write()   filp_wirte()
     sys_open该函数其实就是用户空间中调用open陷入到内核空间中的系统调用处理函数。跟进程紧密相关,返回的是文件描述符,因此在内核中有时不可用,得使用filp_xxx
========================================================================
    #include
    u8 buf[128];
    int fd;
    memset(buf, 0, sizeof(buf));
    mm_segment_t old_fs = get_fs();
    set_fs(KERNEL_DS);
    fd = sys_open("/etc/passwd", O_RDONLY, 0);
    if (fd >= 0) {
        sys_read(fd, buf, sizeof(buf)-1);
        printk("%s\n", buf);
        sys_close(fd);
    }
    set_fs(old_fs);
========================================================================
    filp_xxx:操作的是struct file结构体,该结构体是内核中对文件的描述。描述符fd跟struct file通过fdtable中的指针数组fd映射起来(描述符fd是指针数组fd的下标)。具体的映射关系如下:
  (task_struct) current -> (struct files_struct*) files -> (struct fdtable*) fdt -> (struct file**) fd
    可以调用函数完成这个过程:
  fget_light() -> fcheck_files()
==========================================================================
    struct file* filp;
    filp = filp_open("/tmp/test", O_CREATE | O_RDWR, 0);
    if (IS_ERR(filp)) return -1;
    filp_close(filp, 0);
===========================================================================

参考资料:

1.http://hi.baidu.com/xxjjyy2008/blog/item/f6cf2144c53a779eb2b7dc59.html

2.http://blog.chinaunix.net/space.php?uid=15141543&do=blog&id=2775960

阅读(830) | 评论(0) | 转发(0) |
0

上一篇:jiffies

下一篇:Makeflie模板(一)

给主人留下些什么吧!~~