创建文件系统,需要C建议

时间:2013-10-15 20:41:26

标签: c unix filesystems

我正在用C构建这个文件系统。目前我正处于分配的第一步,这就是创建一个在内存中工作的简单文件系统。我的问题更多地基于C而不是Unix文件系统。我试图“模仿”原始磁盘。我有以下结构:

struct disk {
    void *data;
    unsigned int numOfBlocks;
};

让我们假设这个磁盘上的一个块将是512字节(就像原来的Unix文件系统一样)。我定义了一些函数来创建磁盘,从磁盘读取和写入磁盘。然后我的工作是实现各种事情,如数据块,i节点块,超级块等。

查看上面的void *data变量。我希望这是一个二维数组。它应该是一个块数组的数组。所以...最有意义的是使用这样的东西。

unsigned char *data[30][512]; // Assuming the disk holds 30 blocks of 512 bytes each

问题在于:如果我定义了其他结构来表示i节点,超级块或数据块,并且每个结构的struct大小都是512字节,那我该如何正确地进行转换?这个unsigned char *到i-node struct,还是数据struct等?

感谢。

2 个答案:

答案 0 :(得分:1)

我不确定我理解这个问题。

根据你的说法: My question isn't how to access the characters in the data variable...it's how to take a 512 byte array of unsigned char for instance and convert it to some other type of struct that is 512 bytes long.

如果你有:

unsigned char block[512];

//total struct size: 512 bytes
struct something {
     //members here
};

你可以这样做:

int main(void)
{
    struct something *ptr;
    ptr = block;
    return 0;
}

您可以使用数组字节来保存结构数据。为避免警告,请转发地址:

ptr = (struct something *)block;

为指针分配内存后,您可以像往常一样使用它。

注意:我可能是错的,因为我是初学者。

答案 1 :(得分:0)

void指向任何事情,所以如果你能控制void *的含义,那么你的定义就足够了。

要将data作为二维数组进行访问,您只需要转换类型((char (*)[512])data

char *array[512] = data;
byte = array[x][y];

编译器不需要知道第二维的大小,您有责任确保您的程序永远不会访问无效的位置。