基于Linux2.6.38.8内核zImage文件的自解压详解


Linux内核编译完成后会生成zImage内核镜像文件。zImage是如何解压的呢?本文将结合关键代码,讲解zImage的解压过程。还是先来看看zImage的组成吧。在内核编译完成后会在arch/arm/boot/下生成zImage。 

在arch/arm/boot/Makefile中,如下代码:

[plain]
  1. #  
  2. # arch/arm/boot/Makefile  
  3. #  
  4. # This file is included by the global makefile so that you can add your own  
  5. # architecture-specific flags and dependencies.  
  6. #  
  7. # This file is subject to the terms and conditions of the GNU General Public  
  8. # License.  See the file "COPYING" in the main directory of this archive  
  9. # for more details.  
  10. #  
  11. # Copyright (C) 1995-2002 Russell King  
  12. #  
  13.   
  14. MKIMAGE         := $(srctree)/scripts/mkuboot.sh  
  15.   
  16. ifneq ($(MACHINE),)  
  17. include $(srctree)/$(MACHINE)/Makefile.boot  
  18. endif  
  19.   
  20. # Note: the following conditions must always be true:  
  21. #   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)  
  22. #   PARAMS_PHYS must be within 4MB of ZRELADDR  
  23. #   INITRD_PHYS must be in RAM  
  24. ZRELADDR    := $(zreladdr-y)  
  25. PARAMS_PHYS := $(params_phys-y)  
  26. INITRD_PHYS := $(initrd_phys-y)  
  27.   
  28. export ZRELADDR INITRD_PHYS PARAMS_PHYS  
  29.   
  30. targets := Image zImage xipImage bootpImage uImage  
  31.   
  32. ifeq ($(CONFIG_XIP_KERNEL),y)  
  33.   
  34. $(obj)/xipImage: vmlinux FORCE  
  35.     $(call if_changed,objcopy)  
  36.     @echo '  Kernel: $@ is ready (physical address: $(CONFIG_XIP_PHYS_ADDR))'  
  37.   
  38. $(obj)/Image $(obj)/zImage: FORCE  
  39.     @echo 'Kernel configured for XIP (CONFIG_XIP_KERNEL=y)'  
  40.     @echo 'Only the xipImage target is available in this case'  
  41.     @false  
  42.   
  43. else  
  44.   
  45. $(obj)/xipImage: FORCE  
  46.     @echo 'Kernel not configured for XIP (CONFIG_XIP_KERNEL!=y)'  
  47.     @false  
  48.   
  49. $(obj)/Image: vmlinux FORCE  
  50.     $(call if_changed,objcopy)  
  51.     @echo '  Kernel: $@ is ready'  
  52.   
  53. $(obj)/compressed/vmlinux: $(obj)/Image FORCE  
  54.     $(Q)$(MAKE) $(build)=$(obj)/compressed $@  
  55.   
  56. $(obj)/zImage:  $(obj)/compressed/vmlinux FORCE  
  57.     $(call if_changed,objcopy)  
  58.     @echo '  Kernel: $@ is ready'  
  59.   
  60. endif  
  61.   
  62. quiet_cmd_uimage = UIMAGE  $@  
  63.       cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \  
  64.            -C none -a $(LOADADDR) -e $(STARTADDR) \  
  65.            -n 'Linux-$(KERNELRELEASE)' -d {1}lt; $@  
  66.   
  67. ifeq ($(CONFIG_ZBOOT_ROM),y)  
  68. $(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)  
  69. else  
  70. $(obj)/uImage: LOADADDR=$(ZRELADDR)  
  71. endif  
  72.   
  73. $(obj)/uImage: STARTADDR=$(LOADADDR)  
  74.   
  75. $(obj)/uImage:  $(obj)/zImage FORCE  
  76.     $(call if_changed,uimage)  
  77.     @echo '  Image $@ is ready'  
  78.   
  79. $(obj)/bootp/bootp: $(obj)/zImage initrd FORCE  
  80.     $(Q)$(MAKE) $(build)=$(obj)/bootp $@  
  81.     @:  
  82.   
  83. $(obj)/bootpImage: $(obj)/bootp/bootp FORCE  
  84.     $(call if_changed,objcopy)  
  85.     @echo '  Kernel: $@ is ready'  
  86.   
  87. PHONY += initrd FORCE  
  88. initrd:  
  89.     @test "$(INITRD_PHYS)" != "" || \  
  90.     (echo This machine does not support INITRD; exit -1)  
  91.     @test "$(INITRD)" != "" || \  
  92.     (echo You must specify INITRD; exit -1)  
  93.   
  94. install: $(obj)/Image  
  95.     $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \  
  96.     $(obj)/Image System.map "$(INSTALL_PATH)"  
  97.   
  98. zinstall: $(obj)/zImage  
  99.     $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \  
  100.     $(obj)/zImage System.map "$(INSTALL_PATH)"  
  101.   
  102. zi:  
  103.     $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \  
  104.     $(obj)/zImage System.map "$(INSTALL_PATH)"  
  105.   
  106. i:  
  107.     $(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \  
  108.     $(obj)/Image System.map "$(INSTALL_PATH)"  
  109.   
  110. subdir-     := bootp compressed  
  • 1
  • 2
  • 3
  • 下一页

相关内容