2007. 11. 14. 05:57
     

Part10. 부트 로더(Boot Loader) 설명

원문 :  http://kkamagui.springnote.com/pages/347742

 

들어가기 전에...

0.시작하면서...

 부트 로더(Boot Loader)는 BIOS로부터 제어를 넘겨받아서 처음으로 실행되는 프로그램이다. 그렇다보니 C Runtime 환경 같은건 전혀 기대할 수 없고 어셈블리어로 구현하는 것이 보통이다.

 부트 로더 코더를 세세하게 설명하면 끝이 없으므로, 간단히 기능적인 관점으로 나누어 설명하겠다.

 부트 로더의 소스는 프레임워크 안에 01Boot 폴더에 00Bootstrap 안에 있다. 소스를 같이 참고하면서 보자.

 

 부팅이 되고나면 부트 로더에서 해야하는 작업은 크게 세가지다.

  1. 코드/데이터/스택 영역 설정 및 초기화
  2. 커널 로더 및 커널의 이미지 로딩
  3. 커널 로더의 실행

 

 그럼 이제 각각에 대해서 알아보도록하자.

 

1.코드/데이터/스택 영역 설정 및 초기화

 부트 로더가 제어를 넘겨받았을 때 레지스터의 상태는 BIOS에서 코드 수행시에 사용되던 값이다. 이대로 사용해도 괜찮지만 BIOS가 여러종류가 있고 각 BIOS 마다 코드가 다르므로 레지스터의 값을 예측할 수 없다. 애매한 상황을 피하기위해 각 레지스터의 값을 새로 설정해 준다.

  1. jmp 0x07c0:start <== 코드 세그먼트 레지스터를 0x07c0로 설정
    start :
            mov     ax, cs
            mov     ds, ax
            mov     es, ax
            ;   스텍의 설정
            ;   함수 호출을 위해 필수
            mov     ax, 0x0000
            mov     ss, ax
            mov     ax, 0xffff
            mov     sp, ax
            mov     bp, ax

 위와 같이 세그먼트 레지스터를 코드 영역과 같이 설정해 주고 스택을 세그먼트의 끝에서부터 자라도록 설정해준다.

 위에서 jmp 0x07c0:start 코드를 볼 수 있는데, 이 코드는 CS 세그먼트 레지스터에 0x07c0을 설정하고 IP 레지스터에 start의 주소를 설정하는 코드이다. CS 세그먼트 레지스터에 0x07c0을 설정하면 어떤 일이 발생하는 것일까? 16bit 모드에서 세그먼트 레지스터의 역할은 32bit 모드의 역할과 다르다.

 16bit 모드의 세그먼트 레지스터의 역할은 Base 주소 역할만 하는데, 주소 계산 방식은 아래와 같다.

실제 주소 = 세그먼트 레지스터의 값 << 4 + 레지스터의 값

 즉 start 코드가 위치하는 실제 주소는 0x7c00  + start의 주소가 되는 것이다.

 

 그렇다면 0x7c00 주소는 무엇일까? 0x7c00의 주소는 BIOS가 디스크로부터 한 섹터를 읽어들여 메모리에 복사하는 위치이다. 다시말해 부트 코드가 0x7c00에 위치하며 BIOS가 0x7c00의 주소로 jump해서 부트 코드를 실행한다. 부트 코드가 정상적으로 실행되기 위해서는 0x7c00에서 실행되도록 컴파일 되어야 함은 두말할 필요도 없다.

 

2.이미지 로딩

2.1 플로피 디스크(Floppy Disk) 분석

 부트 로더의 코드 중에 가장 복잡한 부분이다. 플로피에 저장된 이미지를 모두 로딩하는 역할을 하는 함수인데, 코드를 이해하기 위해서는 플로피 디스크에 대한 지식이 필요하다.

 그럼 간단히 플로피 디스크에 대해 알아보자. 플로피 디스크는 아래와 같은 세가지로 구성된다.

  • 섹터(Sector) : 실제적인 데이터를 저장하는 영역. 일반적으로 512Byte 크기. 1~18번까지 총 18개 섹터가 모여서 하나의 트랙을 구성
  • 트랙(Track) : 섹터가 모여 구성된 영역. 0~79번까지의 총 80개의 트랙이 모여서 하나의 헤드를 구성
  • 헤드(Head) : 트랙이 모여 구성된 영역.  플로피 디스크는 일반적으로 2개의 헤드를 가짐.

  이것을 그림으로 보면 아래와 같다.

