eCryptfs - creat系统调用
README
- 作者:邢万里
- 学校:重庆邮电大学
- email:wlxing@yahoo.com
- 注:现在正处于淘汰中(i386仍然使用)。如3.3.8内核解释:
/*
* For backward compatibility? Maybe this should be moved
* into arch/i386 instead?
*/
封装(系统调用fs/open.c)
注:
1. 在阅读creat系统调用前,一定要阅读open系统调用。touch/vi/mkdir等操作均不会引发此系统调用(都是使用open(…,O_CREAT,…)操作,即为系统调用),强烈推荐strace命令去检索进程是否执行系统调用,命令如下:#strace -o log touch file,此处所有的记录全部保存在log中,strace跟踪touch file此操作(或称进程)。
2. creat单词拼写上不同于create(据说,这是创作者一直非常懊悔的一点,因为单词漏写了一个“e”)。这里创建的系统调用是sys_creat()
函数。所有的系统调用存在于include\linux\syscalls.h中,读者可以自己查看具体的名称。
封装函数如下,这里是全部代码,可以看出creat()系统调用其实是使用了open()系统调用,open系统调用中有一部分会判断文件是否存在,如果不存在则需要新建文件,然后打开。creat的实现部分就包含在此处。
SYSCALL_DEFINE2(creat, const char __user *, pathname, umode_t, mode)
{
return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
}
函数调用过程:SYSCALL_DEFINE3()
函数 -> do_sys_open()
函数 -> do_filp_open()
函数 -> path_openat()
函数 -> do_last()
函数 ->vfs_create()
函数
int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
struct nameidata *nd)
{
error = dir->i_op->create(dir, dentry, mode, nd);
}
eCryptfs层(fs/ecryptfs/main.c)
如下部分的数据结构即为前文说到的VFS机制到具体的文件系统。由.create到ecryptfs_create,即由VFS到eCryptfs。
const struct inode_operations ecryptfs_dir_iops = {
.create = ecryptfs_create,
};
拦截creat系统调用
问题:
- 系统存在sys_creat()的系统调用,但是发生在什么时候?调试creat系统调用时候,会发现很少的printk输出,但是存在。
- 使用vi或者touch等命令,并不会引发creat()系统调用,这是为什么?
解决:
1. 下载coreutils源码。
查看touch部分的源码(目录为:src/touch.c)。
这里touch调用了fd_reopen()函数:
fd_open()函数调用了open()函数,则即会触发open系统调用。
2. glibc中的creat()函数实现过程。
均使用只写模式!
3. 下载glibc源码。
查看open()应用层的函数实现过程。
注意weak_alias()里面,使用的别名代替而已。
此处为syscall_cancel所执行的具体操作(即为通过参数进行胸膛呢调用)。
参考:
1. APUE 3rd中creat解释:
2. libc官方文档:
3. 源码
结论:
1. creat()应用层函数是不直接使用creat系统调用,而是在glibc中的封装函数(open函数)完成对creat的系统调用。
2. touch等操作均使用open()函数+creat标志来创建文件。