uclinux启动
时间:2005-03-26 来源:wang1385
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 eg, stext
sub eg, eg, #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 d, 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处理器的内容吧