C implementation of a basic FAT file system
- Lucas Ranzi & Renan Carvalho
- 13 de nov. de 2016
- 3 min de leitura
1 Introdução
A fim de compreender o comportamento do sistema operacional, será desenvolvido um sistema de arquivo FAT, para reforçar no aprendizado sobre implementação de sistemas de arquivos, aplicando manipulação na estrutura em dispositivos de armazenamento secundário.
2 Desenvolvimento do Trabalho
O trabalho será desenvolvido na linguagem de programação C, em decorrência da facilidade para manipular estruturas de dados em arquivos, simulando o comportamento de um sistema de arquivos em disco.
O sistemas de arquivos utiliza métodos de alocação de blocos encadeados, considerando setores de 512 bytes. O diretório raiz armazena uma lista de nomes de arquivos, tamanho, ponteiro para o bloco inicial do arquivo ou ponteiro para diretório. Serão reservados os 8 setores iniciais do disco simulado para o diretório raiz.
Os setores são numerados de 0 a n. O sistema de arquivos utiliza 4 bytes (32 bits) para numeração dos blocos. Assim, são possíveis 2^32 blocos de 512 bytes cada, totalizando 2 terabytes de espaço total suportado pelo sistema de arquivos. O sistema de arquivos utiliza mapeamento de blocos livres por encadeamento. O diretório raiz ocupa 8 setores e inicia no setor 0. Os primeiros 4 bytes (32 bits) do diretório raiz consistem em um ponteiro para o primeiro bloco livre. O restante consiste nas entradas de diretório formadas por nome (20 bytes incluindo terminador null), tamanho 4 bytes (32 bits) e ponteiro para o bloco de índice 4 bytes (32 bits). Abaixo o diretório raiz em detalhes.
Estrutura para cada entrada da tabela de diretórios. O membro dir indica se é arquivo ou diretório, 0 para arquivo e 1 para diretório.
2.1 Regras e Desenvolvimento
Foram criados métodos genéricos para reutilização durante o código, como exemplo: “void save(FILE * sys, void * p, int size, int position);”.
2.2 Init_system
Durante a execução do sistema, é possível criar um arquivo “.bin” de qualquer tamanho, a fim de poder armazenar mais informações. Este método, reserva 8 setores de 512 bytes cada, para raiz e o restante, será criado estruturas de “sectores” de forma encadeada, assim um setor referenciando o próximo. Logo, este encadeamento facilita a manipulação de arquivos e setores.
2.3 Create_file
Quando o arquivo é criado, o sistema realiza uma averiguação de caminho, a fim de verificar se o arquivo ficará na raiz ou subdiretório. Neste momento é buscado no “arquivo.bin” a lista da raiz “header”. Sendo diretório o sistema vai até o subdiretório, grava as informações básicas na lista de dados e cria setores com os dados do arquivo, entretanto, se for gravado direto na raiz, o sistema recupera o primeiro setor livre, grava as informações básicas na raiz e salva os dados nos setores.
2.3 Read_file
Também é possível fazer a leitura de um arquivo direto na raiz e/ou na pasta. A lógica é equivalente ao método “create_file“, entretanto, o sistema realiza a leitura dos dados nos setores e cria no local destino dentro do sistema operacional.
2.4 Delete_file
Em relação a deletar o arquivo, atualmente é possível quando o arquivo está na raiz, entretanto, quando o arquivo está na subpasta, não houve implementação.
A lógica para excluir o arquivo, provém acessar a “root“, procurar o nome do arquivo na raiz, com o “start” acessar o setor e realizar a lógica de referenciação.
Verifica quem está no “free_blocks_list”, altera o valor para o último setor limpo do arquivo e referência o “free_blocks_list” para o primeiro setor limpo onde continham os dados do arquivo, exemplo:

2.5 Create_dir
Para criar um diretório, o sistema verifica se não é um arquivo, realiza a leitura da “root”, vai percorrendo todos os subdiretórios até a última pasta especificada, verifica se não existe, caso não existir, cria e salva todos os dados na “.bin”.
2.6 Delete_dir
Na exclusão de pasta, o sistema verifica se não existe nenhum arquivo dentro da pasta especificada. Caso exista, o sistema não exclui, entretanto, estando vazia o sistema deleta a pasta especificada e libera os setores, conforme a lógica de exclusão de arquivos.
2.7 ls_dir
Para listar os dados, o sistema percorre desde a pasta raiz até a solicitada e demonstrar as informações no formato: “d quarto” e/ou “f img.jpeg 4025 bytes”.
A todo momento, a busca da “root” é realizada para verificar diretório livre e localização dos existentes.
3.0 Analogia
Nosso sistema, foi baseado na construção e ensinamentos fornecidos pelo professor, na internet existem algumas referências, com implementação em C https://github.com/charlieegan3/fat-filesystem, e http://codeandlife.com/2012/04/02/simple-fat-and-sd-tutorial-part-1/ . Juntamente com esclarecimentos de dúvidas e analogia com o que atualmente existe, conseguimos desenvolver nosso sistema.
4.0 Conclusão
Conseguimos demonstrar o comportamento de um arquivo de sistema FAT, de modo simples e genérico, possibilitando criar arquivo “.bin” de qualquer tamanho.
Com nossa computação lógica e criando algoritmos genéricos, conseguimos otimizar a execução, compreender a criação de setores, alocação de dados, o que futuramente podemos reutilizar esta lógica para os diversos tipos de problemas que ensejam programação de sistema FAT.
Segue, o link com o arquivo disponível para baixar: https://github.com/RenanCS/C-implementation-of-a-basic-FAT-file-system-
Kommentare