GNU/Linux >> Belajar Linux >  >> Linux

Linux – Apakah Header Vmlinux Berisi Panjang Gambar Kernel?

Saya mencoba membongkar file gabungan yang terdiri dari beberapa bagian, salah satunya adalah kernel yang tidak terkompresi yang diapit di antara beberapa file lainnya. Saya mencoba mencari panjang pasti dari bagian kernel yang terbukti sulit.

Apakah ada indikasi di header vmlinux tentang berapa banyak data yang harus dibaca bootloader sebelum dijalankan, atau diasumsikan bahwa semua konten file vmlinux akan dimuat saat handoff dari bootloader?

Jawaban yang Diterima:

Jawaban cepatnya adalah "tidak", tetapi jika ini adalah gambar ELF maka dengan beberapa peretasan Anda mungkin dapat menemukan kernel. Lihat readelf retas di bawah.

Bootloader bertanggung jawab untuk mengetahui format file apa pun di mana kernel dan sistem file root berada. Ini termasuk mengetahui ukuran file kernel, dalam format apa pun itu. Pada PowePC dan Blackfin, bootloader bertanggung jawab untuk mendekompresi seluruh kernel jika dikompresi, dan menuliskannya ke lokasi akhir di RAM. Pada ARM, kernel dapat melakukan dekompresi sendiri dan bootloader hanya perlu menyalin file kernel mentah ke tempat yang nyaman di RAM dan memulai eksekusi.

Jika kernel melakukan dekompresi sendiri, maka simbol yang menunjukkan ukuran file kernel terkompresi mungkin atau mungkin tidak berada di suatu tempat dalam kode dekompresi di awal file, tergantung pada algoritme dekompresi yang digunakan, tetapi Anda tidak memiliki cara untuk mengetahui di mana tanpa peta tautan untuk pembuatan kernel tertentu. Tentu saja bootloader tidak tahu.

Kode kernel yang tidak dikompresi itu sendiri diapit oleh dua simbol, _stext dan _end yang alamatnya adalah awal dan akhir dari kernel itu sendiri, tetapi tidak menyertakan sejauh mana initramf yang disertakan, jika sebuah initramf telah ditautkan ke biner kernel. Tingkat initramfs diatur oleh linker dalam dua simbol kernel, __initramfs_start dan __initramfs_end . Bootloader umumnya tidak memiliki kemampuan untuk membaca tabel simbol kernel (ada di System.map file), dan tanpa kemampuan ini mereka tidak akan tahu di mana _end dan __initrams_end simbol ada di file kernel. Artinya, posisi simbol bukan offset tetap dari awal file biner. Ini ditentukan pada waktu tautan dan dapat bervariasi tergantung pada konfigurasi pembuatan kernel.

Untuk kernel yang tidak dikompresi dalam format ELF, Anda mungkin dapat mengidentifikasi awal file vmlinux dengan mencari header ELF (177 E L F di od -c dump dari file gabungan). Anda kemudian dapat melakukan readelf -e atau objdump -h pada sisa file dari titik ini untuk menemukan bagian dengan offset file tertinggi (.shstrtab ). Tambahkan ukuran bagian ke offset ini dan itu membawa Anda ke akhir vmlinux. Saya menguji metode ini menggunakan vmlinux PPC yang tidak dilucuti dan mendapatkan ukuran yang sama persis dengan ukuran file vnlinux mandiri. Setelah mengupas kernel, metode ini memberikan hasil yang lebih pendek 1283 byte dari ukuran gambar yang dilucuti.

Terkait:Berbagi gambar VirtualBox ... mengkloning, mengekspor, atau menyalin?

Sistem tertanam biasanya menggunakan format file seperti mkimage untuk mengemas kernel, rootfs, pohon perangkat dan komponen lainnya. U-boot misalnya adalah mkimage aware, jadi ia tahu di mana biner kernel dimulai dan diakhiri di dalam file mkimage dan ia tahu apakah kernel dikompresi atau tidak dan ke alamat RAM apa untuk menulis file kernel.


Linux
  1. Linux – Apa Arti Titik Setelah Bit Izin File?

  2. Mengapa File Terjemahan Bash Tidak Berisi Semua Teks Kesalahan?

  3. Linux – Bagaimana Cara Memeriksa Informasi Struktur Direktori File Unix/linux?

  1. Linux – Apa yang Disiratkan oleh Tata Letak Memori Kernel Virtual Di Dmesg?

  2. Apa yang dilakukan make oldconfig persis di makefile kernel Linux?

  3. Apakah mungkin mem-boot kernel Linux tanpa membuat gambar initrd?

  1. Di mana file header <conio.h> di Linux? Mengapa saya tidak dapat menemukan <conio.h>?

  2. Bagaimana kernel Linux menentukan urutan panggilan __init?

  3. Emulator tidak dapat menemukan string 'versi Linux ' dalam file gambar kernel