eCryptfs - creat系统调用

时间:2023-01-21 22:22:07

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系统调用

问题:

  1. 系统存在sys_creat()的系统调用,但是发生在什么时候?调试creat系统调用时候,会发现很少的printk输出,但是存在。
  2. 使用vi或者touch等命令,并不会引发creat()系统调用,这是为什么?

解决:

1. 下载coreutils源码。
查看touch部分的源码(目录为:src/touch.c)。
eCryptfs - creat系统调用

这里touch调用了fd_reopen()函数:
eCryptfs - creat系统调用

fd_open()函数调用了open()函数,则即会触发open系统调用。

2. glibc中的creat()函数实现过程。
均使用只写模式!
eCryptfs - creat系统调用
eCryptfs - creat系统调用

3. 下载glibc源码。
查看open()应用层的函数实现过程。
注意weak_alias()里面,使用的别名代替而已。
eCryptfs - creat系统调用

此处为syscall_cancel所执行的具体操作(即为通过参数进行胸膛呢调用)。
eCryptfs - creat系统调用

参考:

1. APUE 3rd中creat解释:
eCryptfs - creat系统调用

2. libc官方文档:
eCryptfs - creat系统调用

eCryptfs - creat系统调用

3. 源码

结论:
1. creat()应用层函数是不直接使用creat系统调用,而是在glibc中的封装函数(open函数)完成对creat的系统调用。
2. touch等操作均使用open()函数+creat标志来创建文件。