在系统调用中访问linux内核的SuperBlock对象

时间:2015-11-07 14:45:35

标签: linux-kernel filesystems system-calls

我正在尝试访问linux / fs.h中定义的超级块对象。 但是如何初始化对象以便我们可以访问它的属性。 我发现alloc_super()用于初始化super,但它是如何调用的?

    #include <fcntl.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <linux/fs.h>




    int main(){

    printf("hello there");

    struct super_block *sb;

    return 0;

    }

1 个答案:

答案 0 :(得分:1)

答案非常依赖于文件系统,因为不同的文件系统将具有不同的超级块布局和实际上不同的块排列。

例如,ext2文件系统超级块位于磁盘上的已知位置(字节1024),并且具有已知大小(sizeof(struct superblock)字节)。

一个典型的实现(这不是一个有效的代码,但可以进行少量修改)你想要的是什么:

struct superblock *read_superblock(int fd) {

  struct superblock *sb = malloc(sizeof(struct superblock));
  assert(sb != NULL);

  lseek(fd, (off_t) 1024, SEEK_SET));
  read(fd, (void *) sb, sizeof(struct superblock));

  return sb;
}

现在,您可以使用linux / headers分配超级块,或者编写与ext2 / ext3 / etc / etc文件系统超级块完全匹配的自己的结构。

然后你必须知道在哪里找到超级块(lseek()来到这里)。

您还需要将磁盘文件名file_descriptor传递给函数。

所以做一个

int fd = open(argv[1], O_RDONLY);

struct superblock * sb = read_superblock(fd);