Понимание того, как копирование сжатого ядра Linux работает в head_64.S - PullRequest
2 голосов
/ 04 апреля 2020

Я работаю над пониманием того, как ядро ​​Linux v3.19 готовится к распаковке на машине с архитектурой x86_64 в arch/x86/boot/compressed/head_64.S. Меня смущает то, что перед распаковкой происходит копирование сжатого образа ядра в другое место в памяти. Я скопировал код ниже с моим пониманием каждой строки; У меня возникают проблемы с // ? комментариями.

/*
 * Copy the compressed kernel to the end of our buffer
 * where decompression in place becomes safe.
 */
    pushq   %rsi  // %rsi contains the pointer to `boot_params`
    leaq    (_bss-8)(%rip), %rsi  // ?
    leaq    (_bss-8)(%rbx), %rdi  // ?
    movq    $_bss /* - $startup_32 */, %rcx  // ?
    shrq    $3, %rcx  // ?
    std           // set the direction so %rsi and %edi are decremented
    rep movsq     // copy data from %rsi to %rdi 8 bytes at a time
    cld           // clear the direction flag
    popq    %rsi  // restore pointer to `boot_params`

Я знаю, что на данный момент %rbx содержит место, где ядро ​​будет перемещено для распаковки, и что %rbp (хотя и не упоминается в этом фрагменте кода) содержит местоположение, которое было загружено ядром во время выполнения. Кроме того, я знаю, что _bss относится к началу раздела .bss, заданному сценарием компоновщика в arch/x86/boot/compressed/vmlinux.lds.S, и что сжатый образ ядра, который мы хотим скопировать, находится в .rodata..compressed, который находится между .head.text и .text (я думаю, где мы сейчас находимся).

То, за чем я не слежу и нуждаюсь в помощи, это:

  1. Какой раздел делает _bss-8 см.?

  2. Это может стать понятным, как только я пойму, что такое _bss-8, но как (_bss-8)(%rip) и (_bss-8)(%rbx) дают нам информацию о том, где находится сжатое ядро ​​и где это идет?

  3. Почему мы помещаем $_bss >> 3 в %rcx в качестве счетчика для копирования данных? Почему не что-то связанное с rodata..compressed?

...