플로피구조.PNG

<섹터/트랙/헤드의 구성> 

 

 고용량의 플로피 디스크(1.44Mbyte)는 양면으로 되어있기 때문에 헤드의 값이 2이다. 일단 섹터/트랙/헤드의 구성에 대해 알아보았으니, 섹터를 읽어 데이터를 로드한다고 가정하고 어떤 순서로 로딩하는지 알아보자.

 플로피 디스크에 데이터를 읽고 쓰는 순서는 어떻게 될까? 0부터 끝까지 계속 데이터를 써내려간다고 가정하면 아래와 같은 순서로 읽고 쓰게 된다.포인트는 섹터 -> 헤드 -> 트랙 순으로 증가하는 값이다.

  1. 섹터 1, 트랙 0, 헤드 0 ~ 섹터 18, 트랙 0, 헤드 0 까지 작업
  2. 헤드를 1로 변경하고 다시 위의 1 과정을 반복 
  3. 헤드를 0으로 변경하고 트랙을 1 증가. 다시 위의 1~2 과정을 반복 
  4. 위의 1~3 과정을 트랙 0~79까지 반복

 

2.2 플로피 디스크(Floppy Disk) 제어 코드

 위의 일련의 작업을 코드로 옮긴 것이 아래의 코드다.

  1. ;   플로피로 부터 커널 로더를 읽어 들인다.
    ReadSector:
        push    bp
        push    es
        pushf
       
        mov     ax, 0xb800
        mov     gs, ax
       
        reset:  ;   reset floppy
            mov     ax, 0
            mov     dl, 0               ;   Drive=0(A Drive)
            int     0x13                ;   명령전송
            jc      reset               ;   문제가 생기면 다시 시도 한다.  
            mov     ax, 0x1000;0x07e0   ;   이미지를 읽어들일 segment
            mov     es, ax
            mov     bx, 0
  2.     ;   아래의 부분을 반복한다.
        read:       ;   read 하는 부분
            mov     ah, 2                   ;   bios 명령 포멧 es:bx에 저장한다.
            mov     al, 1                   ;   Load 1 Sector
            mov     ch, byte [TRACKCOUNT]   ;   Cylinder    = 0
            mov     cl, byte [SECTORCOUNT]  ;   Sector 2 부터
            mov     dh, byte [HEADCOUNT]    ;   Head 0
            mov     dl, 0                   ;   Drive 0 (A Drive)
            int     0x13                    ;   명령 전송
            jc      error
  3.         ;   그리고 섹터값을 증가시킨다.
            ;   플레그 레지스터를 저장해서 증가 시키는 루틴으로 인해
            ;   플레그의 값이 바뀌는일이 없도록 한다.
            inc     byte [SECTORCOUNT]      ;   섹터를 1 증가한다.
            cmp     byte [SECTORCOUNT], 19  ;   섹터는 0 부터 18 까지 있으므로
            jb      endRead                 ;   작으면 다음 섹터를 읽고
            mov     byte [SECTORCOUNT], 1   ;   같으면 섹터의 크기를 1로 만들고
            inc     byte [HEADCOUNT]        ;   헤드를 하나 증가 시킨다.
            cmp     byte [HEADCOUNT], 2     ;   헤드는 0 에서 1까지 있으므로
            jb      endRead                 ;   작으면 다음 섹터를 읽고
            mov     byte [HEADCOUNT], 0     ;   같으면 헤드를 0 설정
            inc     byte [TRACKCOUNT]       ;   트렉을 하나 증가시킨다.
            cmp     byte [TRACKCOUNT], 80
            jb      endRead
            ;   트렉이 넘어 섰나 체크는 안해도 된다.
            ;   커널이 1.44 메가를 넘길려고...
       
        endRead:
            ;   한섹터가 0x200 이므로 세그먼트 레지스터를 증가 시킨다.
    mov     bx, es
            add     bx, 0x20
            mov     es, bx
            ;   디버깅
            mov     ax, es
            mov     byte [gs:0x00], ah
            mov     byte [gs:0x02], al
            ;   디버깅 끝
       
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;   진행상황 표시
            mov     bx, word [LOOPCOUNT]
            mov     byte [gs:402], bl
            mov     byte [gs:403], 0x02
            ;   진행상황 점찍기(일단 주석처리)
            ;mov    bx, word [LOOPCOUNT]
            ;mov    ax, 2
            ;mul    bx
            ;mov    bx, ax
            ;add    bx, 482
            ;mov    byte [gs:bx], '.'
            ;inc    bx
            ;mov    byte [gs:bx], 0x02
            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            ;   루프 횟수 계산하기
            mov     bx, 0
            inc     word [LOOPCOUNT]   
            mov     cx, word [LOOPCOUNT]
            cmp     cx, word [ds:0x01f8]
            jb      read
  4.     ; 다 읽었으면 Fdd를 Reset 하고 초기화 시켜둔다.
        reset_end:  ;   reset floppy
            mov     ax, 0
            mov     dl, 0           ;   Drive=0(A Drive)
            int     0x13            ;   명령전송
            jc      reset_end       ;   문제가 생기면 다시 시도 한다.  
       
        popf
        pop     es
        pop     bp
        retn

 

