Я работаю над пониманием того, как ядро 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
(я думаю, где мы сейчас находимся).
То, за чем я не слежу и нуждаюсь в помощи, это:
Какой раздел делает _bss-8
см.?
Это может стать понятным, как только я пойму, что такое _bss-8
, но как (_bss-8)(%rip)
и (_bss-8)(%rbx)
дают нам информацию о том, где находится сжатое ядро и где это идет?
Почему мы помещаем $_bss >> 3
в %rcx
в качестве счетчика для копирования данных? Почему не что-то связанное с rodata..compressed
?