OSDev

для всех
Текущее время: 28 мар 2024, 19:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 16:19 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
Добрый день! Столкнулся с проблемой при сборке 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. По возможности можете пояснить что не так или хотя бы указать на мою ошибку?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 18:18 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Очевидно проблема в структуре multiboot.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 18:40 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
Пожалуйста, подскажите что не так?

Код:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 20:34 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
У вас неточная информация о структуре 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 21:12 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
https://wiki.osdev.org/Meaty_Skeleton здесь они в мультибут прописали magic,flags и chechsum, почему мне необходимы еше значения? Возможно это совсем глупый вопрос, но я пытаюсь понять что к чему. Можете небольшой пример привести? Ибо мои манипуляции не привели к изменениям :с

ЗЫ спасибо за ваш ответ!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 22:16 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
"entry point is not in a segment". - ругается на то, что точка входа не попала в сегмент.
low_kernel_entry equ (kernel_entry - VM_BASE)
Тут вычитание лишнее.

ld очень кривая утилита в плане архитектуры - никогда не знаешь где и какая ошибка будет.
Лучше найти готовый скрипт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 22:20 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 22:23 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
pavia писал(а):
"entry point is not in a segment". - ругается на то, что точка входа не попала в сегмент.
low_kernel_entry equ (kernel_entry - VM_BASE)
Тут вычитание лишнее.

ld очень кривая утилита в плане архитектуры - никогда не знаешь где и какая ошибка будет.
Лучше найти готовый скрипт.


Ой, спасибо большое! Вычитание действительно лишнее, запустилось. Теперь буду разбираться почему лишнее))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 23:25 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Здесь задан базовый адрес 0xC0100000, поэтому low_kernel_entry нельзя делать ниже этой базы.
Код:
OUTPUT_FORMAT("elf32-i386")
ENTRY(low_kernel_entry)
SECTIONS
{
    . = 0xC0100000;


Последний раз редактировалось Himik 07 мар 2018, 23:43, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сборка ядраа
СообщениеДобавлено: 07 мар 2018, 23:43 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
grenders22 писал(а):
https://wiki.osdev.org/Meaty_Skeleton здесь они в мультибут прописали magic,flags и chechsum, почему мне необходимы еше значения? Возможно это совсем глупый вопрос, но я пытаюсь понять что к чему. Можете небольшой пример привести? Ибо мои манипуляции не привели к изменениям :с

Да, пожалуй ваш пример рассчитан на простой запуск без параметров. Но при необходимости можно задать точные параметры загрузки - что где и куда.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB