eCryptfs - read/write系统调用
README
- 作者:邢万里
- 学校:重庆邮电大学
- email:wlxing@yahoo.com
入口(系统调用include/linux/syscall.h)
由于安全上的一些问题,2.6和3.x系类的系统调用改动幅度有些偏大。系统调用均经过如下代码进行“过滤”:
#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
这里的read/write系统调用对应的是SYSCALL_DEFINE3
,而SYSCALL_DEFINEx
实现如下:
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \
static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \
{ \
__SC_TEST##x(__VA_ARGS__); \
return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__)); \
} \
SYSCALL_ALIAS(sys##name, SyS##name); \
static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
VFS层(系统调用fs/read_write.c)
如下是read/write系统调用对应的具体函数,我这里略去了异常处理和一些其他细节代码,剩余的代码是核心部分。可以很清楚的看到两个系统调用都是用vfs_[read/write]机制。
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
ret = vfs_read(file, buf, count, &pos);
}
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
size_t, count)
{
ret = vfs_write(file, buf, count, &pos);
}
eCryptfs层(fs/ecryptfs/main.c)
如下部分的数据结构即为前文说到的VFS机制到具体的文件系统。由.read
到generic_read_dir
,即由VFS到eCryptfs。
const struct file_operations ecryptfs_dir_fops = {
.read = generic_read_dir,
};
const struct file_operations ecryptfs_main_fops = {
.read = do_sync_read,
.write = do_sync_write,
};
此时只需查询eCryptfs中对应的函数是如何完成具体的操作了。