2013-07-09 5 views
4

커널의 Multiboot v1 헤더를 감지하지 못하는 Grub 2 (및 QEMU의 -kernel)에 문제가 있습니다. 나는 .text 앞에 별도의 섹션에 머리글이 있습니다.커널에서 멀티 부트 헤더를 감지하지 못했습니다.

linker.ld :

SECTIONS 
{ 
    . = 1M; 

    .multiboot ALIGN(4K) : 
    { 
     *(.multiboot) 
    } 

    .text ALIGN(4K) : 
    { 
     *(.text) 
    } 

    [snip] 

boot.s (구문으로 GNU) :

kernel.bin:  file format elf32-i386 

Contents of section .multiboot: 
101000 02b0ad1b 03000000 fb4f52e4   .........OR.  
Contents of section .text: 
[snip] 
: 나는 마법의 숫자로 지정된 헤더 섹션이 추가되고 있음을 확인했습니다

.set MAGIC, 0x1badb002 
.set FLAGS, (1<<0 | 1<<1) # align, provide mem map 
.set CHECKSUM, -(MAGIC + FLAGS) 

.section .multiboot 
    .long MAGIC 
    .long FLAGS 
    .long CHECKSUM 

.section .text 
    [snip] 

그래 브 2는 커널에 유효한 멀티 부팅이 없다고 말합니다. ADER, 그리고 QEMU의 -kernel 옵션을 사용하여 발생합니다

BIOS에 매핑 된 범위의 주소 것 같다,하지 멀티 부팅이 곳이어야한다
qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a000 

.

나는 Bran과 OSDev (이전의 광산 커널)의 일반적인 코드와 비교해 봤지만, 내가 잘못하고있는 것을 파악할 수는없는 것 같습니다.

+0

저도 같은 오류를 exaclt 한 잘못된 것입니다. 나는 해결책을 발견 할 수있다. – rkmax

답변

3

내 멀티 부트 커널과 동일한 오류가 발생했습니다. .text 섹션의 크기가 약 4k를 초과하는 것과 동일한 오류가 발생했습니다. 내 문제의 원인은 링크시에 kernel.o를 먼저 지정하고 ld 인수에서 loader.o를 두 번째로 지정했기 때문에 (필자는 OSDev Wiki Bare Bones를 기반으로 개발할 프로젝트를 만들기 위해 Makefile을 작성했습니다). Multiboot는 처음 4k에서 헤더를 찾았고, 코드가 커지면서 (커널 .text 섹션의 로더 앞에 위치 했으므로)이 영역 밖으로 헤더를 밀어 냈습니다. 멀티 부트 헤더에 별도의 섹션을 사용했는데, 좋은 아이디어 일 수도 있고 그렇지 않을 수도 있습니다. 모르겠습니다. 것들 내가 시도를하려는 :

  • 는 .multiboot 부분을 제거하고 로더의 시작 부분에 내용을 넣어, 그리고 loader.o 링커에 대한 첫 번째 인수가 있는지 확인하고 kernel.o 온다 후. 시작은 0x00100000에있는 경우
  • 사용 readelf -a kernel (즉 멀티 부트 헤더는 최초의 4K에 실제로 있는지 확인하기 위해, 오프셋 아래 0x00101000입니다.
+2

나는 같은 오류가있다, 당신은 샘플이있는 github 저장소가있다? – rkmax

+0

@rkmax 작업 예제 : https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0/ 멀티 부팅/안녕하세요 - 세계 –