OSDev http://osdev.su/ |
|
Сборка ядраа http://osdev.su/viewtopic.php?f=6&t=1878 |
Страница 1 из 1 |
Автор: | grenders22 [ 07 мар 2018, 16:19 ] |
Заголовок сообщения: | Сборка ядраа |
Добрый день! Столкнулся с проблемой при сборке iso. Собирая ядро своим make файлом и запуская его через qemu (qemu-system-i386 -kernel ker) все работает. Попытка собрать iso с помощью grub и запустить в qemu (qemu-system-i386 -cdrom ker) я получаю "entry point is not in a segment". Ниже прикрепляю linker и команду сборки iso. Код: OUTPUT_FORMAT("elf32-i386") ENTRY(low_kernel_entry) SECTIONS { . = 0xC0100000; .text ALIGN(4K) : AT(ADDR(.text)-0xC0000000) { *(.multiboot) *(.text) } .rodata ALIGN (4K) : AT(ADDR(.rodata)-0xC0000000) { *(.rodata) } .bss ALIGN(4K) : AT(ADDR(.bss)-0xC0000000) { *(.COMMON) *(.bss) *(.initial_stack) } .data ALIGN(4K) : AT(ADDR(.data)-0xC0000000) { *(.data) } end = .; } Код: #!/bin/sh set -e mkdir -p isodir mkdir -p isodir/boot mkdir -p isodir/boot/grub cp ker.kernel isodir/boot/ker.kernel cat > isodir/boot/grub/grub.cfg << EOF menuentry "ker" { multiboot /boot/ker.kernel } EOF grub-mkrescue -o ker.iso isodir Есть подозрения что неверен menuentry. По возможности можете пояснить что не так или хотя бы указать на мою ошибку? |
Автор: | Himik [ 07 мар 2018, 18:18 ] |
Заголовок сообщения: | Re: Сборка ядраа |
Очевидно проблема в структуре multiboot. |
Автор: | grenders22 [ 07 мар 2018, 18:40 ] |
Заголовок сообщения: | Re: Сборка ядраа |
Пожалуйста, подскажите что не так? Код: MBALIGN equ 1<<0
MEMINFO equ 1<<1 FLAGS equ MBALIGN | MEMINFO MAGIC equ 0x1BADB002 CHECKSUM equ -(MAGIC + FLAGS) ; Some constants for loading higher half kernel VM_BASE equ 0xC0000000 PDE_INDEX equ (VM_BASE >> 22) PSE_BIT equ 0x00000010 PG_BIT equ 0x80000000 section .multiboot align 4 dd MAGIC dd FLAGS dd CHECKSUM section .data align 4096 global TEMP_PAGE_DIRECTORY TEMP_PAGE_DIRECTORY: dd 0x00000083 times(PDE_INDEX - 1) dd 0 dd 0x00000083 times(1024 - PDE_INDEX - 1) dd 0 section .initial_stack, nobits align 4 stack_bottom: resb 104856 stack_top: section .text global kernel_entry global low_kernel_entry low_kernel_entry equ (kernel_entry - VM_BASE) kernel_entry: mov ecx, (TEMP_PAGE_DIRECTORY - VM_BASE) mov cr3, ecx mov ecx, cr4; or ecx, PSE_BIT mov cr4, ecx mov ecx, cr0 or ecx, PG_BIT mov cr0, ecx lea ecx, [higher_half] jmp ecx higher_half: mov dword[TEMP_PAGE_DIRECTORY], 0 invlpg[0] mov esp, stack_top extern kernel_early push ebx call kernel_early loop: jmp loop |
Автор: | Himik [ 07 мар 2018, 20:34 ] |
Заголовок сообщения: | Re: Сборка ядраа |
У вас неточная информация о структуре multiboot. Кроме 3-х значений, там есть ещё несколько dd multiboot magic signature: Специальная сигнатура этой структуры dd flags: Флаги dd checksum: Контрольная сумма dd header_addr: Адрес этой структуры dd load_addr: Адрес загрузки модуля в память dd load_end_addr: Конец данных (data) dd bss_end_addr: Конец нулевых данных (bss) dd entry_addr: Адрес старта программы При этом во Флаге должен быть установлен бит 16, 10000h. http://www.gnu.org/software/grub/manual ... iboot.html |
Автор: | grenders22 [ 07 мар 2018, 21:12 ] |
Заголовок сообщения: | Re: Сборка ядраа |
https://wiki.osdev.org/Meaty_Skeleton здесь они в мультибут прописали magic,flags и chechsum, почему мне необходимы еше значения? Возможно это совсем глупый вопрос, но я пытаюсь понять что к чему. Можете небольшой пример привести? Ибо мои манипуляции не привели к изменениям :с ЗЫ спасибо за ваш ответ! |
Автор: | pavia [ 07 мар 2018, 22:16 ] |
Заголовок сообщения: | Re: Сборка ядраа |
"entry point is not in a segment". - ругается на то, что точка входа не попала в сегмент. low_kernel_entry equ (kernel_entry - VM_BASE) Тут вычитание лишнее. ld очень кривая утилита в плане архитектуры - никогда не знаешь где и какая ошибка будет. Лучше найти готовый скрипт. |
Автор: | pavia [ 07 мар 2018, 22:20 ] |
Заголовок сообщения: | Re: Сборка ядраа |
Himik писал(а): У вас неточная информация о структуре multiboot. Кроме 3-х значений, там есть ещё несколько Так они не обязательные. Цитата: Offset Type Field Name Note
0 u32 magic required 4 u32 flags required 8 u32 checksum required 12 u32 header_addr if flags[16] is set 16 u32 load_addr if flags[16] is set 20 u32 load_end_addr if flags[16] is set 24 u32 bss_end_addr if flags[16] is set 28 u32 entry_addr if flags[16] is set 32 u32 mode_type if flags[2] is set 36 u32 width if flags[2] is set 40 u32 height if flags[2] is set 44 u32 depth if flags[2] is set |
Автор: | grenders22 [ 07 мар 2018, 22:23 ] |
Заголовок сообщения: | Re: Сборка ядраа |
pavia писал(а): "entry point is not in a segment". - ругается на то, что точка входа не попала в сегмент. low_kernel_entry equ (kernel_entry - VM_BASE) Тут вычитание лишнее. ld очень кривая утилита в плане архитектуры - никогда не знаешь где и какая ошибка будет. Лучше найти готовый скрипт. Ой, спасибо большое! Вычитание действительно лишнее, запустилось. Теперь буду разбираться почему лишнее)) |
Автор: | Himik [ 07 мар 2018, 23:25 ] |
Заголовок сообщения: | Re: Сборка ядраа |
Здесь задан базовый адрес 0xC0100000, поэтому low_kernel_entry нельзя делать ниже этой базы. Код: OUTPUT_FORMAT("elf32-i386")
ENTRY(low_kernel_entry) SECTIONS { . = 0xC0100000; |
Автор: | Himik [ 07 мар 2018, 23:43 ] |
Заголовок сообщения: | Re: Сборка ядраа |
grenders22 писал(а): https://wiki.osdev.org/Meaty_Skeleton здесь они в мультибут прописали magic,flags и chechsum, почему мне необходимы еше значения? Возможно это совсем глупый вопрос, но я пытаюсь понять что к чему. Можете небольшой пример привести? Ибо мои манипуляции не привели к изменениям :с Да, пожалуй ваш пример рассчитан на простой запуск без параметров. Но при необходимости можно задать точные параметры загрузки - что где и куда. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |