2016-11-20 1 views
0

私は単純なファイルシステム(Linuxカーネル)を開発しようと、私は使用/空きブロックを追跡するためにビットマップを使用してと思っていますが、ここで説明したようにビットマップCの実装:フリースペース

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

しかし、私はCでそのようなシステムの実装を見つけることができませんでした。私は私のシステムに同様のことを実装できるようにいくつかの例を見たいと思います。

私はそれらを見つけることができる任意の提案?

答えて

2

これは私がこの質問を読んだ後に作成した簡単な実装です。

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; 
} 

基本的な考え方は、割り当てられたフレームのトラックを保持するビットマップを維持することです。各フレームは固定サイズのバッファとして動作します。フレームを終了したら、ビットマップでビットをオフにして、それをフリーにすることができます。

+0

ありがとうございます。これは非常に参考になります..気にしなければ私はいくつかの質問をしています。なぜブロックカウントであなたの部門で32を選んだのですか?各ブロックに32フレームがあると仮定していますか?私はなぜあなたは4とモードを持っていないのですか? – Salma

+1

@サルマ私の**ビットマップ**は符号なし整数配列として定義されているからです。整数は32バイトを意味する4バイトを有する。 そして、そう、** mod 4 **悪いです。 :p – amaneureka

+1

より具体的には、そのビットマップは、32フレームのサイズとは関係のない整数配列として表現されたちょうどビットの行列です。 – amaneureka

関連する問題