'Programming'에 해당되는 글 91건
- 2007.07.21 부트섹터에서 프로그램 실행시키기. 14
- 2007.07.01 메모리 직접 접근의 유용성 (memcpy) 3
- 2007.06.28 리눅스에서 2기가 이상인 파일에 접근하기 4
- 2007.06.18 압축플때 쓰는 쉘 스크립트 4
- 2007.06.17 MBR(?) 출력 하기 2
부트섹터에서 프로그램 실행시키기.
Programming/System 2007. 7. 21. 18:29
;파일 시스템을 배운 보람(?) 이 있습니다..
;저기 FAT12다루는 부분.. FAT16이랑 비슷합니다..
;파일시스템도 fat만 거의 다 끝내놓고 더이상 진적이 없는..
;과연 스터디는 할수 있을지..
;모책을 보고 있는 예제를 혼자서 비스므리 하게 짜봤습니다
;모르는 부분은 상당히 보고 했으므로 비슷한 부분이 많을듯.
;nask라는 이상한(?) 어셈블러로 해서 nasm이랑 약간 문법이 틀린데가 있습니다
;resb는 nasm의 times로 어떻게 대체 가능한합니다.
;부트섹터에서 부트섹터 외에 있는 프로그램으로 이동시켜서 실행하게 해주는 프로그램이
;부트로더인모양? 초보라 잘 모르겠네요.
;개인 기억용, 틀려도 절대 책임같은건 지지 않음..(아마 틀린거 많을걸?)
;영어에 태클 걸지 말것!
;저기 FAT12다루는 부분.. FAT16이랑 비슷합니다..
;파일시스템도 fat만 거의 다 끝내놓고 더이상 진적이 없는..
;과연 스터디는 할수 있을지..
;모책을 보고 있는 예제를 혼자서 비스므리 하게 짜봤습니다
;모르는 부분은 상당히 보고 했으므로 비슷한 부분이 많을듯.
;nask라는 이상한(?) 어셈블러로 해서 nasm이랑 약간 문법이 틀린데가 있습니다
;resb는 nasm의 times로 어떻게 대체 가능한합니다.
;부트섹터에서 부트섹터 외에 있는 프로그램으로 이동시켜서 실행하게 해주는 프로그램이
;부트로더인모양? 초보라 잘 모르겠네요.
;개인 기억용, 틀려도 절대 책임같은건 지지 않음..(아마 틀린거 많을걸?)
;영어에 태클 걸지 말것!
부연설명 (잊어버릴까봐..)
mov ax,0 ; ax = 0
int 0x10 ;번호에 해당하는 인터럽트 발생
(쉽게 말해 ax,bx,cx,dx,같은게 인자고 이걸사용하면 함수를 부르는거라 생각하면 될듯)
inc ax ; ax ++
dec ax ; ax--
add ax,3 ; ax = ax + 3
sub ax,3 ; ax = ax - 3
cmp ax,3 ; if문, ax가 (뒤에 따라 점프)
jmp lable; goto label
jc : jump carry,에러가 난다면.. 점프
je ; jump equal 같으면 점프
jb ; jemp below 작으면 점프
jbe ; jemp below equal 작거나 같으면 점프
jnc ; jemp not carry
db ; byte (db 0x00 이면 현재위치에 1byte 만큼 0을 쓴다 라는 뜻인듯)
dw ;word (마찬가지)
dd ; double word (마찬가지)
[] ; c와 같다(배열과 포인터에 나오는 그거임... *(변수))
$ ; 현재 위치
resb ; 0로 범위까지 채운다 (nasm에는 없음 times로 대체)
mov ax,0 ; ax = 0
int 0x10 ;번호에 해당하는 인터럽트 발생
(쉽게 말해 ax,bx,cx,dx,같은게 인자고 이걸사용하면 함수를 부르는거라 생각하면 될듯)
inc ax ; ax ++
dec ax ; ax--
add ax,3 ; ax = ax + 3
sub ax,3 ; ax = ax - 3
cmp ax,3 ; if문, ax가 (뒤에 따라 점프)
jmp lable; goto label
jc : jump carry,에러가 난다면.. 점프
je ; jump equal 같으면 점프
jb ; jemp below 작으면 점프
jbe ; jemp below equal 작거나 같으면 점프
jnc ; jemp not carry
db ; byte (db 0x00 이면 현재위치에 1byte 만큼 0을 쓴다 라는 뜻인듯)
dw ;word (마찬가지)
dd ; double word (마찬가지)
[] ; c와 같다(배열과 포인터에 나오는 그거임... *(변수))
$ ; 현재 위치
resb ; 0로 범위까지 채운다 (nasm에는 없음 times로 대체)
;main
;Program start place
ORG 0x7c00
;#define READ_CYRINDERS 10
READ_CYLINDER EQU 10
;FAT12 Boot record setting
jmp init_register ;Jump boot code (3byte)
db 0x90 ;padding (jump boot code)
db "Lowid " ;OEM Name (8byte)
dw 512 ;Bytes per secter
db 1 ;Secter per Cluster
dw 1 ;Reserved Secter count
db 2 ;Number of fats
dw 224 ;Boot entry count
dw 2880 ;Total secter 16
db 0xf0 ;Media(now,floppy disk)
dw 9 ;Fat size 16
dw 18 ;Sector per track
dw 2 ;Number of heads
dd 0 ;Hidden secter (no use partition)
dd 2280 ;Total secter32?? (drive size)
db 0 ;Drive Number
db 0 ;Reseved1
db 0x29 ;Boot signature(must 0x29?)
dd 0xffffffff ;Volume serial num??
db "Lowid_vol " ;Volume label (11byte)
db "FAT12 " ;Filesystem Type (8byte)
resb 18
init_register:
mov ax,0
mov sp,0x7c00
mov ds,ax
mov ss,ax
;(Read)Segment + offset
mov ax,0x0820
mov es,ax
mov bx,0
;init_CHS
mov ch,0 ;Cyrinder
mov dh,0 ;Head
mov cl,2 ;Sector
init_di_register:
mov di,0 ;error count
read_disk:
mov ah,0x02 ;read_mode
mov al,1 ;read secter size
mov dl,0 ;drive
int 0x13 ;disk nterrupt
jnc succeed ;no error.. jump (read)succeed
;error
inc di ;di ++
cmp di,5 ;if 5
je error ;equal.. goto error
jmp read_disk
print:
mov al,[si] ;print character
mov ah,0x0e ;mode
mov bh,0x15 ;color
int 0x10 ;video interrupt
inc si
cmp al,0
je finish
jmp print
error:
mov si,error_string
jmp print
;MAX(floppy disk?) - cylinder:40, head:2 sector:18
;cylinder:0 head:0 sector:1
;cylinder:0 head:0 sector:2
;cylinder:0 head:0 sector:3
; .......
;cylinder:0 head:0 sector:17
;cylinder:0 head:0 sector:18
;cylinder:0 head:1 sector:1
;cylinder:0 head:1 secter:2
; .......
;cylinder:0 head:1 secter:17
;cylinder:0 head:1 secter:18
;cylinder:1 head:0 secter:1
succeed:
;Move Segment and offset
mov ax,es
add ax,512/16
mov es,ax
;Read 18 secter
inc cl
cmp cl,18
jbe init_di_register
;Read 2 head
mov cl,0 ;init secter
inc dh
cmp dh,2
jb init_di_register
;Read 10 cylinder
mov dh,0 ;init head
inc ch
cmp ch,READ_CYLINDER
jb init_di_register
;All compleate!.. print succeed
mov si,succeed_string
jmp print
;jemp! (video file)
finish:
jmp 0xc200
error_string:
db "Read Failed - Check please!!"
db 0x0a,0x00
succeed_string:
db "Read Succeed - Check OK !!"
db 0x0a,0x00
;for Dos Table Signature
resb 0x7dfe - $ ;padding(0)
db 0x55,0xaa ;Dos Table Signature
;Program start place
ORG 0x7c00
;#define READ_CYRINDERS 10
READ_CYLINDER EQU 10
;FAT12 Boot record setting
jmp init_register ;Jump boot code (3byte)
db 0x90 ;padding (jump boot code)
db "Lowid " ;OEM Name (8byte)
dw 512 ;Bytes per secter
db 1 ;Secter per Cluster
dw 1 ;Reserved Secter count
db 2 ;Number of fats
dw 224 ;Boot entry count
dw 2880 ;Total secter 16
db 0xf0 ;Media(now,floppy disk)
dw 9 ;Fat size 16
dw 18 ;Sector per track
dw 2 ;Number of heads
dd 0 ;Hidden secter (no use partition)
dd 2280 ;Total secter32?? (drive size)
db 0 ;Drive Number
db 0 ;Reseved1
db 0x29 ;Boot signature(must 0x29?)
dd 0xffffffff ;Volume serial num??
db "Lowid_vol " ;Volume label (11byte)
db "FAT12 " ;Filesystem Type (8byte)
resb 18
init_register:
mov ax,0
mov sp,0x7c00
mov ds,ax
mov ss,ax
;(Read)Segment + offset
mov ax,0x0820
mov es,ax
mov bx,0
;init_CHS
mov ch,0 ;Cyrinder
mov dh,0 ;Head
mov cl,2 ;Sector
init_di_register:
mov di,0 ;error count
read_disk:
mov ah,0x02 ;read_mode
mov al,1 ;read secter size
mov dl,0 ;drive
int 0x13 ;disk nterrupt
jnc succeed ;no error.. jump (read)succeed
;error
inc di ;di ++
cmp di,5 ;if 5
je error ;equal.. goto error
jmp read_disk
print:
mov al,[si] ;print character
mov ah,0x0e ;mode
mov bh,0x15 ;color
int 0x10 ;video interrupt
inc si
cmp al,0
je finish
jmp print
error:
mov si,error_string
jmp print
;MAX(floppy disk?) - cylinder:40, head:2 sector:18
;cylinder:0 head:0 sector:1
;cylinder:0 head:0 sector:2
;cylinder:0 head:0 sector:3
; .......
;cylinder:0 head:0 sector:17
;cylinder:0 head:0 sector:18
;cylinder:0 head:1 sector:1
;cylinder:0 head:1 secter:2
; .......
;cylinder:0 head:1 secter:17
;cylinder:0 head:1 secter:18
;cylinder:1 head:0 secter:1
succeed:
;Move Segment and offset
mov ax,es
add ax,512/16
mov es,ax
;Read 18 secter
inc cl
cmp cl,18
jbe init_di_register
;Read 2 head
mov cl,0 ;init secter
inc dh
cmp dh,2
jb init_di_register
;Read 10 cylinder
mov dh,0 ;init head
inc ch
cmp ch,READ_CYLINDER
jb init_di_register
;All compleate!.. print succeed
mov si,succeed_string
jmp print
;jemp! (video file)
finish:
jmp 0xc200
error_string:
db "Read Failed - Check please!!"
db 0x0a,0x00
succeed_string:
db "Read Succeed - Check OK !!"
db 0x0a,0x00
;for Dos Table Signature
resb 0x7dfe - $ ;padding(0)
db 0x55,0xaa ;Dos Table Signature
;video
ORG 0xc200
;VGA 320x200x8bit
mov al,0x13
mov ah,0x00
int 0x10
finish:
hlt
jmp finish
ORG 0xc200
;VGA 320x200x8bit
mov al,0x13
mov ah,0x00
int 0x10
finish:
hlt
jmp finish
'Programming > System' 카테고리의 다른 글
mmap 사용시 알아둘 사항 (버스오류) (0) | 2010.05.31 |
---|---|
FAT12과 FAT16의 부트레코드의 구성이 같은모양인가 보다 (2) | 2007.07.27 |
압축플때 쓰는 쉘 스크립트 (4) | 2007.06.18 |
MBR(?) 출력 하기 (2) | 2007.06.17 |
screen attach dettach 구별법 (2) | 2007.02.12 |
메모리 직접 접근의 유용성 (memcpy)
Programming/C 2007. 7. 1. 23:59
Before
전형적인 막장짓..
초기화 -> 거꾸로 값 받아서 배열에 삽입 -> 포맷에 맞게 sprintf를 써서 -> 문자열로 만들고
-> 그걸다시 sscanf써서 -> 정수로 변환후 -> 리턴..
unsigned int atox(char *string)
{
unsigned int ret;
sscanf(string,"%x",&ret);
return ret;
}
unsigned int get_value(unsigned char *segment,int offset,int size)
{
int i;
char temp[size * 2 + 1];
unsigned char dt[size];
temp[size * 2] = '\0';
for(i = 0;i < size;i ++)
/* 리틀 엔디언 */
dt[size - i - 1] = *(segment + offset + i);
if(size == 1)
sprintf(temp,"%02x",dt[0]);
else if(size == 2)
sprintf(temp,"%02x%02x",dt[0],dt[1]);
else if(size == 3)
sprintf(temp,"%02x%02x%02x",dt[0],dt[1],dt[2]);
else if(size == 4)
sprintf(temp,"%02x%02x%02x%02x",dt[0],dt[1],dt[2],dt[3]);
return atox(temp);
}
{
unsigned int ret;
sscanf(string,"%x",&ret);
return ret;
}
unsigned int get_value(unsigned char *segment,int offset,int size)
{
int i;
char temp[size * 2 + 1];
unsigned char dt[size];
temp[size * 2] = '\0';
for(i = 0;i < size;i ++)
/* 리틀 엔디언 */
dt[size - i - 1] = *(segment + offset + i);
if(size == 1)
sprintf(temp,"%02x",dt[0]);
else if(size == 2)
sprintf(temp,"%02x%02x",dt[0],dt[1]);
else if(size == 3)
sprintf(temp,"%02x%02x%02x",dt[0],dt[1],dt[2]);
else if(size == 4)
sprintf(temp,"%02x%02x%02x%02x",dt[0],dt[1],dt[2],dt[3]);
return atox(temp);
}
After
몰라 걍 직접 집어넣어 버려....; 왜 진작 이걸 생각 못했을까?
역시 메모리에 직접 접근해서 하는게 더 편하다.
unsigned int get_value(unsigned char *segment,int offset,int size)
{
int ts = 0;
memcpy(&ts,segment + offset,size);
return ts;
}
{
int ts = 0;
memcpy(&ts,segment + offset,size);
return ts;
}
비슷하게 잘 작동하는듯 하다.... 좀 이상한가... 바꾸고 나니 왠지 불안하다...
값은 제대로 찍히는거 같은데.................
아 size가 클경우 overflow가 일어날수도 있을거 같은데.. 그거 처리도 해야하나?
근데...귀차나연...ㅋ
'Programming > C' 카테고리의 다른 글
좋은 프로그래밍 습관이란 책을 읽고. (0) | 2008.02.02 |
---|---|
오늘 할짓 없어서 한 뻘짓. (4) | 2008.01.24 |
리눅스에서 2기가 이상인 파일에 접근하기 (4) | 2007.06.28 |
Mpd 싱크 가사....... 프로그램 (8) | 2007.05.25 |
간단한 양방향 linkedlist (6) | 2007.05.11 |
리눅스에서 2기가 이상인 파일에 접근하기
Programming/C 2007. 6. 28. 12:19
도스 테이블을 만지작거리는중.
이상하게 값들이 제대로 안들어가는거 같아서.. long long 의 형까지 써보면서 삽질을 해봤지만
안되길래 구글링.... 한 결과
"open,lseek,fopen같은 함수는 2G정도의 파일만 접근이 가능하다.."
는 걸 알아냈다..............
아마도 off_t 값의 범위 때문에 그럴지도?
해결방법은
open64,lseek64처럼 직접소스에 64를 추가시켜주거나
(이때는 따로 인클루드파일을 추가시켜주거나 OR DEFINE을 해줘야하는듯)
D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
를 Gcc컴파일할때 추가해주면 된다 (gcc 버전 3.4부터 된다는 말이 있는데?)
이리하면
/dev/hda같은 대용량 파일(?) 도 잘 처리가 된다..
'Programming > C' 카테고리의 다른 글
오늘 할짓 없어서 한 뻘짓. (4) | 2008.01.24 |
---|---|
메모리 직접 접근의 유용성 (memcpy) (3) | 2007.07.01 |
Mpd 싱크 가사....... 프로그램 (8) | 2007.05.25 |
간단한 양방향 linkedlist (6) | 2007.05.11 |
세그멘테이션 폴트를 줄이자! valgrind (4) | 2007.05.08 |
압축플때 쓰는 쉘 스크립트
Programming/System 2007. 6. 18. 23:33
1 #!/bin/bash
2
3 # 지원하는 파일들은 다음과 같습니다
4 # zip,alz,rar,tar.gz,tar,tar.bz2,gz,tgz
5 # 물론 unalz,unzip,unrar,tar등이 설치되어 있어야 합니다
6 # (첫번째 인자의)파일의 확장자를 찾아내서 처리합니다..
7
8 # IFS 인자를 백업후 .을 IFS인자로 설정
9 OLD_IFS=$IFS
10 IFS='.'
11
12 # 첫번째 인자를 변수에 넣고 .을 간격자로한 갯수를 구한다
13 ARG1=($1)
14 ARRAY_SIZE=$(expr ${#ARG1[*]} - 1)
15
16 if (( $ARRAY_SIZE == -1));then
17 echo "인자가 부족합니다.."
18 echo "사용법 : $0 파일명 (압축을 풀)경로"
19 exit 1
20 fi
21
22 # 파일의 확장자를 정한다 (맨뒤에꺼만 아면 된다
23 # tar.gz같은경우도 gz면 되기때문에 맨마지막만 검사한다
24 if [ "${ARG1[$ARRAY_SIZE]}" = "zip" ];then
25 EXTENSION="zip"
26 elif [ "${ARG1[$ARRAY_SIZE]}" = "rar" ];then
27 EXTENSION="rar"
28 elif [ "${ARG1[$ARRAY_SIZE]}" = "alz" ];then
29 EXTENSION="alz"
30 elif [ "${ARG1[$ARRAY_SIZE]}" = "tar" ];then
31 EXTENSION="tar"
32 elif [ "${ARG1[$ARRAY_SIZE]}" = "gz" ];then
33 EXTENSION="gz"
34 elif [ "${ARG1[$ARRAY_SIZE]}" = "tgz" ];then
35 EXTENSION="tgz"
36 elif [ "${ARG1[$ARRAY_SIZE]}" = "bz2" ];then
37 EXTENSION="bz2"
38 else
39 echo "지원되지 않는 압축파일입니다 확장자를 확인해 주세요!"
40 echo "지원되는 압축파일 : ZIP,RAR,ALZ,TAR,GZ(or tar.gz),BZ2(or tar.bz2)"
41 exit 1
42 fi
43
44 # IFS를 복원
45 IFS=$OLDIFS
46
47 # IFS를 복원했기때문에 원래 인자들이 대입된다
48 # 그리고 전체 인자 갯수를 구해서, 압축을 풀
49 # 장소가 command 에 있는지 검사하고 실행한다
50 ARG1=($1)
51 ARG2=($2)
52 ARG_NUM=$#
53
54 # (경로)인자가 존재하지 않는다면
55 if(($ARG_NUM == 1));then
56 if [ "$EXTENSION" = "zip" ];then
57 unzip $ARG1
58 elif [ "$EXTENSION" = "rar" ];then
59 unrar e -d $ARG1
60 elif [ "$EXTENSION" = "alz" ];then
61 unalz $ARG1
62 elif [ "$EXTENSION" = "tar" ];then
63 tar -xvf $ARG1
64 elif [ "$EXTENSION" = "gz" ];then
65 tar -xvzf $ARG1
66 elif [ "$EXTENSION" = "tgz" ];then
67 tar -xvzf $ARG1
68 elif [ "$EXTENSION" = "bz2" ];then
69 tar -xvjf $ARG1
70 fi
71 # 존재한다면 경로대로 압축을 해제시킨다
72 elif(($ARG_NUM == 2));then
73 if [ "$EXTENSION" = "zip" ];then
74 unzip $ARG1 -d $ARG2
75 elif [ "$EXTENSION" = "rar" ];then
76 unrar x $ARG1
77 elif [ "$EXTENSION" = "alz" ];then
78 unalz $ARG1 $ARG2
79 elif [ "$EXTENSION" = "tar" ];then
80 tar -xvf $ARG1 -C $ARG2
81 elif [ "$EXTENSION" = "gz" ];then
82 tar -xvzf $ARG1 -C $ARG2
83 elif [ "$EXTENSION" = "tgz" ];then
84 tar -xvzf $ARG1 -C $ARG2
85 elif [ "$EXTENSION" = "bz2" ];then
86 tar -xvjf $ARG1 -C $ARG2
87 fi
88 fi
2
3 # 지원하는 파일들은 다음과 같습니다
4 # zip,alz,rar,tar.gz,tar,tar.bz2,gz,tgz
5 # 물론 unalz,unzip,unrar,tar등이 설치되어 있어야 합니다
6 # (첫번째 인자의)파일의 확장자를 찾아내서 처리합니다..
7
8 # IFS 인자를 백업후 .을 IFS인자로 설정
9 OLD_IFS=$IFS
10 IFS='.'
11
12 # 첫번째 인자를 변수에 넣고 .을 간격자로한 갯수를 구한다
13 ARG1=($1)
14 ARRAY_SIZE=$(expr ${#ARG1[*]} - 1)
15
16 if (( $ARRAY_SIZE == -1));then
17 echo "인자가 부족합니다.."
18 echo "사용법 : $0 파일명 (압축을 풀)경로"
19 exit 1
20 fi
21
22 # 파일의 확장자를 정한다 (맨뒤에꺼만 아면 된다
23 # tar.gz같은경우도 gz면 되기때문에 맨마지막만 검사한다
24 if [ "${ARG1[$ARRAY_SIZE]}" = "zip" ];then
25 EXTENSION="zip"
26 elif [ "${ARG1[$ARRAY_SIZE]}" = "rar" ];then
27 EXTENSION="rar"
28 elif [ "${ARG1[$ARRAY_SIZE]}" = "alz" ];then
29 EXTENSION="alz"
30 elif [ "${ARG1[$ARRAY_SIZE]}" = "tar" ];then
31 EXTENSION="tar"
32 elif [ "${ARG1[$ARRAY_SIZE]}" = "gz" ];then
33 EXTENSION="gz"
34 elif [ "${ARG1[$ARRAY_SIZE]}" = "tgz" ];then
35 EXTENSION="tgz"
36 elif [ "${ARG1[$ARRAY_SIZE]}" = "bz2" ];then
37 EXTENSION="bz2"
38 else
39 echo "지원되지 않는 압축파일입니다 확장자를 확인해 주세요!"
40 echo "지원되는 압축파일 : ZIP,RAR,ALZ,TAR,GZ(or tar.gz),BZ2(or tar.bz2)"
41 exit 1
42 fi
43
44 # IFS를 복원
45 IFS=$OLDIFS
46
47 # IFS를 복원했기때문에 원래 인자들이 대입된다
48 # 그리고 전체 인자 갯수를 구해서, 압축을 풀
49 # 장소가 command 에 있는지 검사하고 실행한다
50 ARG1=($1)
51 ARG2=($2)
52 ARG_NUM=$#
53
54 # (경로)인자가 존재하지 않는다면
55 if(($ARG_NUM == 1));then
56 if [ "$EXTENSION" = "zip" ];then
57 unzip $ARG1
58 elif [ "$EXTENSION" = "rar" ];then
59 unrar e -d $ARG1
60 elif [ "$EXTENSION" = "alz" ];then
61 unalz $ARG1
62 elif [ "$EXTENSION" = "tar" ];then
63 tar -xvf $ARG1
64 elif [ "$EXTENSION" = "gz" ];then
65 tar -xvzf $ARG1
66 elif [ "$EXTENSION" = "tgz" ];then
67 tar -xvzf $ARG1
68 elif [ "$EXTENSION" = "bz2" ];then
69 tar -xvjf $ARG1
70 fi
71 # 존재한다면 경로대로 압축을 해제시킨다
72 elif(($ARG_NUM == 2));then
73 if [ "$EXTENSION" = "zip" ];then
74 unzip $ARG1 -d $ARG2
75 elif [ "$EXTENSION" = "rar" ];then
76 unrar x $ARG1
77 elif [ "$EXTENSION" = "alz" ];then
78 unalz $ARG1 $ARG2
79 elif [ "$EXTENSION" = "tar" ];then
80 tar -xvf $ARG1 -C $ARG2
81 elif [ "$EXTENSION" = "gz" ];then
82 tar -xvzf $ARG1 -C $ARG2
83 elif [ "$EXTENSION" = "tgz" ];then
84 tar -xvzf $ARG1 -C $ARG2
85 elif [ "$EXTENSION" = "bz2" ];then
86 tar -xvjf $ARG1 -C $ARG2
87 fi
88 fi
간단한(?) 스크립트.
여러 압축파일을 풀때 사용합니다
제가 워낙 다운족이다보니 압축은 안하고 풀기만 합니다...
리눅스인만큼 tar.gz 같은 파일 도 많이 풀지만
애니 자막을 풀기도 하기 때문에 zip,rar,같은것두 사용해서 적어 놨습니다
사실 그냥 alias로 해결하곤 했는데 인제 ut uz ur 쓰는것도 귀찮아져서 그냥
한번에 할려구 그냥 쉘 스크립트를 하나 만든거에요..
tar.gz tar.bz2같은거 때문에 확장자 뻘짓고생을 했것만.. 어짜피 마지막 확장자로
압축을 푸니까 별로 중요하지 않더라는..
음.. 일단 그리고 인자가 없을때만 한번 테스트 해봤더니 그건 잘 돌아가는군요
.. 압축풀 경로를 정했을때는 테스트를 안해봐서 잘 모르겠습니다만.........;;;;
잘되겠져멀~~~~~~~(무책임 =3=3)
오랜만에 쉘스크립트를 만들다보니까 잘 적응이 안되서 또 해멨지만..( 무지하게)
'Programming > System' 카테고리의 다른 글
FAT12과 FAT16의 부트레코드의 구성이 같은모양인가 보다 (2) | 2007.07.27 |
---|---|
부트섹터에서 프로그램 실행시키기. (14) | 2007.07.21 |
MBR(?) 출력 하기 (2) | 2007.06.17 |
screen attach dettach 구별법 (2) | 2007.02.12 |
Beginning Linux Programming Part6-Curses (2) | 2006.06.25 |
MBR(?) 출력 하기
Programming/System 2007. 6. 17. 23:18
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 #define MBR_SIZE 512
9
10 void print_title(void)
11 {
12 printf("OFFSET 0 1 2 3 4 5 6 7 8 9 "
13 "A B C D E F ASCII CODE\n");
14 }
15
16 void print_hex(unsigned char *data)
17 {
18 int i;
19
20 for(i = 0;i < 16;i ++)
21 printf("%02x ",data[i]);
22 }
23
24 void print_offset(int i)
25 {
26 printf("%08x ",i);
27 }
28
29 void print_charecter(unsigned char *data)
30 {
31 int i;
32
33 for(i = 0;i < 16;i ++){
34 if(data[i] > 32 && data[i] < 127)
35 printf("%c",data[i]);
36 else
37 printf(".");
38 }
39 }
40
41 int main(int argc,char *argv[])
42 {
43 int fd,i;
44 unsigned char data_sav[MBR_SIZE];
45
46 if(argc != 2){
47 printf("Usage : %s /dev/hda \n",argv[0]);
48 exit(0);
49 }
50
51 if((fd = open(argv[1],O_RDONLY)) == -1){
52 perror("파일디스크립터 열기 실패");
53 exit(1);
54 }
55
56 if(read(fd,data_sav,MBR_SIZE) == -1){
57 perror("장치 읽기 실패");
58 exit(1);
59 }
60
61 print_title();
62
63 for(i = 0;i < MBR_SIZE;i +=16){
64 print_offset(i);
65 print_hex(&data_sav[i]);
66 print_charecter(&data_sav[i]);
67 puts("");
68 }
69
70 close(fd);
71 return 0;
72 }
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 #define MBR_SIZE 512
9
10 void print_title(void)
11 {
12 printf("OFFSET 0 1 2 3 4 5 6 7 8 9 "
13 "A B C D E F ASCII CODE\n");
14 }
15
16 void print_hex(unsigned char *data)
17 {
18 int i;
19
20 for(i = 0;i < 16;i ++)
21 printf("%02x ",data[i]);
22 }
23
24 void print_offset(int i)
25 {
26 printf("%08x ",i);
27 }
28
29 void print_charecter(unsigned char *data)
30 {
31 int i;
32
33 for(i = 0;i < 16;i ++){
34 if(data[i] > 32 && data[i] < 127)
35 printf("%c",data[i]);
36 else
37 printf(".");
38 }
39 }
40
41 int main(int argc,char *argv[])
42 {
43 int fd,i;
44 unsigned char data_sav[MBR_SIZE];
45
46 if(argc != 2){
47 printf("Usage : %s /dev/hda \n",argv[0]);
48 exit(0);
49 }
50
51 if((fd = open(argv[1],O_RDONLY)) == -1){
52 perror("파일디스크립터 열기 실패");
53 exit(1);
54 }
55
56 if(read(fd,data_sav,MBR_SIZE) == -1){
57 perror("장치 읽기 실패");
58 exit(1);
59 }
60
61 print_title();
62
63 for(i = 0;i < MBR_SIZE;i +=16){
64 print_offset(i);
65 print_hex(&data_sav[i]);
66 print_charecter(&data_sav[i]);
67 puts("");
68 }
69
70 close(fd);
71 return 0;
72 }
임베디드 계발자를 위한 파일시스템의 원리와 실습
이란 책에서 MBR을 보여주는 젤처음 예제(아마도) 를 리눅이용으로 변신시켜본것입니다..
의외로 별루 안어렵고 쉽게 끝냈네여....
중간에 unsinged를 안써서 값이 이상하게 나와서 약간 고생했지만..
다행이도 값들이 ffff들이 친절히 나와주었기 때문에 쉽게 고칠수 있었습니다
(사실 거의 안써서 (...) 바로 감은 안오더라고요)
슈퍼유저만 장치에 읽기에 가능하니까 해서 따로 루트인지 검사하고 에러메세지를 따로 낼까
하다가 귀차나서 (어짜피 열다가 에러 먹을테니까) 방치.
실은 여름방학때 파워손님이 스터디를 제안해서.. 그거 따라 갈려고(...........)
하는거.......................입니다...
물론 디바이스프로그래밍이나 커널프로그래밍이니 아는건 거의 없습니다만 ;;
해서 손해볼건 없다 싶어서..... 방학때 같이 하는것도 괜찮을거 같고...
사실 어제 이거에 관련되서 약간 물어봤더랍니다..
각 섹터에 있는 값들을 어떻게 읽어 내느냐... 이렇게요..
그리고 책에서는 winapi로 하는데 리눅스에서는 어떻게.. 함수가 있나.. 이런식으로요
저는 뭐 어셈블러써서 어떻게 접근이 안될까 생각했는데
간단하게 대답해주시더군요
"그냥 /dev/hda 같은식으로 읽으면,........."
아!! 그랬죠,... 리눅스(유닉스계열) 은 시스템 장치들도 다 파일 처럼 사용하는 거였지 (.......;; )
그거 딱 생각하고서 그냥 만든겁니다..
잘 보시면 아시겠지만
핵심은 그냥 파일 읽는거랑 별반 다를거 없다는거.....
아마 저 크기가 아닐거 같은데... 뭐 대충 찍어요...
어짜피 숫자만 바꿔주면 되는데뭘...
'Programming > System' 카테고리의 다른 글
부트섹터에서 프로그램 실행시키기. (14) | 2007.07.21 |
---|---|
압축플때 쓰는 쉘 스크립트 (4) | 2007.06.18 |
screen attach dettach 구별법 (2) | 2007.02.12 |
Beginning Linux Programming Part6-Curses (2) | 2006.06.25 |
ls -al (0) | 2006.06.21 |