LINUX.ORG.RU

объеденить i386 и x86_64


0

1

Доброго времени суток!

Изучаю туториал по разработке ядра (был недавно в новостях), возник такой вопрос: загрузчик выполняет 32-битный код (по моему так) после чего передает управление в ядро. Значит начальный код ядра должен быть 32-битным. Затем ядро осуществляет переход в long mode (64 бит), становятся доступны адресация и команды 64 битного режима. Получаем что в одном файле ядра мы должны иметь и 32-битный и 64-битный код, но ld-ругается при линковке при попытке сотворить такое.

Чую, что я где-то неправильно себе представляю процесс загрузки 64-битных ядер, объясните в двух словах, как это должно происходить?

У меня есть только предположение, что код инициализации такого ядра и перевод в long mode тоже должен быть 64-битным ([BITS 64] в nasm), но до этого перехода использовать 32-битные команды (с регистрами eax, ebx и т.п. а не rax и rbx)

Спасибо!

объеденить

Эх, срамота... Проверочное слово «единый».

akk ★★★★★
()

arch/x86/kernel/head_64.S:

        .text
        __HEAD
        .code64
        .globl startup_64
startup_64:

        /*
         * At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 1,
         * and someone has loaded an identity mapped page table
         * for us.  These identity mapped page tables map all of the
         * kernel pages and possibly all of memory.
         *
         * %esi holds a physical pointer to real_mode_data.
         *
         * We come here either directly from a 64bit bootloader, or from
         * arch/x86_64/boot/compressed/head.S.
         *
         * We only come here initially at boot nothing else comes here.
         *
         * Since we may be loaded at an address different from what we were
         * compiled to run at we first fixup the physical addresses in our page
         * tables and then reload them.
         */

        /* Compute the delta between the address I am compiled to run at and the
         * address I am actually running at.
         */
        leaq    _text(%rip), %rbp
        subq    $_text - __START_KERNEL_map, %rbp

        /* Is the address not 2M aligned? */
        movq    %rbp, %rax
        andl    $~PMD_PAGE_MASK, %eax
        testl   %eax, %eax
        jnz     bad_address

и т.д.

ttnl ★★★★★
()

задай линкеру выходной формат принудительно ключом -m

chg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.