'__attribute__'에 해당되는 글 1건
- 2008.06.01 플로피 디스크 이미지를 만들어서 mount하자! 5
플로피 디스크 이미지를 만들어서 mount하자!
Programming/C 2008. 6. 1. 14:10
뭐 찾아보면 이런프로그램 있을거 같지 말입니다..
그것도 아니면 그냥 이미지 자체를 다운 받거나 ㅋ
하지만 그냥 작년에 배운 fat파일 시스템 연습하는겸,
디스켓이미지가 필요한일도 있어서 함 만들어 봤어요 ㅋ
그것도 아니면 그냥 이미지 자체를 다운 받거나 ㅋ
하지만 그냥 작년에 배운 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가 잘못?
'Programming > C' 카테고리의 다른 글
리눅스용 한글2008 체험판 크랙하기 (26) | 2009.04.26 |
---|---|
이거 왜이래~! (6) | 2009.04.02 |
좋은 프로그래밍 습관이란 책을 읽고. (0) | 2008.02.02 |
오늘 할짓 없어서 한 뻘짓. (4) | 2008.01.24 |
메모리 직접 접근의 유용성 (memcpy) (3) | 2007.07.01 |