分类: 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