init: Add support for zstd compressed kernel
- Add the zstd and zstd22 cmds to scripts/Makefile.lib - Add the HAVE_KERNEL_ZSTD and KERNEL_ZSTD options Architecture specific support is still needed for decompression. Signed-off-by: Nick Terrell <terrelln@fb.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Tested-by: Sedat Dilek <sedat.dilek@gmail.com> Reviewed-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20200730190841.2071656-4-nickrterrell@gmail.com
This commit is contained in:
parent
4963bb2b89
commit
48f7ddf785
3
Makefile
3
Makefile
@ -464,6 +464,7 @@ KLZOP = lzop
|
||||
LZMA = lzma
|
||||
LZ4 = lz4c
|
||||
XZ = xz
|
||||
ZSTD = zstd
|
||||
|
||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
|
||||
-Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF)
|
||||
@ -512,7 +513,7 @@ CLANG_FLAGS :=
|
||||
export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
|
||||
export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF PAHOLE LEX YACC AWK INSTALLKERNEL
|
||||
export PERL PYTHON PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
|
||||
export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ
|
||||
export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD
|
||||
export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE
|
||||
|
||||
export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
|
||||
|
15
init/Kconfig
15
init/Kconfig
@ -191,13 +191,16 @@ config HAVE_KERNEL_LZO
|
||||
config HAVE_KERNEL_LZ4
|
||||
bool
|
||||
|
||||
config HAVE_KERNEL_ZSTD
|
||||
bool
|
||||
|
||||
config HAVE_KERNEL_UNCOMPRESSED
|
||||
bool
|
||||
|
||||
choice
|
||||
prompt "Kernel compression mode"
|
||||
default KERNEL_GZIP
|
||||
depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || HAVE_KERNEL_XZ || HAVE_KERNEL_LZO || HAVE_KERNEL_LZ4 || HAVE_KERNEL_UNCOMPRESSED
|
||||
depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || HAVE_KERNEL_XZ || HAVE_KERNEL_LZO || HAVE_KERNEL_LZ4 || HAVE_KERNEL_ZSTD || HAVE_KERNEL_UNCOMPRESSED
|
||||
help
|
||||
The linux kernel is a kind of self-extracting executable.
|
||||
Several compression algorithms are available, which differ
|
||||
@ -276,6 +279,16 @@ config KERNEL_LZ4
|
||||
is about 8% bigger than LZO. But the decompression speed is
|
||||
faster than LZO.
|
||||
|
||||
config KERNEL_ZSTD
|
||||
bool "ZSTD"
|
||||
depends on HAVE_KERNEL_ZSTD
|
||||
help
|
||||
ZSTD is a compression algorithm targeting intermediate compression
|
||||
with fast decompression speed. It will compress better than GZIP and
|
||||
decompress around the same speed as LZO, but slower than LZ4. You
|
||||
will need at least 192 KB RAM or more for booting. The zstd command
|
||||
line tool is required for compression.
|
||||
|
||||
config KERNEL_UNCOMPRESSED
|
||||
bool "None"
|
||||
depends on HAVE_KERNEL_UNCOMPRESSED
|
||||
|
@ -413,6 +413,28 @@ quiet_cmd_xzkern = XZKERN $@
|
||||
quiet_cmd_xzmisc = XZMISC $@
|
||||
cmd_xzmisc = cat $(real-prereqs) | $(XZ) --check=crc32 --lzma2=dict=1MiB > $@
|
||||
|
||||
# ZSTD
|
||||
# ---------------------------------------------------------------------------
|
||||
# Appends the uncompressed size of the data using size_append. The .zst
|
||||
# format has the size information available at the beginning of the file too,
|
||||
# but it's in a more complex format and it's good to avoid changing the part
|
||||
# of the boot code that reads the uncompressed size.
|
||||
#
|
||||
# Note that the bytes added by size_append will make the zstd tool think that
|
||||
# the file is corrupt. This is expected.
|
||||
#
|
||||
# zstd uses a maximum window size of 8 MB. zstd22 uses a maximum window size of
|
||||
# 128 MB. zstd22 is used for kernel compression because it is decompressed in a
|
||||
# single pass, so zstd doesn't need to allocate a window buffer. When streaming
|
||||
# decompression is used, like initramfs decompression, zstd22 should likely not
|
||||
# be used because it would require zstd to allocate a 128 MB buffer.
|
||||
|
||||
quiet_cmd_zstd = ZSTD $@
|
||||
cmd_zstd = { cat $(real-prereqs) | $(ZSTD) -19; $(size_append); } > $@
|
||||
|
||||
quiet_cmd_zstd22 = ZSTD22 $@
|
||||
cmd_zstd22 = { cat $(real-prereqs) | $(ZSTD) -22 --ultra; $(size_append); } > $@
|
||||
|
||||
# ASM offsets
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user