Giải mã từng dòng code trong extract-vmlinux.
Giải thích rõ ý định, ý đồ, mục đích của từng dòng code trong extract-vmlinux.
extract-vmlinux
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only
# ----------------------------------------------------------------------
# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
#
# Inspired from extract-ikconfig
# (c) 2009,2010 Dick Streefland <dick@streefland.net>
#
# (c) 2011 Corentin Chary <corentin.chary@gmail.com>
#
# ----------------------------------------------------------------------
check_vmlinux()
{
# Use readelf to check if it's a valid ELF
# TODO: find a better to way to check that it's really vmlinux
# and not just an elf
readelf -h $1 > /dev/null 2>&1 || return 1
cat $1
exit 0
}
try_decompress()
{
# The obscure use of the "tr" filter is to work around older versions of
# "grep" that report the byte offset of the line instead of the pattern.
# Try to find the header ($1) and decompress from here
for pos in `tr "$1\n$2" "\n$2=" < "$img" | grep -abo "^$2"`
do
pos=${pos%%:*}
tail -c+$pos "$img" | $3 > $tmp 2> /dev/null
check_vmlinux $tmp
done
}
# Check invocation:
me=${0##*/}
img=$1
if [ $# -ne 1 -o ! -s "$img" ]
then
echo "Usage: $me <kernel-image>" >&2
exit 2
fi
# Prepare temp files:
tmp=$(mktemp /tmp/vmlinux-XXX)
trap "rm -f $tmp" 0
# That didn't work, so retry after decompression.
try_decompress '\037\213\010' xy gunzip
try_decompress '\3757zXZ\000' abcde unxz
try_decompress 'BZh' xy bunzip2
try_decompress '\135\0\0\0' xxx unlzma
try_decompress '\211\114\132' xy 'lzop -d'
try_decompress '\002!L\030' xxx 'lz4 -d'
try_decompress '(\265/\375' xxx unzstd
# Finally check for uncompressed images or objects:
check_vmlinux $img
# Bail out:
echo "$me: Cannot find vmlinux." >&2
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/extract-vmlinux
Xài extract-vmlinux như sau
# vmlinuz là linux kernel được nén lại
# vmlinuz tự động giải nén khi được chuyển lên RAM
file /boot/vmlinuz-`uname -r` | tr ',' '\n'
curl -o extract-vmlinux \
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/scripts/extract-vmlinux
chmod +x extract-vmlinux
# Giải nén vmlinuz thành vmlinux (dạng ELF chạy được)
./extract-vmlinux /boot/vmlinuz-`uname -r` > vmlinux-`uname -r`
file vmlinux-`uname -r` | tr ',' '\n'
Nếu bạn đã học Linux như LPI hay các khóa học Linux nào đó trên các trang nước ngoài thì hãy xem các dòng code trong extract-vmlinux là bài tập Linux cho bạn.
Nếu bạn đọc hiểu, giải thích rõ ràng, chính xác 100% các dòng code trong extract-vmlinux, biết cách kiểm chứng những gì bạn cho là đúng thì xin chúc mừng bạn đã hiểu rõ Linux, Linux Kernel.
Ngược lại bạn cần tự học thêm lập trình Linux bash shell để thực chiến.
Các chương trình Linux, các công cụ Linux thực tế được viết khá phức tạp, lắt léo mới giải quyết trọn vẹn 1 vấn đề nào đó chứ không phải chỉ là các ví dụ đơn giản, cơ bản trong các bài học Linux cưỡi ngựa xem hoa.
Khóa học lập trình Linux bash shell thực chiến này dành cho các bạn muốn học sâu, hiểu rõ Linux, Linux kernel.