• ARM的不同的启动过程(通过Makefile的分析)【转】


    转自:https://blog.csdn.net/liucong2004/article/details/4005409

    分析过程:
    
    查看arch/arm/Makefile下的第一个目标为all: zImage
    
    找到以zImage作为目标的规则:
    
    zImage Image xipImage bootpImage uImage: vmlinux
    
        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
    
    这个规则中命令执行的目录为$(boot)= arch/arm/boot,那么读取arch/arm/boot下的Makefile找到了这个Makefile中的第一条规则targets := Image zImage xipImage bootpImage uImage
    
    (1)查看arch/arm/boot下的Makefile中的规则:
    
    $(obj)/Image: vmlinux FORCE
    
           $(call if_changed,objcopy)
    
           @echo '  Kernel: $@ is ready'
    
    要生成非压缩的内核Image,依赖的文件是vmlinux, 根据顶层Makefile中的规则:vmlinux的生成需要文件$(head-y),在arch/arm/Makefile下定义了
    
    $(head-y) := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
    
    由此可以看出的Image 的入口程序为 Kernel的head.S
    
     
    
    (2)查看arch/arm/boot下的Makefile中的规则:
    
    $(obj)/zImage:    $(obj)/compressed/vmlinux FORCE
    
           $(call if_changed, objcopy)
    
           @echo '  Kernel: $@ is ready'
    
    可知压缩的内核zImage的依赖体是$(obj)/compressed/vmlinux
    
    查看arch/arm/boot/compressed/Makefile中两条规则:
    
    targets := vmlinux vmlinux.lds piggy.gz piggy.o $(FONT) head.o misc.o head.o misc.o $(OBJS)
    
    $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o /
    
                 $(addprefix $(obj)/, $(OBJS)) FORCE
    
           $(call if_changed,ld)
    
           @:
    
    其中$(HEAD):=head.o
    
    有上述两条规则可知:zImage 的入口程序即arch/arm/boot/compressed/head.S
    
     
    
    (3)查看arch/arm/boot下的Makefile中的另外两条规则:
    
    $(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'
    
    bootpImage的组成部分为bootp, bootp的组成部分为zImage和initrd
    
    查看arch/arm/boot/bootp/下的Makefile的规则
    
    $(obj)/bootp:       $(src)/bootp.lds $(addprefix $(obj)/, init.o kernel.o initrd.o) FORCE
    
           $(call if_changed,ld)
    
           @:
    
    $(obj)/kernel.o: arch/arm/boot/zImage FORCE
    
    $(obj)/initrd.o: $(INITRD) FORCE
    
    从上面的规则可知:bootpImage 的入口程序即arch/arm/boot/bootp/init.S
  • 相关阅读:
    超实用的 Nginx 极简教程,覆盖了常用场景(转)
    阿里云Redis开发规范(转)
    什么是 AQS ?
    缓存穿透、缓存并发、缓存失效之思路变迁(转)
    看不懂JDK8的流操作?5分钟带你入门(转)
    Redis 分布式锁的正确实现方式(转)
    urllib-Proxy
    基本urllib库
    Windows DOS 命令(持续更新...)
    java 位运算符
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13825515.html
Copyright © 2020-2023  润新知