2012-07-16 3 views
3

부트 로더는 2 단계로 구분됩니다. 첫 번째 스테이지는 어셈블리로 작성되고 두 번째 스테이지는 두 번째 스테이지 만 C에로드됩니다. Stage1은 C에서 0x0500 : 0 주소로 코드를로드하고 거기서 점프합니다. Stage2는 "hello message"를 작성하고 중지해야합니다. 어쩌면 내가 삭제 shouldt objcopy의 somethnig으로 삭제원시 이진 파일을 실행하기위한 시작 주소 설정

cc -nostartfiles -nostdlib -c stage2.c 
ld -s -T scrptfile.ld stage2.o /* I'm using ld just to set starting address of executable */ 
objcopy -O binary stage2 stage2.bin /* delete all unuseful data */ 

링커 스크립트

SECTIONS 
{ 
    . = 0x0500; 
    .text : { *(.text)} 
    .data : { *(.data)} 
    .bss : { *(.bss)} 
} 

을 (그러나 아무것도 일하지) :

내가 만든 원시 이진에 시작 주소를 설정하는 여러 가지 방법을 시도했다.

어떻게하면이 stage2.bin을 실행할 수 있습니까?

원시 바이너리가 16 비트 만 허용 할 때 32 비트 길이 명령어를 사용하여 작성된 C 코드를 이해합니까?

P. 매개 변수 -set-start (objcopy)가 오류를 반환합니다. 잘못된 bfd 대상입니다. 출력 파일이 바이너리이기 때문입니까?


답변 해 주셔서 감사합니다.

+0

링커 스크립트를 보여줄 수 있습니까? 코드를 분해하면 코드가 합리적으로 보입니까? –

답변

6

. = 0x05000x0500:0에 해당하지 않습니다. 0x0500:0은 실제 주소가 0x5000이고 0x500이 아님

또한 C 코드를 32 비트로 컴파일하고 리얼 모드 (16 비트)로 실행하면 작동하지 않습니다. 코드를 16 비트로 컴파일하거나 CPU를 32 비트 보호 모드로 전환해야합니다. 16 비트 코드를 컴파일하는 C 컴파일러가 아직 많지 않습니다. 터보 C++는 하나입니다. Open Watcom은 또 하나입니다. AFAIK, gcc는 그렇게 할 수 없습니다.

마지막으로 엔트리 포인트가 0x500 : 0 (실제 0x5000) 일 것으로 예상됩니다. 링커에게이 사실을 알려 주어야한다. (가능하다면 어떻게 기억하지 못한다.) 엔트리 포인트의 임의의 위치를 ​​처리한다. (즉, 바이너리에서 추출한다.)

+0

http://bellard.org/tcc/tccboot.html은 커널 개발에 도움이 될 수 있습니다. –