2011-11-02 1 views
0

은 내가이 코드를 부팅하는 방법은 무엇입니까?

사람이 어떻게 여기

내가 명령을 사용 펜 드라이브를 사용하여 그것에서 조립 및 부팅으로 C 코드를 컴파일하는 말해 줄 수 ((리눅스에서 사용 GCC) C의에 조립 초보자 및 프로그램입니다 리눅스 터미널) :

gcc -S bootcode.c 

코드가 나에게

내가 그와 함께 무엇을 할 않는 bootcode.S 파일을 제공 ???

난 그냥 싶어 다음 코드를 컴파일하고 USB 스틱 여기

#include<stdio.h> 
void main() 
{ 
    printf ("hi"); 
} 

도움이에서 직접 실행 ???

+3

http://www.brokenthorn.com/Resources/OSDevIndex.html

, 희망이 ...^_^

Khilo 당신에게 도움이 되었습니까 전부 : 여기 (어셈블리 코딩)로 시작하는 링크입니다 http://wiki.osdev.org/Main_Page와 특히 - http://wiki.osdev.org/Boot_sequence에서 컴퓨터 부팅 방법을 확인하십시오. –

+3

맞다면 BIOS에서 USB 스틱을 직접 부팅 하시겠습니까? 이것은 엄청난 작업이며, 정상적인 프로그램이 할 수없는 많은 작업이 필요합니다 (예를 들어, printf가 사용할 운영 체제가 없음). 부트 로더 코드 및 운영 체제 개발에 대한 Google 검색을 수행해야합니다. –

답변

2

첫째,

는, 아무것도 같은 준비가 만든 C 라이브러리

당신은 부트 로더 코드를 작성할 때, 당신은 당신이 의미 CODE, 당신의 자신의 환경을 조성하는 것을 알아야한다 알고 있어야 이 이와 유사한 BIOS 서비스 (또는 인터럽트 루틴) 만 사용할 수 있습니다.

자, 여기에 "stdio.h"헤더가 없으므로 위의 코드가 부팅되지 않는다는 것을 알 수 있습니다. 즉, 컴파일 된 코드를 실행할 때 CPU가 이 헤더를 찾지 못하고 "printf"가 무엇인지 이해하지 못하게 될 것입니다 (printf는 stdio.h 헤더의 메소드이기 때문에). 그래서 문자열을 출력하려면 헤더 파일과 같은 별도의 파일에서이 함수를 작성하고 마지막 바이너리 파일을 만들 때 또는 같은 파일에 컴파일 할 때 객체 파일을 링크해야합니다. 너하기에 달렸다. 다른 방법이있을 수 있습니다, 나는 그들과 잘 친숙하지 않습니다. 그냥 연구를 해보십시오.

당신이 알아야 할 또 다른 사항은이 부팅 코드 (귀하의 경우 위 코드)를 메모리 위치 0x07C00 (0x0000h : 0x7C00 세그먼트 : 오프셋 표현)에로드하는 책임이있는 BIOS입니다. 이 메모리 위치에이 코드를 작성하는 코드, 하나

그에 해당하는 레지스터를로드하여 ORG 명령

2 또는 1-사용하여에서 (CS, DS들)

또한 세그먼트 : 오프셋 메모리 표현 체계에 익숙해 져야합니다. 그냥 Google로 읽거나 읽어야합니다. ntel 매뉴얼.

마지막으로, BIOS가 0x07C00에 코드를로드하려면 부트 코드가 512 바이트를 초과해서는 안되며 (섹터가 512 바이트이기 때문에 부트 미디어의 첫 번째 섹터에만 해당) 부트 디스크의 마지막 2 바이트를 찾아야합니다. 이 첫 번째 섹터 (바이트 510 & 바이트 511)는 부팅 서명 0x55AA이며, 그렇지 않으면 BIOS가이 코드를 AS BOOTABLE로 간주하지 않습니다. 보통이 같이 코딩 :

ORG 0x7C00

...

부팅 코드와 512 바이트가 충분하지 않기 때문에 더 많은 코드를로드 할 수 있습니다.

...

번 510 - ($ - $$) db 0x00; 그냥 알려, 나는 그것에 대해 페이지를 작성됩니다 그렇다면, 당신은 그물에 더 많은 리소스를 찾을 필요가 있기 때문에 내가 여기에 모든 것을 커버하고 있지 않다 510 바이트

   dw 0xAA55 ;Boot Sector signature,written in reverse order since it 

          will be stored as little endian notation 

까지 ZEROFILL, - 알제리

2

컴퓨터를 부팅하는 것은 그렇게 쉽지 않습니다. 부트 로더를 작성해야합니다. 부트 로더는 특정 규칙을 따라야하며 ROM과 같은 하드웨어와 일치해야합니다. 인터럽트를 비활성화하고 메모리를 예약해야합니다. MikeOS를 살펴보면 프로세스 이해에 도움이되는 훌륭한 프로젝트입니다. 건배

모든