플로피 디스크 이미지를 만들어서 mount하자!

뭐 찾아보면 이런프로그램 있을거 같지 말입니다..

그것도 아니면 그냥 이미지 자체를 다운 받거나 ㅋ

하지만 그냥 작년에 배운 fat파일 시스템 연습하는겸,

디스켓이미지가 필요한일도 있어서 함 만들어 봤어요 ㅋ
/*
* =====================================================================================
*
* Filename: main.c
*
* Description: 플로피디스크 이미지 만들어주는 프로그램
*
* Version: 1.0
* Created: 2008년 05월 31일 21시 41분 41초
* Revision: none
* Compiler: gcc
*
* Author: first_name last_name (fl), fl@my-company.com
* Company: my-company
*
* =====================================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

/* define data type */
#define BYTE unsigned char
#define DBYTE unsigned short int
#define DWORD unsigned int /* 음 따지자면 틀린건가? ㅋ */

/* floppy disk spec */
#define FLOPPY_DISK_SIZE 1474560 /* */
#define BASIC_BUFFER_SIZE 1024
#define FLOPPY_INIT_COUNT 1440

/* for dos-table */
#define MSDOS_SIANATURE 0x55,0xAA /* */
#define MSDOS_SIANATURE_LOCAL 0x1fe

/* for fat12 */
#define INT_ETC_VAL 0xF0,0xFF,0xFF /* */

/* floppy disk write */
typedef struct _floppy
{
/* bit write */
unsigned init_jump:8*3;
char ipl_name[8];
DBYTE byte_per_sector;
BYTE sector_per_cluster;
DBYTE reserved_sector_count;
BYTE num_fats;
DBYTE boot_entry_count;
DBYTE total_sector_12;
BYTE media;
DBYTE fat_size12;
DBYTE sector_per_track;
DBYTE number_of_heads;
DWORD hidden_sector;
DWORD total_sector_32;
BYTE drive_number;
BYTE reseved1;
BYTE boot_signature;
DWORD volume_id;
char volume_label[11];
char file_system_type[8];
/* not padding ! */
} __attribute__ ((packed)) Floppy;

void init ( int fd )
{
char buffer[BASIC_BUFFER_SIZE] = {0x00};
int i;

for(i = 0;i < FLOPPY_INIT_COUNT; i ++)
write(fd,buffer,sizeof(buffer));

} /* ----- end of function init ----- */

void write_ipl( int fd )
{
Floppy fda;

memset((void *)&fda,0,sizeof(fda));

fda.init_jump =0x904eeb;
memcpy(&fda.ipl_name,"LowidIPL",8);
fda.byte_per_sector =512;
fda.sector_per_cluster =1;
fda.reserved_sector_count =1;
fda.num_fats =2;
fda.boot_entry_count =224;
fda.total_sector_12 =2880;
fda.media =0xf0;
fda.fat_size12 =9;
fda.sector_per_track =18;
fda.number_of_heads =2;
fda.hidden_sector =0;
fda.total_sector_32 =2880;
fda.drive_number =0x00;
fda.reseved1 =0x00;
fda.boot_signature =0x29;
fda.volume_id =0xffffffff;
memcpy(&fda.volume_label,"LowidFLOPPY",11);
memcpy(&fda.file_system_type,"FAT12 ",8);

lseek(fd,0,SEEK_SET);
write(fd,&fda,sizeof(fda));
} /* ----- end of function write_mdr ----- */

void write_signature ( int fd )
{
char init_byte[3]={INT_ETC_VAL};
char msdos_signature[2]={MSDOS_SIANATURE};

/* for msdos */
lseek(fd,MSDOS_SIANATURE_LOCAL,SEEK_SET);
write(fd,msdos_signature,sizeof(msdos_signature));

/* for fat12 what? 0x200? ,0x1400? */
lseek(fd,0x200,SEEK_SET);
write(fd,init_byte,sizeof(init_byte));
lseek(fd,0x1400,SEEK_SET);
write(fd,init_byte,sizeof(init_byte));
} /* ----- end of function init_000200 ----- */

int main ( int argc, char *argv[] )
{
int fd;

if( argc != 2 ){
fprintf(stderr,"만들 디스크 이미지명을 입력해 주세요\n" \
"Useage : %s create_filename\n",argv[0]);
exit(EXIT_FAILURE);
}

if( ( fd = open(argv[1],O_EXCL | O_CREAT | O_WRONLY,00644)) == -1){
perror("파일 열기 실패");
exit(EXIT_FAILURE);
}

init(fd);
write_ipl(fd);
write_signature(fd);

close(fd);

return EXIT_SUCCESS;
} /* ---------- end of function main ---------- *


별 주석달것도 없습니다..



fat파일 시스템만 안다면 별 문제 없을듯.


이거 자세한 정보는 한빛문화사 홈피에서 fat치면 아마 나올거에요

제가 작년인가 포스팅할때 주소도 적어놨었는데 ㅋㅋ

거기가면 기본값이랑 범위같은게 상세히 공개되어있어요..

그대로 프로그래밍 하면 되니까 정말 어려울것도 없다는..

소스바연.. 값들 넣는거 때문에 그렇지 별 내용은 없는겁니다

이 약간 내용이 있기는 합니다.


구조체에서 bit로 선언하는거 - (ex>unsigned bla:1; ->이건 1bit - one or zero)

bit 선언에서는 int,unsigned 밖에 없지 말입니다....

위에 상황같은데 쓰는거보단 bool형 같은거 쓸때 좋죠..


또 padding 없는 구조체 (물론gcc, 윈도우에선 #progma로 하던가요? )

ex> __attribute__ ((packed)) Name;

다 아시겠지만 구조체를 sizeof하면 원래 크기가 다르죠. 4byte(cpu에 따라 다르겠지만) 마다 할당하니까요

위에 ipl만들때는 바이트수 철저히 따져서 입력해야하기 때문에 저렇게 쓴것이지만요.


사용법 $./filename image_name
마운트법 $mount -o loop image_name
확인 $df -T

그리고 플로피디스크 쓰듯이 쓰면댐



마운트후 디랙토리 만들기 삭제 파일생성.. 잘되네요 ㅋㅋㅋ

리눅스는 디바이스도 파일처럼 다룰수 있어서 편하지 말입니다~
(뭐 지금의 경우는 반대지만)

덧> 요즘에는 시간이 좀 남지 말입니다~ 그래서 학기중에 못했던(중간고사 끝날때부터 딱 저번주 까지 정말 바빳던..ㅋ)
포스팅도 좀 자주(?) 하는데...

다음주부터 또 시험크리때문에 포스팅을 제대로 할수 있을지 의문이에요 ㅜㅜ

추가> qemu -fda 옵션 붙이면 qemu가 죽습니다? 우아아앙~ 왜이래?? boot jump code가 잘못?