易网时代-编程资源站
Welcome
微信登录
首页
/
操作系统
/
Linux
/
基于Linux2.6.38.8内核zImage文件的自解压详解
Linux内核编译完成后会生成zImage内核镜像文件。zImage是如何解压的呢?本文将结合关键代码,讲解zImage的解压过程。还是先来看看zImage的组成吧。在内核编译完成后会在arch/arm/boot/下生成zImage。
在arch/arm/boot/Makefile中,如下代码:
[plain]
#
# arch/arm/boot/Makefile
#
# This file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies.
#
# This file is subject to the terms and conditions of the GNU General Public
# License. See the file "COPYING" in the main directory of this archive
# for more details.
#
# Copyright (C) 1995-2002 Russell King
#
MKIMAGE := $(srctree)/scripts/mkuboot.sh
ifneq ($(MACHINE),)
include $(srctree)/$(MACHINE)/Makefile.boot
endif
# Note: the following conditions must always be true:
# ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
# PARAMS_PHYS must be within 4MB of ZRELADDR
# INITRD_PHYS must be in RAM
ZRELADDR := $(zreladdr-y)
PARAMS_PHYS := $(params_phys-y)
INITRD_PHYS := $(initrd_phys-y)
export ZRELADDR INITRD_PHYS PARAMS_PHYS
targets := Image zImage xipImage bootpImage uImage
ifeq ($(CONFIG_XIP_KERNEL),y)
$(obj)/xipImage: vmlinux FORCE
$(call if_changed,objcopy)
@echo " Kernel: $@ is ready (physical address: $(CONFIG_XIP_PHYS_ADDR))"
$(obj)/Image $(obj)/zImage: FORCE
@echo "Kernel configured for XIP (CONFIG_XIP_KERNEL=y)"
@echo "Only the xipImage target is available in this case"
@false
else
$(obj)/xipImage: FORCE
@echo "Kernel not configured for XIP (CONFIG_XIP_KERNEL!=y)"
@false
$(obj)/Image: vmlinux FORCE
$(call if_changed,objcopy)
@echo " Kernel: $@ is ready"
$(obj)/compressed/vmlinux: $(obj)/Image FORCE
$(Q)$(MAKE) $(build)=$(obj)/compressed $@
$(obj)/zImage: $(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
@echo " Kernel: $@ is ready"
endif
quiet_cmd_uimage = UIMAGE $@
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel
-C none -a $(LOADADDR) -e $(STARTADDR)
-n "Linux-$(KERNELRELEASE)" -d {1}lt; $@
ifeq ($(CONFIG_ZBOOT_ROM),y)
$(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
else
$(obj)/uImage: LOADADDR=$(ZRELADDR)
endif
$(obj)/uImage: STARTADDR=$(LOADADDR)
$(obj)/uImage: $(obj)/zImage FORCE
$(call if_changed,uimage)
@echo " Image $@ is ready"
$(obj)/bootp/bootp: $(obj)/zImage initrd FORCE
$(Q)$(MAKE) $(build)=$(obj)/bootp $@
@:
$(obj)/bootpImage: $(obj)/bootp/bootp FORCE
$(call if_changed,objcopy)
@echo " Kernel: $@ is ready"
PHONY += initrd FORCE
initrd:
@test "$(INITRD_PHYS)" != "" ||
(echo This machine does not support INITRD; exit -1)
@test "$(INITRD)" != "" ||
(echo You must specify INITRD; exit -1)
install: $(obj)/Image
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE)
$(obj)/Image System.map "$(INSTALL_PATH)"
zinstall: $(obj)/zImage
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE)
$(obj)/zImage System.map "$(INSTALL_PATH)"
zi:
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE)
$(obj)/zImage System.map "$(INSTALL_PATH)"
i:
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE)
$(obj)/Image System.map "$(INSTALL_PATH)"
subdir- := bootp compressed
1
2
3
下一页
Linux sed常规用法小结基于Linux2.6.38.8内核启动过程完全解析相关资讯 Linux内核
IT人员必须了解的六项Linux内核变 (今 12:05)
Linux 内核更新:3.10.98、3.14.62 (02月26日)
Linux:让手机运行主线内核 (11/26/2015 22:16:17)
Linux内核自防护项目 (05月24日)
Linux 内核架构的理解 (12/09/2015 09:01:01)
Linux内核被指缺乏安全性 (11/07/2015 08:28:47)
本文评论 查看全部评论 (0)
表情: 姓名:
匿名
字数
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图