নিম্নলিখিত কার্নেল মেকফিল পদগুলির মধ্যে পার্থক্য কী: ভিএমএলিনাক্স, ভিএমলিনিজ, ভিএমলিনাক্স.বিন, জিমেজ এবং বিজিমেজ?


50

কার্নেল মেকফিলগুলি ব্রাউজ করার সময়, আমি এই শর্তাদি পেয়েছি। তাই আমি জানতে চাই মধ্যে পার্থক্য কি চাই vmlinux, vmlinuz, vmlinux.bin, zimage& bzimage?


এর বাইরে আমি মনে করি জিমেজটি জিজেড কম্প্রেশন এবং বিজিমাজ হ'ল বিজে সংক্ষেপণ ... জুট নামকরণ, আফিক এর কোনওোটাই বোঝাচ্ছে না। তবে আমি ভুল হতে পারি।
xenoterracide

vmlinuz.efiউবুন্টু 14.04 তেও ব্যবহার করা হয়েছে: Askubuntu.com/questions/330541/ কি-is
Ciro

উত্তর:


59

চিহ্নিত কার্নেলের 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

এই decompress_kernel () ফাংশন বাস্তবায়ন কোথায় অবস্থিত?
সেন

2
এটি এখানে অবস্থিত /arch/$ARCH/boot/compressed/misc.cদেখুন: lxr.linux.no/#linux+v2.6.37/arch/x86/boot/compressed/…
ওয়াগ

8

একটি ভার্বোজ কার্নেল বিল্ড করুন এবং ফাইলগুলি অনুসন্ধান করুন

এই পদ্ধতিটি কিছুটা অন্তর্দৃষ্টি দিতে পারে, কখনই মেয়াদোত্তীর্ণ হবে না এবং বিল্ড সিস্টেমের কোন অংশটি কী করছে তা সহজেই আপনাকে খুঁজে পেতে সহায়তা করবে।

একবার আপনার কাছে বিল্ড কনফিগারেশন রয়েছে যা ফাইলগুলির মধ্যে একটি উত্পন্ন করে, এর সাথে বিল্ড করুন:

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



1

ভিএমলিনাক্স :

একটি সং-সংকুচিত এবং নন-বুটযোগ্য লিনাক্স কার্নেল ফাইল ফর্ম্যাট, উত্পাদন করার জন্য কেবলমাত্র একটি মধ্যবর্তী পদক্ষেপ vmlinuz

ভিএমলিনুজ :
একটি সংকুচিত এবং বুটেবল লিনাক্স কার্নেল ফাইল। এটি আসলে zImageবা bzImageফাইল।

zImage :
পুরানো কার্নেলগুলির জন্য, কেবলমাত্র 640kআকারের আকারের মাপসই ।

bzImage :
Big zImageকোন 640kRAM আকার সীমা, অনেক বড় পারেন।

দয়া করে এই দস্তাবেজটি দেখুন: vmlinuz সংজ্ঞা


1

বিজিআইমেজ হ'ল পিসি বায়োস-এর সাথে কাজ করা x86 আর্কিটেকচারের জন্য ব্যবহৃত টার্গেট। বিপরীতে, জাইমেজ একটি আর্কিটেকচার-নির্দিষ্ট লক্ষ্য যা এম্বেডড ডিভাইসের জন্য সাধারণত ব্যবহৃত হয় এবং তাদের বুটলোডারগুলির সাথে ভালভাবে কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.