| 关于uClinux在ARM7上的启动分析 uclinux初始化---(1) 第零个文件 arch/armnommu/Makefile 在这个文件中定义了你编译好的内核的入口的地址和MACHINE类型,一般是通过条件编译 TEXTADDR = 0x10008000 这个值完全是根据cpu和内存状况确定的 MACHINE = your_processor
指定连接文件 LINKFLAGS :=-p -X -T arch/armnommu/vmlinux.lds
替换vmlinux-$(PROCESSOR).lds.in中的TEXTADDR,生成实际需要的连接脚本 arch/armnommu/vmlinux.lds: arch/armnommu/vmlinux-$(PROCESSOR).lds.in dummy ifeq ($(CONFIG_ARCH_DSC21),y) @sed "s/TEXTADDR/$(TEXTADDR)/" <$< >tmp.ld @sed "s/DATAADDR/$(DATAADDR)/" $@ $(RM) tmp.ld else @sed "s/TEXTADDR/$(TEXTADDR)/" <$< >$@ endif
一般连接脚本的前面几句是这样的 ENTRY(stext)---------指定入口 SECTIONS { . = $(TEXTADDR);-----设定入口的绝对地址 第一个文件linux/arch/armnommu/kernel/head-armv.S #define K(a,b,c) ((a) << 24 | (b) << 12 | (c)) #ifndef CONFIG_UCLINUX 设置符号swapper_pg_dir的地址 .globl SYMBOL_NAME(swapper_pg_dir) .equ SYMBOL_NAME(swapper_pg_dir), TEXTADDR - 0x4000 定义了一个宏,该宏可以获得swapper_pg_dir的地址 .macro pgtbl, reg, rambase adr \reg, stext sub \reg, \reg, #0x4000 .endm
/* * Since the page table is closely related to the kernel start address, we can convert the page table base address to the base address of the section * containing both. */ .macro krnladr, rd, pgtable, rambase bic \rd, \pgtable, #0x000ff000 .endm #endif
/* * Kernel startup entry point. * * The rules are: * r0 - should be 0 * r1 - unique architecture number * MMU - off * I-cache - on or off * D-cache - off * * See linux/arch/arm/tools/mach-types for the complete list of numbers for r1. */ .section ".text.init",#alloc,#execinstr .type stext, #function 请注意,这里是入口点,而且此时r1中应该保存唯一的一个architecture number ENTRY(stext)
保存r0寄存器的值????? mov r12, r0 #if defined(CONFIG_ARCH_NETWINDER) 。。。。。 #endif #if defined(CONFIG_ARCH_L7200) mov r1, #MACH_TYPE_L7200 #elif defined(CONFIG_ARCH_INTEGRATOR) mov r1, #MACH_TYPE_INTEGRATOR #elif defined(CONFIG_ARCH_P52) mov r1, #MACH_TYPE_P52 #elif defined(CONFIG_ARCH_SWARM) mov r1, #MACH_TYPE_SWARM #elif defined(CONFIG_ARCH_SAMSUNG) mov r1, #MACH_TYPE_SAMSUNG #endif 前面预定义了部分的ARCH,如果匹配的上,R1中包含了architecture number
其实系统复位之后,ARM就处于SVC 模式,而且禁止了FIQ IRQ, 的确如注视所说--make sure mov r0, #F_BIT | I_BIT | MODE_SVC @ make sure svc mode msr cpsr_c, r0 @ and all irqs disabled
使用的是atmel的arm处理器吗???跳过去吧 #if defined(CONFIG_ARCH_ATMEL) 。。。。。 #endif 又来,使用的是samsumg的arm处理器吗???跳过去吧 #if defined(CONFIG_ARCH_SAMSUNG) 。。。。。 #endif
重点还是分析通用的arm处理器的内容吧
|