gpt4 book ai didi

c - Linux 系统调用如何与文件系统交互

转载 作者:太空狗 更新时间:2023-10-29 11:12:18 25 4
gpt4 key购买 nike

最近我遇到了这个练习:

Given this sequence of system calls in a Linux C language program:

fd = open("f123", O_RDWRT | O_CREAT, 0777);
lseek(fd, 0x1000000L, 0);
write(fd, &fd, sizeof(int));

draw the file system data structures and disk blocks that are modified by these operations, considering a 4 KByte block size, and index block pointers of 4 bytes.

对于第一个系统调用 (open),我意识到它是如何工作的,并以这种方式对其进行了架构化: open system call

现在,跳过 draw 部分(我意识到这很难回答),我想了解如何 lseekwrite 根据 inode 和索引 block (无论它们是什么)工作。

我试过计算 lseek 计算出正确的 inode(因为 block 大小已知),但仍然不知道它实际上是如何工作的。

最佳答案

在 Linux 中,这些系统调用与虚拟文件系统 (VFS) 交互。 VFS 对真实的文件系统进行了抽象,它定义了一些有用的数据结构来组织文件系统。

  • inodes 表示磁盘上的真实文件。通过inodes结构,不仅可以访问inode block ,还可以访问磁盘上的数据 block 。
  • 目录条目 表示路径的一部分。 d_entry 并不总是指磁盘上的真实文件。如果它指的是磁盘上的目录,则会有一个指向目录文件的 inode 结构的指针。
  • file 表示进程打开的文件。结构中还有一个指向其 d_entry 的指针。

以下是 file 结构的片段:

struct file {
// ... other attributes
struct path f_path;
#define f_dentry f_path.dentry
#define f_vfsmnt f_path.mnt
const struct file_operations *f_op;
};
struct file_operations {
// ... other operations
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
}

这些对象都有一个操作列表字段。 VFS 定义这些操作,底层文件系统实现这些操作或使用 VFS 提供的通用实现。

系统调用 open() 创建文件对象,其他系统调用如 lseek() 只需获取 file 对象(通过 Fd)并调用操作列表中相应的函数,如write()会调用f->f_op->write(f, ...),那么文件系统可能跟在后面file -> d_entry -> inode 访问磁盘上文件的路径。

关于c - Linux 系统调用如何与文件系统交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44990909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com