• LF몰 이벤트
  • 파일시티 이벤트
  • 캠퍼스북
  • 서울좀비 이벤트
  • 탑툰 이벤트
  • 닥터피엘 이벤트
  • 아이템베이 이벤트
  • 아이템매니아 이벤트

OS 파일 시스템 구현

*지*
최초 등록일
2011.11.02
최종 저작일
2010.10
파일확장자 압축파일
가격 2,000원 할인쿠폰받기
다운로드
장바구니

소개글

파일 시스템의 종류
• 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

참고 자료

없음
*지*
판매자 유형Bronze개인

주의사항

저작권 자료의 정보 및 내용의 진실성에 대하여 해피캠퍼스는 보증하지 않으며, 해당 정보 및 게시물 저작권과 기타 법적 책임은 자료 등록자에게 있습니다.
자료 및 게시물 내용의 불법적 이용, 무단 전재∙배포는 금지되어 있습니다.
저작권침해, 명예훼손 등 분쟁 요소 발견 시 고객센터의 저작권침해 신고센터를 이용해 주시기 바랍니다.
환불정책

해피캠퍼스는 구매자와 판매자 모두가 만족하는 서비스가 되도록 노력하고 있으며, 아래의 4가지 자료환불 조건을 꼭 확인해주시기 바랍니다.

파일오류 중복자료 저작권 없음 설명과 실제 내용 불일치
파일의 다운로드가 제대로 되지 않거나 파일형식에 맞는 프로그램으로 정상 작동하지 않는 경우 다른 자료와 70% 이상 내용이 일치하는 경우 (중복임을 확인할 수 있는 근거 필요함) 인터넷의 다른 사이트, 연구기관, 학교, 서적 등의 자료를 도용한 경우 자료의 설명과 실제 자료의 내용이 일치하지 않는 경우
최근 본 자료더보기
탑툰 이벤트
OS 파일 시스템 구현
  • 레이어 팝업
  • 레이어 팝업
  • 레이어 팝업