Bagaimana kernel Linux dapat mengakses initramfs / initrd yang ditugaskan padanya?

8

Saya mencoba memahami proses boot mesin secara keseluruhan sejak Anda menekan tombol power. Ada bagian ini dari bootloader ke tahap initramfs saya tidak begitu mengerti di antara beberapa bit kecil lainnya.

Dengan konfigurasi Grub ini untuk entri, diambil dari instalasi default Ubuntu baru-baru ini:

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

Apa yang sebenarnya dilakukan dalam hal status sistem dan memori? Saya mengerti bahwa tugas Grub adalah "memuat dan menjalankan kernel" dan ia memiliki set modul sendiri untuk mengakses file di perangkat (atau jaringan) untuk mendapatkannya. Dalam contoh di sini insmods, set rootdan search- tetapi ini hanya dari perspektif Grub, dan tidak dibagikan dengan kernel, kan?

Saya juga menduga bahwa Grub memuat (salinan?) Dari kernel ke dalam memori ( linuxperintah ) dan menendangnya untuk memulai eksekusi. (dua langkah yang berbeda rupanya - jadi, bagaimana?) Parameter yang diberikan dapat dibaca di kernel dan ditafsirkan (apakah ini string besar yang dipetakan ke dalam memori di suatu tempat?) dan memberikan opsi untuk mengatur hal-hal yang diminta.

Saya juga melihat initrdopsi ini . Ini menunjuk ke initramfs saya yang dikompresi gzip, diperlukan untuk mem-boot perangkat root aktual yang ditentukan oleh root=. Tetapi bagaimana initramf ini disediakan untuk kernel? Ini tidak meneruskan alamat memori apa pun ke tempat ia dapat memuatnya, juga tidak dapat mengaksesnya sendiri, karena sudah dimuat sebelum kernel dimulai. Beberapa dokumentasi kernel mengatakan ini 'perangkat' file sistem initramfs dapat diakses melalui /dev/ram0, tapi saya tidak melihat bagaimana itu menjadi file perangkat yang dapat diakses untuk memulai. Ada sesuatu yang terjadi di bawah air yang tidak saya lihat, saya kira.

Saya juga tidak melihat bagaimana ini berhubungan dengan bootloader lain, termasuk platform yang tertanam, misalnya menggunakan U-boot / Coreboot. Apakah ini melakukan hal yang sama dengan Grub (alamat memori standar yang sama?) Dan sejauh mana ini dibandingkan dengan Grub tentang memuat kernel / initrd?

Untuk memperjelas pertanyaan saya, saya pikir saya benar-benar mengerti mengapa ada tahapan boot yang berbeda dan transisi apa yang terjadi, namun saya tidak melihat bagaimana itu terjadi dan apa tanggung jawab yang tepat untuk masing-masing tahapan. Saya merasa saya kehilangan beberapa "standar" yang menjadi dasar semua ini.

Saya akan sangat menghargai beberapa penjelasan tentang ini.

gertvdijk
sumber
Perhatikan bootperintah implisit di akhir urutan. Saya tidak yakin persis apa fungsinya di Grub, tetapi jika Anda menggunakan baris perintah Grub untuk memasukkan perintah-perintah ini secara manual, Anda perlu bootatau hanya akan duduk selamanya di grub>(atau setidaknya, sampai Anda bosan dan matikan komputer ). Perintah sebelumnya "hanya" mengatur lingkungan.
CVn
@ MichaelKjörling Dari pemahaman saya sekarang, bootakan membuat CPU melompat ke alamat kernel yang dimuat (mulai eksekusi). Untuk entri menu ini didefinisikan secara implisit. lihat ini .
gertvdijk

Jawaban:

6

Bootloader menyimpan initrd ke lokasi di memori, dan memberitahu kernel alamat memori dari gambar initrd. Sebagian besar sistem linux modern menggunakan skema initramfs menggunakan dracut , yang sebenarnya merupakan arsip cpio (bukan gambar disk) yang diurai ke sistem file tmpfs yang dibuat oleh kernel segera setelah eksekusi.

jsbillings
sumber
Saya sampai sejauh itu; tetapi bagaimana bootloader memberi tahu kernel tentang lokasi di memori? Di mana kernel mengambil alamat memori itu?
gertvdijk
3
@gertvdijk melihat kernel.org/doc/Documentation/x86/boot.txt yang menjelaskan bagaimana bootloader berkomunikasi dengan kernel, yaitu bootloader harus menyediakan parameter kernel dll juga.
Ulrich Dangel
@UlrichDangel Bagus! Persis apa yang saya cari. Rupanya, ini adalah protokol khusus perangkat keras (x86 dalam kasus ini) yang menjelaskan semuanya. Tulis sebagai jawaban dengan deskripsi singkat dan saya akan menerimanya.
gertvdijk