소개글
파일 시스템의 종류• NTFS: NTFS는 윈도 NT 계열 운영체제의 파일 시스템으로 윈도 2000, 윈도 XP, 윈도 서버 2003, 윈도 서버 2008, 윈도 비스타 등에도 포함되어 있다.
• ext2: meta-data (비 동기, 시간 지연), 복구 시 모든 파일을 검사 (시간이 오래 걸린다.)
복구에 치명적 에러 발생해도 복구 감행(시스템에 치명적 악영향을 미칠 수 있다.)
• ext3: journal(저널, 동기화), 모든 파일을 검사하지 않고 저널을 검사해서 시간이 단축
치명적 에러 발생시 그 데이터를 폐기한다.
...
문제 해결 방법
3.1 블록 정의
typedef struct tagSuperblock
{
char freeblocklist[BLOCK_NUM];
INode inodes[INODE_NUM];
char emptyspace[128];
} Superblock;
SuperBlock 구조체는 128개의 블록 리스트를 가지고 있으며 16개의 INode를 가진다. 그리고 128KB를 맞춰주기 위해서 emptyspace라는 빈 공간을 128 바이트만큼 사용하였다.
typedef struct tagDatablock
{
char data[BLOCK_SIZE];
} Datablock;
데이터 블록의 경우도 개발의 편의를 위하여 구조체로 선언하였다. 이는 1KB만큼의 빈 공간을 소비한다.
3.2 디스크 마운트
void diskMount(const char* pDiskName)
{
int i = 0; // open a file
FS.pFile = fopen(pDiskName, "rb+");
strcpy(FS.diskName, pDiskName);// load blocks into memory
fread(&superblock, sizeof(Superblock), 1, FS.pFile);
fread(&datablocks, sizeof(Datablock), BLOCK_NUM - 1, FS.pFile);
printf("loaded :: %dn", superblock.freeblocklist[1]);
fclose(FS.pFile);
}
시물레이터에서 파일 시스템은 디스크(파일) 저장된다. 따라서 먼서 파일시스템을 사용하기 위해서는 해당 시스템을 마운트 하여야 한다. 이를 정의한 함수는 diskMount이며 파일을 열고 파일시스템을 읽어와서 저장한다.
본 과제에서 몇몇 전역변수를 정리해본다. FS는 전역변수로써 파일 시스템에 대한 이름과 디스크 포인터를 가지고 있다.
컴파일 실행환경
GCC본문내용
Common.c#ifndef _COMMON_H_
#define _COMMON_H_
#define BLOCK_NUM 128
#define BLOCK_SIZE 1024
#define INODE_NUM 16
#define MAX_BLOCK_NUM_PER_FILE 8
#define MAX_FILENAME_LENGTH 8
#define MAX_DISKNAME_LENGTH 128
#endif
#ifndef _SUPERBLOCK_H_
#define _SUPERBLOCK_H_
Superblock.h
#include "common.h"
//#include "inode.h"
typedef struct tagINode
{
char name[8]; //파일명
int size; //파일 크기
int blockPointers[8]; //다이렉트 블록 포인터
char time[5]; //파일의 최종 수정 시간
int used; //inode가 사용되었나 사용 되지 않았나
} INode;
typedef struct tagSuperblock
{
char freeblocklist[BLOCK_NUM];
INode inodes[INODE_NUM];
char emptyspace[128];
} Superblock;
#endif
Shell.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "superblock.h"
#include "common.h"
#include <time.h>
///operation
// disk operation
void diskCreate(const char* pDiskName);
int diskMount(const char* pDiskName);
// file operation
int create(const char* pDiskName, const char* pFileName, int fileSize);
int delete(const char* pDiskName, const char* pFileName);
int read(const char* pDiskName, const char* pFileName, int blockNum, char* pBuf);
int write(const char* pDiskName, const char* pFileName, int blockNum, const char* pBuf);
void ls(void);
void infoDiskFree(void);
/////////////////datablock
typedef struct tagDatablock
{
char data[BLOCK_SIZE];
} Datablock;
void initBlock(void* pBlock);
//////////////////helper
int getNumOfFreeBlock(Superblock* pSuperblock);
INode* getFreeINode(Superblock* pSuperblock);
INode* getINode(Superblock* pSuperblock, const char* pFileName);
Datablock* getFreeBlock(Superblock* pSuperblock, Datablock* pDatablock);
void saveToFile(Superblock* pSuperblock, Datablock* pDatablocks, const char* pDiskName);
//////////////global
typedef struct tagFileSystemInfo
{
FILE* pFile;
char diskName[MAX_DISKNAME_LENGTH];
} FSInfo;
extern FSInfo FS;
extern Superblock superblock;
extern Datablock datablocks[BLOCK_NUM - 1];
// create a filesystem
// args: pDiskName : name of disk containing file system
void diskCreate(const char* pDiskName)
{
Superblock superblock;
Datablock datablock[127];
// initialize superblock
initBlock((void*)&superblock);
superblock.freeblocklist[0] = 1;
// save blocks to a file
saveToFile(&superblock, &datablock, pDiskName);
}
// mount a disk before using, open a file containing filesystem and store the pointer to pFS(global)
// args: pDiskName : name of disk that user want to use
// ret: -1(fail), 0(success)
int diskMount(const char* pDiskName)
{
int i = 0;
// open a file
FS.pFile = fopen(pDiskName, "rb+");
if (FS.pFile == NULL)
return -1;
strcpy(FS.diskName, pDiskName);
// load blocks into memory
fread(&superblock, sizeof(Superblock), 1, FS.pFile);
fread(&datablocks, sizeof(Datablock), BLOCK_NUM - 1, FS.pFile);
printf("loaded successfullyn");
fclose(FS.pFile);
return 0;
}
// create a file in a given size
// args: pDiskName : name of disk containing file system, pFileName : file name to create, filesize : the size of file
// ret: -1(fail), 0(success)
int create(const char* pDiskName, const char* pFileName, int fileSize)
{
// check if it`s available
int numOfFreeBlock;
int i,j;
..
...
압축파일 내 파일목록
코드/os_4/.goutputstream-HQHJJV
코드/os_4/.goutputstream-N4CNJV
코드/os_4/.goutputstream-TRIMJV
코드/os_4/.goutputstream-XMTMJV
코드/os_4/.vimrc
코드/os_4/a.exe.stackdump
코드/os_4/common.h
코드/os_4/compaction.c
코드/os_4/compaction.h
코드/os_4/datablock.c
코드/os_4/datablock.h
코드/os_4/defragmenter.exe.stackdump
코드/os_4/disk0
코드/os_4/disk1
코드/os_4/dynamic_block.h
코드/os_4/dynamic_common.h
코드/os_4/dynamic_defragmenter.c
코드/os_4/dynamic_defragmenter.h
코드/os_4/dynamic_filesystem_sim.exe.stackdump
코드/os_4/dynamic_global.c
코드/os_4/dynamic_global.h
코드/os_4/dynamic_helper.c
코드/os_4/dynamic_helper.h
코드/os_4/dynamic_operation.c
코드/os_4/dynamic_operation.h
코드/os_4/dynamic_shell.c
코드/os_4/ff0
코드/os_4/filesystem_sim.exe.stackdump
코드/os_4/makefile
코드/os_4/myshell.exe.stackdump
코드/os_4/REAEME.txt
코드/os_4/shell.c
코드/os_4/songfile
코드/os_4/superblock.h
코드/os_4/.goutputstream-N4CNJV
코드/os_4/.goutputstream-TRIMJV
코드/os_4/.goutputstream-XMTMJV
코드/os_4/.vimrc
코드/os_4/a.exe.stackdump
코드/os_4/common.h
코드/os_4/compaction.c
코드/os_4/compaction.h
코드/os_4/datablock.c
코드/os_4/datablock.h
코드/os_4/defragmenter.exe.stackdump
코드/os_4/disk0
코드/os_4/disk1
코드/os_4/dynamic_block.h
코드/os_4/dynamic_common.h
코드/os_4/dynamic_defragmenter.c
코드/os_4/dynamic_defragmenter.h
코드/os_4/dynamic_filesystem_sim.exe.stackdump
코드/os_4/dynamic_global.c
코드/os_4/dynamic_global.h
코드/os_4/dynamic_helper.c
코드/os_4/dynamic_helper.h
코드/os_4/dynamic_operation.c
코드/os_4/dynamic_operation.h
코드/os_4/dynamic_shell.c
코드/os_4/ff0
코드/os_4/filesystem_sim.exe.stackdump
코드/os_4/makefile
코드/os_4/myshell.exe.stackdump
코드/os_4/REAEME.txt
코드/os_4/shell.c
코드/os_4/songfile
코드/os_4/superblock.h