ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 01. PC 구조부터 어셈블리 입문까지
    시스템/OS 구조와 원리 2016. 6. 28. 19:24

    이 책은 NASM을 기반으로 저자가 개조한 nask와 C를 위주로 OS 제작을 진행한다.


    바이너리 에디터와 텍스트 편집기는... 좋은 것들이 수없이 많지만 본인의 글에선 다음 툴을 사용한다.


    바이너리 에디터: Hex Fiend

    텍스트 편집기: Sublime Text 3


    윈도우에서는 바이너리 에디터로 Hex Fiend보다 훨 나은 HxD 헥스 에디터 를 쓰면 되리라 본다. 윈도우에서도 또한 서브라임 텍스트 써도 되고, Notepad++을 써도 되고, 좋은건 많으니 원하시는 걸 아무거나 쓰세용




    우선

    첫번째. 저자가 시키는 대로 따라치거나 파일을 복사하거나 해서 Hello, world!가 뜨도록 구동 하는게 목표.


    부팅할 때 마다 z_tools 내의 파일을 쓰게 될 모양인 것으로 보인다.
    해당 폴더를 항상 ../project/xx_day에 복사하면서 !cons_nt.bat을 켜고 run하면 돌아간다.


    두번째. 저자가 올린 어셈블러 소스코드를 분석하자. 



    ; hello-os
    ; TAB=4
    
    ; 이하는 표준적인 FAT12 포맷 플로피 디스크를 위한 기술
    
    	DB		0xeb, 0x4e, 0x90
    	DB		"HELLOIPL"	; boot sector의 이름은 자유롭게 써도 좋다(8바이트)
    	DW		512		; 1섹터의 크기(512로 해야 함)
    	DB		1		; 클러스터의 크기(1섹터로 해야 함)
    	DW		1		; FAT가 어디에서 시작될까(보통은 1섹터째부터)
    	DB		2		; FAT의 개수(2로 해야 함)
    	DW		224		; 루트 디렉토리 영역의 크기(보통은 224엔트리로 한다)
    	DW		2880		; 드라이브 크기(2880섹터 해야 함)
    	DB		0xf0		; 미디어 타입(0xf0해야 함)
    	DW		9		; FAT영역 길이(9섹터로 해야 함)
    	DW		18		; 1트럭에 몇개의 섹터가 있을까(18로 해야 함)
    	DW		2		; 헤드 수(2로 해야 함)
    	DD		0		; 파티션을 사용하지 않기 때문에 여기는 반드시 0
    	DD		2880		; 드라이브 크기를 한번 더 write
    	DB		0,0,0x29	; 잘 모르지만 이 값으로 해 두면 좋은 것 같다
    	DD		0xffffffff	; 아마, 볼륨 시리얼 번호
    	DB		"HELLO-OS   "	; 디스크 이름(11바이트)
    	DB		"FAT12   "	; 포맷 이름(8바이트)(3번 띄어쓰기 해놨음)
    	RESB		18		; 우선 18바이트를 비어둔다
    
    ; 프로그램 본체
    
    	DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
    	DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
    	DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
    	DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
    	DB	0xee, 0xf4, 0xeb, 0xfd
    
    ; 메세지 부분
    
    	DB	0x0a, 0x0a	; 개행을 2개
    	DB	"s3ich4n's world"
    	DB	0x0a		; 개행
    	DB	0
    
    	RESB	0x1fe-$		; 0 x001fe까지를 0x00로 채우는 명령
    	DB	0x55, 0xaa
    
    ; 이하는 boot sector이외의 부분을 기술
    
    	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    	RESB	4600
    	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    	RESB	1469432
    
    


    위 소스코드는 부트섹터 설정을 한 것이다. 부트섹터는 부팅 후 BIOS와 POST등의 과정을 거친 후 로드되는 가장 첫번째 부분이다. 그래서 floppy로 부팅을 한다고 세팅이 끝나면 hello, world!를 출력하는 프로그램(IPL 부분이라 할 수 있다)이 진행된다. 로더 프로그램과 끝에 0x55, 0xaa를 배치하는 것으로 부트섹터에 대한 설정을 마친다. 참고로 값에 '0x' 를 붙이면 16진수, 붙이지 않으면 10진수다.

    여기서 쓰인 어셈블러의 역할은 다음과 같다. 참조하길 바란다.

    DB: 1바이트 쓰기

    DW: 2바이트 쓰기

    DD: 4바이트 쓰기

    RESB: reserve byte, n byte 만큼 0으로 데이터를 채운다.


    메시지를 바꾸고 !cons_nt.bat을 켜고 asm한 후 새로 만들어진 이미지를 만들고 나서 run하면 바뀐 메시지가 적용되어 실행됨을 알 수 있다!


    출력되는 문자열을 s3ich4n's world!로 교체



    1일차 문서는 여기서 끝마치도록 하겠다.




    물론 지금의 프로그램은 FAT32, NTFS 등의 MBR보다 훨씬 간단하다.


    인텔 계열에서 통상 사용하는 MBR은 IPL+16바이트 크기의 파티션 테이블 4개+매직 넘버(55 AA)로 구성되어 있다. 그렇기 때문에 해당 부트로더도 다음과 같이 제작하지 않았나 싶다.

    실제 MBR이 어떻게 생겼는지에 대하여 더욱 좋은 글이 많이 있으니 해당 글 및 문서를 참조하기 바란다. 아래 문서는 FAT32, NTFS에서의 MBR에 대하여 기술하였다.


    참고:

    http://thestarman.narod.ru/asm/mbr/STDMBR.htm

    http://yebig.tistory.com/117

    Windows MBR 분석 (김동현 저)


    ps. 오개념 및 오탈자가 있다면 덧글 및 방명록을 통하여 언제든지 지적하여 주십시오. 읽어주셔서 감사합니다.


    '시스템 > OS 구조와 원리' 카테고리의 다른 글

    소개: 이 책은?  (0) 2016.06.28
Designed by Tistory.