কার্নেল মেকফিলগুলি ব্রাউজ করার সময়, আমি এই শর্তাদি পেয়েছি। তাই আমি জানতে চাই মধ্যে পার্থক্য কি চাই vmlinux
, vmlinuz
, vmlinux.bin
, zimage
& bzimage
?
vmlinuz.efi
উবুন্টু 14.04 তেও ব্যবহার করা হয়েছে: Askubuntu.com/questions/330541/ কি-is
কার্নেল মেকফিলগুলি ব্রাউজ করার সময়, আমি এই শর্তাদি পেয়েছি। তাই আমি জানতে চাই মধ্যে পার্থক্য কি চাই vmlinux
, vmlinuz
, vmlinux.bin
, zimage
& bzimage
?
vmlinuz.efi
উবুন্টু 14.04 তেও ব্যবহার করা হয়েছে: Askubuntu.com/questions/330541/ কি-is
উত্তর:
চিহ্নিত কার্নেলের vmlinux
এটি স্ট্যাটিকালি লিঙ্কযুক্ত এক্সিকিউটেবল ফাইল ফর্ম্যাটে লিনাক্স কার্নেল। সাধারণত, আপনাকে এই ফাইলটি নিয়ে চিন্তা করতে হবে না, এটি বুট পদ্ধতির মধ্যবর্তী পদক্ষেপ মাত্র।
কাঁচা ভিএমলিনাক্স ফাইলটি ডিবাগিংয়ের উদ্দেশ্যে কার্যকর হতে পারে।
vmlinux.bin
ভিএমলিনাক্সের মতো, তবে বুটেবল কাঁচা বাইনারি ফাইল ফর্ম্যাটে। সমস্ত প্রতীক এবং স্থানান্তরের তথ্য বাতিল করা হয়েছে। vmlinux
দ্বারা উত্পাদিত objcopy -O binary vmlinux vmlinux.bin
।
vmlinuz
ভিএমলিনাক্স ফাইলটি সাধারণত সংকুচিত হয় zlib
। ২.6.৩০ সাল থেকে LZMA
এবং bzip2
এটি উপলব্ধ। ভিএমলিনুজে আরও বুট এবং ডিকম্প্রেশন ক্ষমতা যুক্ত করে, চিত্রটি vmlinux কার্নেলের সাহায্যে সিস্টেম বুট করতে ব্যবহৃত হতে পারে। ভিএমলিনাক্সের সংক্ষেপণ zImage বা bzImage এর সাথে দেখা দিতে পারে।
ফাংশনটি decompress_kernel()
বুটআপে ভিএমলিনুজের ক্ষয়কে পরিচালনা করে, একটি বার্তা এটি সূচিত করে:
Decompressing Linux... done
Booting the kernel.
zI छवि ( make zImage
)
এটি ছোট কার্নেলগুলির জন্য পুরানো ফর্ম্যাট (সংকুচিত, 512KB এর নীচে)। বুট করার সময়, এই চিত্রটি মেমরিতে লোড হয় (র্যামের প্রথম 640KB)।
bzI छवि ( make bzImage
)
বড় জাইমেজ (এর কোনও যোগসূত্র নেই bzip2
) তৈরি করা হয়েছিল যখন কার্নেলটি বৃদ্ধি পেয়ে বড় চিত্রগুলি পরিচালনা করে (সংকুচিত, 512KB এরও বেশি)। চিত্রটি স্মৃতিতে লোড হয়ে যায় (1 এমবি র্যামের উপরে)। যেহেতু আজকের কার্নেলগুলি 512KB ছাড়িয়ে গেছে, এটি সাধারণত পছন্দসই উপায়।
উবুন্টু ১০.১০ তে একটি পরিদর্শন দেখায়:
ls -lh /boot/vmlinuz-$(uname -r)
-rw-r--r-- 1 root root 4.1M 2010-11-24 12:21 /boot/vmlinuz-2.6.35-23-generic
file /boot/vmlinuz-$(uname -r)
/boot/vmlinuz-2.6.35-23-generic: Linux kernel x86 boot executable bzImage, version 2.6.35-23-generic (buildd@rosea, RO-rootFS, root_dev 0x6801, swap_dev 0x4, Normal VGA
/arch/$ARCH/boot/compressed/misc.c
দেখুন: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/…
একটি ভার্বোজ কার্নেল বিল্ড করুন এবং ফাইলগুলি অনুসন্ধান করুন
এই পদ্ধতিটি কিছুটা অন্তর্দৃষ্টি দিতে পারে, কখনই মেয়াদোত্তীর্ণ হবে না এবং বিল্ড সিস্টেমের কোন অংশটি কী করছে তা সহজেই আপনাকে খুঁজে পেতে সহায়তা করবে।
একবার আপনার কাছে বিল্ড কনফিগারেশন রয়েছে যা ফাইলগুলির মধ্যে একটি উত্পন্ন করে, এর সাথে বিল্ড করুন:
make V=1 |& tee f.log
init/main.c
আপনি যদি ইতিমধ্যে পূর্বে তৈরি করে থাকেন তবে পুনরায় লিঙ্কটি (যেমন একটি ভাল) জোর করতে কয়েকটি সি ফাইলের একটি মন্তব্য পরিবর্তন করুন ।
এখন, f.log
আগ্রহের চিত্রগুলি পরীক্ষা করুন এবং অনুসন্ধান করুন।
উদাহরণস্বরূপ, v4.19 এ আমরা এই উপসংহারে পৌঁছে যাব:
init/main.c
|
| gcc -c
|
v
init/.tmp_main.o
|
| CONFIG_MODVERSIONS stuff
|
v
init/main.o
|
| ar T (thin archive)
|
v
init/built-in.a
|
| ar T (thin archive)
|
v
built-in.a
|
| ld
|
v
vmlinux (regular ELF file)
|
| objcopy
|
v
arch/x86/boot/compressed/vmlinux.bin
|
| GZIP
|
v
arch/x86/boot/compressed/vmlinux.bin.gz
|
| .incbin
|
v
arch/x86/boot/compressed/piggy.S
|
| gcc -c
|
v
arch/x86/boot/compressed/piggy.o
|
| ld
|
v
arch/x86/boot/compressed/vmlinux (regular ELF file with gzipped code)
|
| objcopy
|
v
arch/x86/boot/vmlinux.bin
|
| arch/x86/boot/tools/build.c
|
v
arch/x86/boot/bzImage
পাতলা সংরক্ষণাগারগুলি এখানে উল্লেখ করা হয়েছে: https://stackoverflow.com/questions/2157629/link-static-libraries-to-other-static-libraries/27676016#27676016 এগুলি সংরক্ষণাগারগুলি কেবল অনুলিপি / অনুলিপিগুলি অনুলিপি করার পরিবর্তে নির্দেশ করে।
কার্নেলটি v4.9 তে বর্ধিত সংযোগ থেকে পাতলা সংরক্ষণাগার থেকে সরানো হয়েছে যা এখানে বর্ণিত হয়েছে: https://stackoverflow.com/questions/29391965/ কি-is-partial-linking-in-gnu-linker/53959624#53959624
সম্পূর্ণ লগ ব্যাখ্যা
আমরা যখন ব্যাক আপ থেকে ভার্বোজ বিল্ড লগগুলি পড়া শুরু করি, প্রথমে আমরা দেখতে পাই:
ln -fsn ../../x86/boot/bzImage ./arch/x86_64/boot/bzImage
সুতরাং এই দুটি ঠিক মিশ্রিত হয়।
তারপরে আমরা এর জন্য আরও কিছুটা অনুসন্ধান করি x86/boot/bzImage
এবং খুঁজে পাই :
arch/x86/boot/tools/build \
arch/x86/boot/setup.bin \
arch/x86/boot/vmlinux.bin \
arch/x86/boot/zoffset.h \
arch/x86/boot/bzImage
arch/x86/boot/tools/build
একটি এক্সিকিউটেবল, তাই আমরা এটি চালাই, সহায়তা বার্তাটি দেখুন:
Usage: build setup system zoffset.h image
এবং উত্সটি খুঁজে পেতে গ্রেপ:
arch/x86/boot/tools/build.c
তাই এই টুল উৎপাদিত করা আবশ্যক arch/x86/boot/bzImage
থেকে arch/x86/boot/vmlinux.bin
এবং অন্যান্য ফাইল করণীয় বিন্দু কি build
ঠিক?
আমরা যদি অনুসরণ arch/x86/boot/vmlinux.bin
করি তবে দেখি এটি কেবল একটি objcopy
থেকে arch/x86/boot/compressed/vmlinux
:
objcopy \
-O binary \
-R .note \
-R .comment \
-S arch/x86/boot/compressed/vmlinux \
arch/x86/boot/vmlinux.bin
এবং arch/x86/boot/compressed/vmlinux
এটি কেবল একটি নিয়মিত ELF ফাইল:
ld \
-m elf_x86_64 \
-z noreloc-overflow \
-pie \
--no-dynamic-linker \
-T arch/x86/boot/compressed/vmlinux.lds \
arch/x86/boot/compressed/head_64.o \
arch/x86/boot/compressed/misc.o \
arch/x86/boot/compressed/string.o \
arch/x86/boot/compressed/cmdline.o \
arch/x86/boot/compressed/error.o \
arch/x86/boot/compressed/piggy.o \
arch/x86/boot/compressed/cpuflags.o \
arch/x86/boot/compressed/early_serial_console.o \
arch/x86/boot/compressed/kaslr.o \
arch/x86/boot/compressed/kaslr_64.o \
arch/x86/boot/compressed/mem_encrypt.o \
arch/x86/boot/compressed/pgtable_64.o \
-o arch/x86/boot/compressed/vmlinux
ls -hlSr
বলেছেন যে piggy.o
এটি এখন পর্যন্ত বৃহত্তম ফাইল, তাই আমরা এটি অনুসন্ধান করি এবং এটি অবশ্যই এ থেকে আসে:
gcc \
-Wp,-MD,arch/x86/boot/compressed/.piggy.o.d \
-nostdinc \
-Ilinux/arch/x86/include \
-I./arch/x86/include/generated \
-Ilinux/include \
-I./include \
-Ilinux/arch/x86/include/uapi \
-I./arch/x86/include/generated/uapi \
-Ilinux/include/uapi \
-I./include/generated/uapi \
-include linux/include/linux/kconfig.h \
-D__KERNEL__ \
-m64 \
-O2 \
-fno-strict-aliasing \
-fPIE \
-DDISABLE_BRANCH_PROFILING \
-mcmodel=small \
-mno-mmx \
-mno-sse \
-ffreestanding \
-fno-stack-protector \
-Wno-pointer-sign \
-D__ASSEMBLY__ \
-c \
-o arch/x86/boot/compressed/.tmp_piggy.o \
arch/x86/boot/compressed/piggy.S
.tmp_
উপসর্গ নীচে ব্যাখ্যা।
arch/x86/boot/compressed/piggy.S
রয়েছে:
.incbin "arch/x86/boot/compressed/vmlinux.bin.gz"
আরও দেখুন: https://stackoverflow.com/questions/4158900/e এমবেডিং-resources-in-executable- using-gcc / 36295692#36295692
arch/x86/boot/compressed/vmlinux.bin.gz
থেকে আসে:
cat arch/x86/boot/compressed/vmlinux.bin arch/x86/boot/compressed/vmlinux.relocs | \
gzip -n -f -9 > arch/x86/boot/compressed/vmlinux.bin.gz
যা থেকে আসে:
objcopy -R .comment -S vmlinux arch/x86/boot/compressed/vmlinux.bin
যা থেকে আসে:
LD vmlinux
যা আছে:
ld \
-m elf_x86_64 \
-z max-page-size=0x200000 \
--emit-relocs \
--build-id \
-o vmlinux \
-T ./arch/x86/kernel/vmlinux.lds \
--whole-archive \
built-in.a \
--no-whole-archive \
--start-group \
lib/lib.a \
arch/x86/lib/lib.a \
--end-group \
.tmp_kallsyms2.o
vmlinux
বিশাল, তবে সমস্ত দেখানো বস্তুগুলি অনুসারে ক্ষুদ্র ls -l
, তাই আমি গবেষণা করেছি এবং একটি নতুন ar
বৈশিষ্ট্য সম্পর্কে জানলাম যা সম্পর্কে আমি জানতাম না: পাতলা সংরক্ষণাগার।
করুন:
AR built-in.a
বিল্ডটি করে:
ar \
rcsTPD \
built-in.a \
arch/x86/kernel/head_64.o \
arch/x86/kernel/head64.o \
arch/x86/kernel/ebda.o \
arch/x86/kernel/platform-quirks.o \
init/built-in.a \
usr/built-in.a \
arch/x86/built-in.a \
kernel/built-in.a \
certs/built-in.a \
mm/built-in.a \
fs/built-in.a \
ipc/built-in.a \
security/built-in.a \
crypto/built-in.a \
block/built-in.a \
lib/built-in.a \
arch/x86/lib/built-in.a \
drivers/built-in.a \
sound/built-in.a \
firmware/built-in.a \
arch/x86/pci/built-in.a \
arch/x86/power/built-in.a \
arch/x86/video/built-in.a \
net/built-in.a \
virt/built-in.a
T
পাতলা সংরক্ষণাগার নির্দিষ্ট করে।
তারপরে আমরা দেখতে পাব যে সমস্ত উপ সংরক্ষণাগারগুলিও পাতলা, যেমন, যেহেতু আমি সংশোধন করেছি init/main.c
, আমাদের আছে:
ar \
rcSTPD \
init/built-in.a \
init/main.o \
init/version.o \
init/do_mounts.o \
init/do_mounts_initrd.o \
init/initramfs.o \
init/calibrate.o \
init/init_task.o
যা শেষ পর্যন্ত সি ফাইল থেকে আসে যেমন:
gcc \
-Wp,-MD,init/.main.o.d \
-c \
-o \
init/.tmp_main.o \
/work/linux-kernel-module-cheat/submodules/linux/init/main.c
আমি খুঁজে পাচ্ছি না init/.tmp_main.o
করতে init/main.o
লগ যা লজ্জা হয় ... সঙ্গে পদক্ষেপ:
git grep '\.tmp_'
আমরা দেখতে পাই যে সম্ভবত এসেছিল scripts Makefile.build
এবং এর সাথে লিঙ্ক হয়েছে CONFIG_MODVERSIONS
যা আমি সক্ষম করেছিলাম:
ifndef CONFIG_MODVERSIONS
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
else
# When module versioning is enabled the following steps are executed:
# o compile a .tmp_<file>.o from <file>.c
# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does
# not export symbols, we just rename .tmp_<file>.o to <file>.o and
# are done.
# o otherwise, we calculate symbol versions using the good old
# genksyms on the preprocessed source and postprocess them in a way
# that they are usable as a linker script
# o generate <file>.o from .tmp_<file>.o using the linker to
# replace the unresolved symbols __crc_exported_symbol with
# the actual value of the checksum generated by genksyms
cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_modversions_c = \
if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
> $(@D)/.tmp_$(@F:.o=.ver); \
\
$(LD) $(KBUILD_LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
-T $(@D)/.tmp_$(@F:.o=.ver); \
rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \
else \
mv -f $(@D)/.tmp_$(@F) $@; \
fi;
endif
এই কনফিগারটি সহ বিশ্লেষণ করা হয়েছে যা এতে রয়েছে CONFIG_KERNEL_GZIP=y
।
aarch64 arch/arm64/boot/Image
শুধু একটি ডিকম্প্রেস করা objcopy
থেকে vmlinux
:
objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux arch/arm64/boot/Image
vmlinux
পাতলা সংরক্ষণাগার যদিও মূলত x86 এর মতো ঠিক একইভাবে প্রাপ্ত।
arch/arm/boot/zImage
একটি জিপযুক্ত X86 এর সাথে খুব মিল vmlinux
, তবে কোনও যাদু build.c
পদক্ষেপ নেই। কল চেইন সংক্ষিপ্তসার:
objcopy -O binary -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage
ld \
-EL \
--defsym _kernel_bss_size=469592 \
-p \
--no-undefined \
-X \
-T arch/arm/boot/compressed/vmlinux.lds \
arch/arm/boot/compressed/head.o \
arch/arm/boot/compressed/piggy.o \
arch/arm/boot/compressed/misc.o \
arch/arm/boot/compressed/decompress.o \
arch/arm/boot/compressed/string.o \
arch/arm/boot/compressed/hyp-stub.o \
arch/arm/boot/compressed/lib1funcs.o \
arch/arm/boot/compressed/ashldi3.o \
arch/arm/boot/compressed/bswapsdi2.o \
-o arch/arm/boot/compressed/vmlinux
gcc \
-c \
-o arch/arm/boot/compressed/piggy.o \
linux/arch/arm/boot/compressed/piggy.S
.incbin "arch/arm/boot/compressed/piggy_data"
cat arch/arm/boot/compressed/../Image | gzip -n -f -9 > arch/arm/boot/compressed/piggy_data
objcopy -O binary -R .comment -S vmlinux arch/arm/boot/Image
কিউইএমইউ ভি 4.0.0 বিজেআইমেজ থেকে বুট করতে পারে তবে ভিএমলিনাক্স নয়
এটি আর একটি গুরুত্বপূর্ণ ব্যবহারিক পার্থক্য: https://superuser.com/questions/1451568/booting-an-uncompressed-kernel-in-qemu
এখানে সব কিছু রয়েছে: http://en.wikedia.org/wiki/Vmlinux
ভিএমলিনাক্স :
একটি সং-সংকুচিত এবং নন-বুটযোগ্য লিনাক্স কার্নেল ফাইল ফর্ম্যাট, উত্পাদন করার জন্য কেবলমাত্র একটি মধ্যবর্তী পদক্ষেপ vmlinuz
।
ভিএমলিনুজ :
একটি সংকুচিত এবং বুটেবল লিনাক্স কার্নেল ফাইল। এটি আসলে zImage
বা bzImage
ফাইল।
zImage :
পুরানো কার্নেলগুলির জন্য, কেবলমাত্র 640k
আকারের আকারের মাপসই ।
bzImage :
Big zImage
কোন 640k
RAM আকার সীমা, অনেক বড় পারেন।
দয়া করে এই দস্তাবেজটি দেখুন: vmlinuz সংজ্ঞা ।
বিজিআইমেজ হ'ল পিসি বায়োস-এর সাথে কাজ করা x86 আর্কিটেকচারের জন্য ব্যবহৃত টার্গেট। বিপরীতে, জাইমেজ একটি আর্কিটেকচার-নির্দিষ্ট লক্ষ্য যা এম্বেডড ডিভাইসের জন্য সাধারণত ব্যবহৃত হয় এবং তাদের বুটলোডারগুলির সাথে ভালভাবে কাজ করে।