MBR(?) 출력 하기

 
 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 51
2
 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