自由空间位图C实现

时间:2016-11-20 08:10:26

标签: c bitmap operating-system filesystems

我尝试开发一个简单的文件系统(Linux内核),并且我正在考虑使用位图来跟踪使用/空闲块,如下所述:

https://en.wikipedia.org/wiki/Free_space_bitmap

但是,我在C中找不到这样的系统的任何实现。我想看一些例子,所以我可以对我的系统实现类似的东西。

有什么建议可以找到它们吗?

1 个答案:

答案 0 :(得分:3)

这是我在阅读完这个问题后所做的快速实施。

int mem_block_size;
int mem_block_count;
uint *bit_map;
char *buffer;

void init_memory_map(int block_size, int block_count)
{
    mem_block_size = block_size;
    mem_block_count = block_count;
    buffer = (char*)malloc(block_size * block_count);
    bit_map = (uint*)calloc((block_count / 32) + ((block_count % 32) != 0), 4);
}

inline
int is_allocated(int index)
{
    return (bit_map[index / 32] & (1 << (index % 32))) != 0;
}

inline
void allocate_frame(int index)
{
    bit_map[index / 32] |= 1 << (index % 32);
}

inline
void clear_frame(int index)
{
    bit_map[index / 32] &= ~(1 << (index % 32));
}

char* allocate_block(int block_count)
{
    int index = 0, free_frames = 0;
    while(index < mem_block_count)
    {
        if (!is_allocated(index))
        {
            free_frames++;
            if (free_frames == block_count)
            {
                int frame_index = index - block_count + 1;

                index = 0;
                while(index < block_count)
                {
                    allocate_block(frame_index + index);
                    index++;
                }
                return (buffer + frame_index * mem_block_size);
            }
        }
        else free_frames = 0;
        index++;
    }

    perror("memory error\n");
    return 0;
}

基本思想是,你保留一个位图,用于保存已分配帧的轨迹。每个帧都作为固定大小的缓冲区。完成帧后,您可以通过在位图中设置位来标记它。