What is the difference between zImage and bzImage targets when compiling a kernel?



A. zImage is compressed using gzip, bzImage is compressed using bzip2
B. zImage is for 2.4 series kernels, bzImage is for 2.6 series kernels
C. zImage is loaded into low memory, bzImage is loaded into high memory
D. zImage is limited to 64k, bzImage is not

題解

zImage是使用「gzip」來壓縮的Linux Kernel Image,但bzImage並不是使用「bzip2」壓縮Linux Kernel Image。bzImage的「b」是「big」的意思,因此bzImage是指「big zImage」,顧名思義就是「大的zImage」。之所以有bzImage,是因為原先zImage的檔案大小上限是512KiB,雖然很小,但在當年算是夠用。但隨著Kernel功能愈來愈多,zImage的512KiB如今已經是遠遠不夠了。

在32位元(x86)的Linux作業系統中,虛擬記憶體位址被切割為3GiB的使用者空間(0x00000000 - 0xBFFFFFFF)和1GiB的核心空間(0xC0000000 - 0xFFFFFFFF),核心空間實際上只會固定使用其中前896MiB的位址,後面的128MiB是保留的位址(用來映射到實體記憶體中的「high memory」部份)。實體記憶體中的前段記憶體空間「low memory」(即16MiB的DMA Zone和880MiB的Normal Zone)是直接與核心空間位址的前896MiB連續對應的部份(當然,這邊的實體記憶體可能會比896MiB還要小,如果是這樣的話,核心空間位址的前896MiB就不會完全對應);而實體記憶體中的「high memory」(High Memory Zone)則是除了「low memory」之外的其餘的部份。

zImage只能使用low memory的空間(而且最高只能640KiB),bzImage則可以在low memory用完之後去再去使用high memory的空間(透過核心空間位址保留的128MiB來映射)。

至於現在64位元(x86_64)的Linux作業系統,由於記憶體位址空間充足,就沒有再區分low memory和high memory了。但是虛擬記憶體位址的區段定義也複雜了許多,有興趣的話可以參考這份文件:

https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt