Przeglądając Makefiles jądra, znalazłem te warunki. Więc chciałbym wiedzieć, jaka jest różnica między vmlinux
, vmlinuz
, vmlinux.bin
, zimage
i bzimage
?
linux
kernel
file-format
Sen
źródło
źródło
vmlinuz.efi
używany w Ubuntu 14.04: askubuntu.com/questions/330541/what-is-vmlinuz-efiOdpowiedzi:
vmlinux
To jest jądro Linuksa w statycznie połączonym formacie pliku wykonywalnego. Ogólnie rzecz biorąc, nie musisz się martwić o ten plik, to tylko pośredni krok w procedurze rozruchowej.
Surowy plik vmlinux może być przydatny do celów debugowania.
vmlinux.bin
Taki sam jak vmlinux, ale w bootowalnym formacie surowego pliku binarnego. Wszystkie symbole i informacje o relokacji zostaną odrzucone. Wygenerowane
vmlinux
przezobjcopy -O binary vmlinux vmlinux.bin
.Vmlinuz
Plik vmlinux zwykle jest kompresowany
zlib
. Od 2.6.30LZMA
ibzip2
są również dostępne. Dodając dalsze możliwości rozruchu i dekompresji do vmlinuz, obraz może być użyty do uruchomienia systemu z jądrem vmlinux. Kompresja vmlinux może wystąpić w przypadku zImage lub bzImage.Funkcja
decompress_kernel()
obsługuje dekompresję vmlinuz podczas uruchamiania, komunikat wskazuje to:zImage (
make zImage
)Jest to stary format dla małych jąder (skompresowany, poniżej 512 KB). Podczas uruchamiania ten obraz jest ładowany w małej ilości pamięci (pierwsze 640 KB pamięci RAM).
bzImage (
make bzImage
)Duży zImage (nie ma to nic wspólnego
bzip2
) powstał, gdy jądro rosło i obsługuje większe obrazy (skompresowane, ponad 512 KB). Obraz jest ładowany w wysokiej pamięci (powyżej 1 MB pamięci RAM). Ponieważ dzisiejsze jądra mają znacznie ponad 512 KB, jest to zwykle preferowany sposób.Kontrola Ubuntu 10.10 pokazuje:
źródło
/arch/$ARCH/boot/compressed/misc.c
, patrz tutaj: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/…Wykonaj pełną kompilację jądra i wyszukaj pliki
Takie podejście może dać pewien wgląd, nigdy nie będzie przestarzałe i pomoże ci łatwo znaleźć, która część systemu kompilacji robi co.
Gdy masz konfigurację kompilacji, która generuje jeden z plików, kompiluj za pomocą:
Zmodyfikuj komentarz do jakiegoś pliku C, aby wymusić ponowne połączenie (np.
init/main.c
Jest dobre), jeśli już go zbudowałeś.Teraz sprawdź
f.log
i wyszukaj interesujące Cię zdjęcia.Na przykład w wersji 4.19 stwierdzimy, że:
Cienkie archiwa są wymienione na stronie : https://stackoverflow.com/questions/2157629/linking-static-libraries-to-other-static-libraries/27676016#27676016 Są to archiwa, które po prostu wskazują inne archiwa / obiekty, zamiast je kopiować.
Jądro przeniosło się z przyrostowego łączenia do cienkich archiwów w wersji 4.9, jak opisano na stronie : https://stackoverflow.com/questions/29391965/what-is-partial-linking-in-gnu-linker/53959624#53959624
Pełna interpretacja logów
Kiedy zaczynamy czytać pełne dzienniki kompilacji z kopii zapasowej, najpierw widzimy:
więc te dwie są po prostu połączone symbolicznie.
Następnie szukamy trochę dalej
x86/boot/bzImage
i znajdujemy:arch/x86/boot/tools/build
jest plikiem wykonywalnym, więc uruchamiamy go, zobacz komunikat pomocy:i grep, aby znaleźć źródło:
Więc to musi być narzędziem generowania
arch/x86/boot/bzImage
odarch/x86/boot/vmlinux.bin
i inne pliki TODO co jest punktembuild
dokładnie?Jeśli kierujemy
arch/x86/boot/vmlinux.bin
widzimy, że jest to tylkoobjcopy
zarch/x86/boot/compressed/vmlinux
:i
arch/x86/boot/compressed/vmlinux
jest zwykłym plikiem ELF:ls -hlSr
twierdzi, żepiggy.o
jest to zdecydowanie największy plik, więc szukamy go i musi pochodzić z:.tmp_
prefiks wyjaśniony poniżej.arch/x86/boot/compressed/piggy.S
zawiera:patrz także: https://stackoverflow.com/questions/4158900/embedding-resources-in-executable-using-gcc/36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
pochodzi z:który pochodzi z:
który pochodzi z:
co robi:
vmlinux
jest ogromny, ale wszystkie pokazane obiekty są małe wedługls -l
, więc zbadałem i dowiedziałem się o nowejar
funkcji, o której nie wiedziałem: cienkich archiwach.W:
kompilacja:
T
określa cienkie archiwum.Możemy wtedy zobaczyć, że wszystkie archiwa podrzędne są również cienkie, np. Odkąd zmodyfikowałem
init/main.c
, mamy:który w końcu pochodzi z pliku C za pomocą polecenia takiego jak:
Nie mogę znaleźć
init/.tmp_main.o
doinit/main.o
wchodzenia na dzienniki, które jest wstyd ... z:widzimy, że najprawdopodobniej pochodzi
scripts Makefile.build
i jest powiązany z tym, wCONFIG_MODVERSIONS
którym włączyłem:Analiza wykonana za pomocą tej konfiguracji, która zawiera
CONFIG_KERNEL_GZIP=y
.aarch64
arch/arm64/boot/Image
Tylko nieskompresowany
objcopy
zvmlinux
:vmlinux
jest uzyskiwany w zasadzie dokładnie tak samo, jak w przypadku x86, choć cienkie archiwa.arch/arm/boot/zImage
Bardzo podobny do X86 z zamkiem błyskawicznym
vmlinux
, ale bez magicznegobuild.c
kroku. Podsumowanie łańcucha połączeń:QEMU v4.0.0 można uruchomić z bzImage, ale nie vmlinux
To kolejna ważna praktyczna różnica: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
źródło
Wszystko jest tutaj: http://en.wikipedia.org/wiki/Vmlinux
źródło
vmlinux :
Nieskompresowany i nie rozruchowy format pliku jądra Linux, tylko pośredni krok do produkcji
vmlinuz
.vmlinuz :
Skompresowany i rozruchowy plik jądra systemu Linux. To jest faktycznie
zImage
lubbzImage
plik.zImage :
W przypadku starych jąder po prostu dopasuj
640k
rozmiar pamięci RAM.bzImage :
Big zImage
nie640k
limit rozmiaru pamięci RAM, może znacznie większy.Proszę odnieść się do tego dokumentu: vmlinuz Definicja .
źródło
bzImage jest celem używanym w architekturach x86 pracujących z BIOSem komputera. Natomiast zImage jest specyficznym dla architektury celem najczęściej używanym dla urządzeń osadzonych i działa dobrze z ich bootloaderami.
źródło