>> Read No. 42527 article  
[질문] 제가 만든 부트로더 소스입니다.

등록 2002-02-16 00:12:00     조회 2
이름 굉이    

		이번에 운영체제를 공부하면서 만들어 본 부트로더 소스입니다.
 그렇게 복잡하지는 않을 줄 알았는데 2주동안이나 걸려서 만든게
 아직도 요모양입니다.
 일단 활성 파티션은 찾아서 메세지를 출력하는 것 까지는
 돌아가는데 윈도우를 실행시키는게 안됩니다.
 KernelLoad 프로시저에 FAT를 읽어서 처음 섹터를 메모리로
 읽어들여서 그쪽으로 ret하게 만들었습니다.
 계속 생각해보고 있지만 뭐가 잘못된 건지를 모르겠습니다.
 win95의 부트로더를 분석한 걸 읽어봤는데 저와 거의 흡사하게
 한 섹터만 읽어서 그쪽으로 점프하던데요 저는 xp를 쓰고 있습니다.
 제가 뭘 몰라서 못하고 있는건지 말씀해주시면 감사하겠습니다.
 masm으로 만들었고여
 partcopy test3.com 0 200 -f0
 이렇게 디스크에 써서 디스크로 부팅했습니다.
 <pre>
  CodeSeg	segment
		assume cs:CodeSeg, ds:CodeSeg, ss:CodeSeg
  Main		proc
 		;실행을 시작할
		mov   ax, 7c0h
		push  ax
		mov   ax, offset start
		push  ax
		retf
 start:
 		cli
		mov   ax, cs
		mov   ds, ax
		mov   es, ax
		mov   ss, ax            ; 모든 세그먼트 재설정
		mov   sp, offset main   ; 스텍 포인터 변경
		sti
 		;하드 디스크의 부트 섹터를 읽어서 메모리 0:1000h에 올립니다.
		xor ax, ax
		mov es, ax
		mov dx, 0080h
		mov cx, 0001h
		mov ax, 0201h
		mov bx, 1000h
		int 13h
 		;si에 부트 섹터의 시작지점이 들어갑니다.
		mov si, bx
		push si
		call FoundActive		;활성 드라이브를 찾습니다.
 		cmp ax, 0				;활성 드라이브를 못 찾았을때
		jz L_Error
		mov si, offset HDDmsg	;활성 드라이브를 찾았을때
		call PrintMsg			;메세지를 출력하는 프로시저
 		;다시 부트 섹터의 시작 지점을 로드합니다.
		pop si
		call LoadKernel			;커널을 로드합니다.
  		;활성 가능한 파티션이 없으면 에러메세지를 출력하고 멈춥니다.
	L_Error:
		mov si, offset PartError
		call PrintMsg
	L_Hang:
		jmp L_Hang
 Main		endp
  FoundActive	proc
 		mov cx, 4			;4개의 테이블이 있다.
		add si, 1beh
 	L_ReadTable:
		cmp cx, 0
		jz L_NotFound
		mov al, byte ptr es:[si]	;테이블을 읽는다.
 		cmp al, 80h					;활성인지를 검사한다.
		jz L_Found					;활성을 찾았다.
 		;활성이 아니라면
		add si, 10h					;다음 테이블을 읽기위해 10h를 더한다.
		dec cx
		cmp al, 00					;비활성이라면
		jz L_ReadTable				;다음 테이블을 읽는다.
 		;80h, 00h도 아니면 파티션 에러다.
	L_NotFound:
		mov ax, 0
		ret
 
	L_Found:
		dec cx
		add si, 10h
		mov al, byte ptr es:[si]	;테이블을 읽는다.
  		cmp al, 80h					;활성인지를 검사한다.
		jz L_NotFound				;또 활성이면 에러
 		cmp al, 00
		jnz L_NotFound				;80h, 00h도 아니면 에러다.
 		cmp cx, 1					;마지막 테이블까지 읽었으면 끝낸다.
		jnz L_Found
  		;활성 파티션이 하나이고 에러가 없을때
		mov ax, 0ffh
		ret
 FoundActive	endp
 ;si에 들어있는 ascz 메세지를 읽어서 출력합니다.
;인자 : si
PrintMsg	proc
	L_PrintChar:
		mov al, byte ptr cs:[si]
		cmp al, 0
		jz L_PM
		mov bx, 0007h
		mov ah, 0eh
		int 10h
		inc si
		jmp L_PrintChar
 	L_PM:
		ret
PrintMsg	endp
 ;부트 섹터에서 FAT를 읽어서 데이타 영역의 첫 섹터를 찾아
;0:0600h에 로드해서 점프합니다.
LoadKernel	proc
 		xor ax, ax
		mov es, ax
		mov ax, 0201h
		add si, 1beh
		mov dx, word ptr es:[si]		;FAT의 1,2 바이트를 읽습니다.
		add si, 2
		mov cx, word ptr es:[si]		;FAT의 다음 두 바이트를 읽습니다.
		mov bx, 0600h
		int 13h
 		;커널을 로드한 지점으로 점프합니다.
		xor ax, ax		;세그먼트 푸쉬
		push ax
		mov ax, 0600h	;오프셋 푸쉬
		push ax
 		ret				;점프?
LoadKernel	endp
 	HDDmsg		db	"Founded active HDD drive", 0
	PartError	db	"Can't find active partition", 0
db 		11ah	dup (?)
db		55H, 0AAH
  CodeSeg		ends
 			end			Main
 </pre>
 --
이름
암호
Register [ localhost 목록보기 윗글 아랫글
글쓰기
답장쓰기 수정 삭제
정규표현식 [ 상세 검색 ]
페이지로딩: [ 1.33 초 ] 작업시간: [ 0.35 초 ]

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved
[TOP]

적수네 동네
+
| 적수네 동네
| 공부방
| 리눅스 잡지 서고
| LSN 소스
| 링크 모음
+---+
게시판
+
| 떠들어보세!
| 질문과 답변
| 새소식과 정보
| 1원짜리 팁?
| 대화방
+---+
칼럼?
+
| 세하 훔쳐보기
| Welcome2nite
| 혜진의 염장판
+---+
리눅스 상표권
+
| 반대 서명란
| 토론 게시판
+---+
GNU
+
| GNU 선언문
| GNU GPL
| GNU 미러 목록
+---+
프로젝트?
+
| 리눅스카운터
| RC5DES
| 실질헌법 제작
+---+
커널 소식
+
| 안정 버젼: 2.4.14
+---+
테마 선택
+
LSN 방송국?
+
| OFF AIR
+---+
회원
+
| 로그인
+---+
[ 적수네 동네 ] [ 리눅스 상표권 독점 반대 ] [ 한글 리눅스 문서 프로젝트 ] [ KrLine ] [ 사랑넷 ] [ Valid HTML 4.0! ] [ SlashDot ] [ Freshmeat ]
Copyleft (C) 1998-2001 Byeong-Chan Kim . License
TIME: 1791766163
System by WYZsoft, HDD by I.O.Linux, Mizi Research, Embryo, WOWLINUX, Domain by SarangNet, Network by KrLine.