3.커널 로더 실행

  커널 로더를 실행하는 부분은 아주 간단하다. 커널 이미지가 0x10000 주소에 로딩되기 때문에 jump만 하면 된다. 아래는 그 코드이다.

  1.         jmp     0x1000:0 ;0x07e0:0

 

 

4.마치면서...

 이상으로 부트 로더에 대해서 간단히 알아보았다. 어셈블리어 코드 하나하나를 설명하면 좋겠지만 세부적인 내용이 궁금한 사람은 Intel Architecture Manual을 참고하자. 다음에는 커널 로더에 대해 알아보자.

 

 

5.첨부

 

 

 

이 글은 스프링노트에서 작성되었습니다.

이 글은 스프링노트에서 작성되었습니다.

이 글은 스프링노트에서 작성되었습니다.


Android App

Posted by 호기심 많은 kkamagui(까마귀, 한승훈)

댓글을 달아 주세요

  1. BlogIcon 누군가 2010.02.05 20:15  댓글주소  수정/삭제  댓글쓰기

    Part7에서 메모리 레이아웃을 보면 0x10000에서 0x100000까지 0xf0000바이트 로딩이 가능한데 0x100000바이트짜리 커널을 만들어서 넣으면 끝부분이 로딩이 안 되겠네요.
    플로피 디스크에는 0x168000바이트를 기록할 수 있고 거기서 부트로더와 커널로더를 빼도 0x160000바이트는 훨씬 넘는데...

  2. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.07.27 13:53 신고  댓글주소  수정/삭제  댓글쓰기

    까마귀님 안녕하세요 오랜만입니당^^
    몇일전부터 os를 인제 만들기시작햇는데
    아직도 부트섹터에서 놀고잇습니다...
    nasm에서 나지 않던 에러가
    masm로 햇더니.. 나서 해결을못하고잇네요

    bpb 코드를 넣으면 exe2bin 으로 bin파일을 만들때 file cannot be converted라고 나옵니다...
    왜그런걸까요..ㅠㅠ

  3. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.07.29 16:57 신고  댓글주소  수정/삭제  댓글쓰기

    음 그렇군요.......
    까마귀님은 nasm을 사용하시나보군요..
    아참 그리고 한가지 질문이잇는데
    처음에 부트섹터코드에서
    부트로더를 메모리에 올린후 커널을 램에 올려서하는데요
    그냥 섹터를 읽어서 하는것과
    아래와같이 전부 읽는것.. 무슨차이가있는거죠?
    만들면서 배우는 os커널의 원리와 구조에선 안해두 되더군요..
    bootsect | fat1 | fat2 | root directory | data area|
    그런데 어떤책에선 이렇게 파일시스템자체를 읽더군요..
    어떤이유때문에 이렇게 읽는 방법이 다른지 좀알수있을까요?
    그리고 저걸 읽는데 fat2 즉 10섹터부터 rootdirectory까지 읽는데
    왜 fat1부터 읽지않는건지요 제가알기론 fat2는 백업본응로 중요한 파일이기때문에 백업본을 만들어놧다구 하던데....왜 fat2부터 읽는지..
    그리고 나머지 data area는 왜 읽지 않는지 궁금하군요..
    소스에서보면
    mov cx, 9+14 이렇게 해주거든요.. 10섹터부터 9섹터를 읽으면 fat2 그리고 14섹터를 읽으면
    root directory 잖아요..
    궁금해도 어디서 정보를 얻질 못하고잇네요 ㅠ.ㅠ 아신다면 답변좀 부탁드립니다

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.07.29 23:22  댓글주소  수정/삭제

      사실 뭐... 정책의 차이라고 할 수 있지 않을까요? ^^;;;

      저 같은 경우는 OS 이미지를 저장할 때 굳이 FAT12 파일 시스템을 사용하지 않기 때문에 섹터를 순차적으로 읽는 거구요...

      만일 FAT 파일 시스템을 사용한다면 커널 파일을 찾아야하니 FAT과 루트 디렉터리를 읽어서 OS 커널을 찾은 다음 그 크기만큼 메모리에 올리겠지요. ^^;;;;

      FAT1이 아니라 FAT2를 읽는 이유는 글쎄요... ^^;;; FAT2가 좀더 안정적인 데이터를 포함하고 있어서 그런걸까요... FAT1의 경우는 파일 시스템이 변할 때마다 업데이트될 텐데... 중간에 꺼졌다고 가정할 경우 Stable한 데이터는 FAT2에 있는 놈이 되서 그런게 아닐까 잠시 생각해봅니다.

  4. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.07.29 17:01 신고  댓글주소  수정/삭제  댓글쓰기

    아참!! 한가지더 궁금한건..
    bpb 코드를 넣지않아도 되는데
    왜구지 bpb 코드를 넣는지 모르겟네요
    bpb 코드란게 파일시스템 정보들을 입력해주는거잖아요
    어떤책에선 bpb코드를 안넣어도 잘만돌아가던데
    다른책에선 bpb 코드를 넣더라구요
    어떤이유때문에 넣는건가요?
    안넣어도 파일시스템정보들은 다 입력되는게 아닌건지.....
    이거원 책들이 쓰기만햇지 제대로된 설명이없어서.. 자료를 찾아서 구글신님께 여쭈어봐도 제대로된 답변을 해주지 않네요 ㅡㅡ;;ㅠㅠ제가 구글링을 못하는건지..

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.07.29 23:24  댓글주소  수정/삭제

      이것 역시 정책의 차이인데요... ^^;;;

      OS 이미지가 FAT 파일 시스템 형태로 되어 있다면 당연히 BPB를 채워야 할 거고 그렇지 않다면 Boot signature 정도만 채우면 될 것 같습니다. ㅎㅎ

  5. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.02 10:08 신고  댓글주소  수정/삭제  댓글쓰기

    아하그렇군요.. 까마귀님 답변 정말 감사드립니다^^;;

  6. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.02 21:26 신고  댓글주소  수정/삭제  댓글쓰기

    까마귀님 한가지 질문이..
    왜 플로피디스크자체를 읽나요? 커널의 크기가 1섹터면
    1섹터만큼 2섹터면 2섹터만큼 읽지않고 다읽으시는 이유는 무엇인가요?!

    분명 커널이 위치한 곳만을 읽으면 되지않나요??!

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.08.02 23:12  댓글주소  수정/삭제

      아... 나중에 커널 뒤쪽에 이미지 파일같은 걸 넣어서 메모리에 올리려고 그렇게 한겁니다. ^^

      사실은 말씀하신대로 커널 영역만큼만 읽어도 되요 ;)

  7. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.03 14:53 신고  댓글주소  수정/삭제  댓글쓰기

    아 그렇군요^^;;
    저기위에 정책의 차이라고 하셧는데요..
    os이미지가 fat파일 시스템 형태로 되어있다.. 이말이 좀이해가안되는데요
    플로피 디스크라는게 무조껀 fat12형태로 포맷되어잇지 않는건가요?

    그리고 저기 위에 fat2부터 읽는다고 제가 햇는데요..
    그럼 |bootsect|fat1|fat2|root directory|data area|
    이부분에서첫번째 부트섹터를 읽어서 메모리에 올린후 fat2부터 읽어서 root directory까지 읽으면 9+14섹터 23섹터인데요 그럼 메모리에는
    |bootsect|fat2|root directory 이렇게 올라가는건가요??!
    그리고 커널이미지를 rootdirectory에 있는 곳에서 찾는거구요..
    맞나요..?;;

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.08.05 00:05  댓글주소  수정/삭제

      포멧은 선택이기 때문에 굳이 OS 이미지로 사용할 거라면 FAT12로 포맷할 필요는 없습니다. 다만, FAT12로 하는 이유는 OS가 부팅한 뒤에 FAT 파일 시스템을 인식하여 데이터 파일이나 응용프로그램 파일을 읽으려고 하는 것이죠. ;)

      만일 FAT 파일 시스템을 사용한다면 FAT 정보를 다 메모리에 올릴 필요없이 디스크 섹터의 BPB를 읽어서 루트 디렉터리 섹터에 접근한다음 파로 커널 이미지를 올리는 방법을 사용할 것 같군요. ㅎㅎ

  8. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.03 16:54 신고  댓글주소  수정/삭제  댓글쓰기

    제가 지금 이해한건..
    처음에 부팅을하면 플로피디스크에서 512바이트만큼의 영역을 램의 7c0번지로 올린후 점프를 하여 실행을 시킵니다. 그리고 플로피디스크의 다음 섹터를 읽어서 부트로더를 램에 올립니다.
    그리고 또커널을 올리구요.
    아니면 까마귀님이 쓰신방법과같이 한번에 플로피디스크를 전부 읽는방법

    이방법이 있는것같고요

    bpb를 넣어서 fat12파일시스템 구조를 입력해준후 플로피디스크에서 512바이트만큼 읽은후
    부트섹터코드에서 fat12의 fat2부터 root directory까지 메모리에 올린후
    root directory에서 커널이미지를 찾은후 엔트리를 조사하여 커널이미지의 파일의 시작 클러스터번호를 찾어서 메모리에 상주되어잇는 fat2 테이블에서 커널이미지를 검색해서 파일을 찾는다..
    이게 맞는건가요?? 틀린부분이있다면.. 답변좀해주시면 감사하겟습니다...
    죄송합니다 정말 바쁘실텐데..

  9. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.03 20:20 신고  댓글주소  수정/삭제  댓글쓰기

    마지막의 fat12파일 시스템 구조를 읽어서 하는방법은
    마운트할수 있다는 장점이있다고하는데..
    확실한건지 모르겟네요.. 흠... 혹시 파일시스템 구조를 읽어서 하는방법에 대한
    장점을 아신다면.. 좀알려주세요;;

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.08.05 00:08  댓글주소  수정/삭제

      위에서 말씀드린대로 OS를 올린다음 플로피 디스크에서 데이터나 응용프로그램을 바로 찾아서 올릴 수 있는 장점이 있습니다.

      FAT 파일 시스템을 안쓰면 디스크 섹터 어디에 무슨 프로그램이 있는지 알고 있는 테이블 같은 걸 사용해서 처리하는 방법도 있는데... 아무래도 FAT을 사용하는게 편하죠. ;)

  10. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.18 16:02 신고  댓글주소  수정/삭제  댓글쓰기

    여기서.. 정확하게 이해를 하고싶은데요
    플로피디스크에서 처음 MBR부분을 찾아 AA55H 가나온부분까지 512(1섹터)만큼 부트섹터를 메모리 07C0에 로드한후 07C0부분으로 점프를한다..
    부트섹터에서 BPB코드를 넣어 FAT12 파일시스템으로 플로피디스크가 포맷되고
    (BPB코드를 넣어서 FAT12로 포맷이되는건가욤?)
    FAT체인을 메모리 07E0에 읽어서 ROOT DIRECTORY까지 읽습니다.(23섹터)
    그럼 FAT2와 ROOT DIRECTORY가 07E0부터 메모리에 순서대로 23섹터로 올라가잇겟지욤...
    그럼 메모리(램)의 ROOT DIRECTORY에 있는 KERNEL이미지를 찾기위해
    부트섹터(1섹터) + FAT2(9섹터) =1400H 이란 값이 나오는데요
    ROOT DIRECTORY를 읽으려면.. 1400가 아니라
    7C00 + 1400 더해서 = 9000 번지에서 KERNEL 이미지를 찾아야되지않나요..?
    이상하게;; 1400에서 찾네요.. 혹시 ORG 를 0 으로 해줫기때문에
    1400으로 하는걸까요..? BELLONA2 OS에서 그러네요 ..
    MOV CX, 256 ; 디렉토리 엔트리 최대 256개
    MOV SI, 1200H + 200H ; 루트 디렉토리의 시작.
    그리고 저기에서 디렉토리 엔트리 최대 256개라고되있는데요
    제가알기론 루트디렉토리 크기는 224 아닌가요..?
    다른걸 말하는걸까요...?

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.08.22 01:42  댓글주소  수정/삭제

      음... 일단 FAT12는... 루트 디렉터리의 크기가 16섹터로 정해져 있기 때문에 512 byte * 16 / 32(디렉터리 엔트리 하나의 크기) 하면 256개가 맞는 것 같습니다. ^^;;;

      루트 디렉터리를 읽는 부분은... 글쎄요... 코드를 작성하기 나름이라... 뭐라고 말씀 드리기가 어려울 것 같군요. ^^;;;

  11. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.18 16:04 신고  댓글주소  수정/삭제  댓글쓰기

    아참 그리구 BPB코드로 인해서 FAT12로 포맷된다고 하면
    BOOTSECT + KERNEL = KERNEL.IMG 를 올리게되면..
    BOOTSECT는 07C0에 올라가고 KERNEL부분은 ROOTDIRECTORY에 가는건가요..?
    정말이해가안되네요 이 FAT12란놈이..

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.08.22 01:44  댓글주소  수정/삭제

      BPB 코드만 들어있다고 해서 FAT로 포맷되는 것은 아닙니다.
      당연히 FAT1/2 영역과 루트 디렉터리까지 다 생성해줘야 하구요, BPB에는 이 부분에 대한 정보가 들어있는 거지요. ;)

      FAT에 대한 내용은 인터넷에서 FAT Whitepaper를 찾으면 됩니다. 마이크로소프트에서 만든 문서고... FAT12/16/32까지 다 들어 있으니 한번 읽어보는 것도 좋을 듯 하군요. ;)

  12. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.18 17:23 신고  댓글주소  수정/삭제  댓글쓰기

    그림으로 메모리부분까지 설명되있는 정보가있다면...좋으련만.. 영어의 필요성을 정말 많이느껴서 영어도 지금같이공부하는데.. 하루이틀해서 외국문서를 읽을수없으니..
    그래도 난중에 또후회하지않기위해서 꾸준히해야겟죠..ㅠ.ㅠ

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.08.22 01:45  댓글주소  수정/삭제

      이바닥 문서들이 왠만하면 영어로 되어 있어서... ^^;;; 그래도 쉬운 영어로 되어있으니, 조금만 익숙해지면 금방 읽을 수 있을 겁니다. ㅎㅎ 화이팅이에요 ;)

  13. Favicon of http://kordel.tistory.com BlogIcon KlausL.C.G 2010.08.25 12:53 신고  댓글주소  수정/삭제  댓글쓰기

    그렇군요 감사합니다 까마귀님 ^^ 열심히하겟습니다!

  14. KLAUS1202 2010.08.26 17:27  댓글주소  수정/삭제  댓글쓰기

    로더를 실행시켜서 문자열까지는 됫는데요..
    이 로더부분을 c언어로 작성하고싶은데
    어떻게 해야될지모르겟습니다... 지금으로썬 생각하는게 visual c++로 엔트리 포인터를 설정해서 뛰면 되는것같은데.. 이거.. 막막하네요 소스로 만들려다보니..
    masm으로 만드니 조금 다른 소스들이 nasm으로 거의 만들어져잇어서
    다른부분이 많네요 bellona2 에서는 로더부터 바로 c로만들던데요.. 소스가 너무나 복잡해서..제 실력으로는 읽을수 잇는..부분이아니더라구요
    어떻게 씨언어로 점프하는지도 모르겟는데.. 이곳저곳 소스를 옴겨다니면서 ㅡ.ㅡ;;
    하더라구요
    까마귀님은 어떤방법을 사용하시는지요..? 어떤식으로 하신건지요..
    masm은 export 라는 명령어가 없나봐요..
    nasm에선 export해서 진입점만 해주면.. 되는것같은데..

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2010.08.26 21:26  댓글주소  수정/삭제

      예전에 한번 정리해 놓은 것이 있는데...

      http://kkamagui.tistory.com/15 여기를 참고하시면 될 것 같습니다. ^^;;;