level 1
cymwin18
楼主
接着代码通过访问P15协处理器,得到当前的CPU的处理器ID,然后与以__proc_info_begin开始的处理器信息结构中的处理器ID相比较,相等则返回,不等则跳转到下一个处理器信息结构继续比较。从__proc_info_begin开始的保存处理器信息的结构的类型为struct proc_info_list,在include/asm-arm/procinfo.h中有具体的定义。实际的各处理器信息结构的赋值在arch/arm/mm/proc-xscale.S文件的.section ".proc.info",
#alloc, #
execinstr语句下面。为什么是在.proc.info段的下面呢?这是由vmlinux-armv.lds.in文件中的代码__proc_info_begin = .; *(.proc.info)__proc_info_end = .;所决定的。该段子程序完成后,各寄存器情况如下:R8 = 页表目录项的标志位R9 = 处理器IDR10 = 指向当前处理器信息结构的指针__lookup_architecture_type: adr r4, 2b ldmia r4, {r2, r3, r5, r6, r7} @ throw away r2, r3 sub r5, r4, r5 @ convert addresses add r4, r6, r5 @ to our address space add r7, r7, r51: ldr r5, [r4] @ get machine type teq r5, r1 beq 2f add r4, r4, #SIZEOF_MACHINE_DESC cmp r4, r7 blt 1b mov r7, #0 @ unknown architecture mov pc, lr2: ldmib r4, {r5, r6, r7} @ found, get results mov pc, lr这里开始查找机器的体系结构信息。前面已经提到过,在开始执行head-armv.S文件之前,R1中已经包含了当前的体系结构的类型号。现在所要做的,就是在__arch_info_begin开始的地址中,查找与R1中的值相匹配的机器类型信息。从__arch_info_begin开始的保存机器体系结构信息的类型为struct machine_desc,该结构在include/asm-arm/mach/arch.h中有具体的定义。对该结构的赋值使用MACHINE_START宏,该宏的定义同样在arch.h文件中。具体的机器体系结构的信息在arch/arm/kernel/arch.c中,当然也可以在arch/arm/mach-($machine-type)目录下的文件中添加与你自己的机器体系相对应的代码。这一点在进行linux移植的工作中很重要。该段子程序完成后,各寄存器情况如下:R5 = 内存(SDRAM)的起始物理地址R6 = IO的起始物理地址R7 = IO虚拟地址在页表中的索引项?这里有一个疑问。将R7赋值是为了调试的需要,使得串口可以打印调试信息,因此需要操作IO。现在,我的IO起始地址为0x40000000,在这里被映射到了0xFC000000。获得UART的虚拟地址的宏addruart在/arch/arm/kernel/debug-armv.S中被定义,这个宏通过io_p2v宏得到IO的虚拟地址,该宏在include/asm-arm/arch-pxa/hardware.h中被定义,但是它将0x40000000的物理地址映射到了0xF8000000,而不是上面提到的0xFC000000,这是为什么呢?希望能有人解释一下这个问题。__create_page_tables: pgtbl r4, r5 @ page table address /* Clear the 16K level 1 swapper page table */ mov r0, r4 mov r3,
#0 add r2, r0, #
0x40001: str r3, [r0],
#4 str r3, [r0], #
4 str r3, [r0],
#4 str r3, [r0], #
4 teq r0, r2 bne 1b /* * Create identity mapping for first MB of kernel to * cater for the MMU enable. This identity mapping * will be removed by paging_init() */ krnladr r2, r4, r5 @ start of kernel add r3, r8, r2 @ flags + kernel base
2008年03月15日 06点03分
1
#alloc, #
execinstr语句下面。为什么是在.proc.info段的下面呢?这是由vmlinux-armv.lds.in文件中的代码__proc_info_begin = .; *(.proc.info)__proc_info_end = .;所决定的。该段子程序完成后,各寄存器情况如下:R8 = 页表目录项的标志位R9 = 处理器IDR10 = 指向当前处理器信息结构的指针__lookup_architecture_type: adr r4, 2b ldmia r4, {r2, r3, r5, r6, r7} @ throw away r2, r3 sub r5, r4, r5 @ convert addresses add r4, r6, r5 @ to our address space add r7, r7, r51: ldr r5, [r4] @ get machine type teq r5, r1 beq 2f add r4, r4, #SIZEOF_MACHINE_DESC cmp r4, r7 blt 1b mov r7, #0 @ unknown architecture mov pc, lr2: ldmib r4, {r5, r6, r7} @ found, get results mov pc, lr这里开始查找机器的体系结构信息。前面已经提到过,在开始执行head-armv.S文件之前,R1中已经包含了当前的体系结构的类型号。现在所要做的,就是在__arch_info_begin开始的地址中,查找与R1中的值相匹配的机器类型信息。从__arch_info_begin开始的保存机器体系结构信息的类型为struct machine_desc,该结构在include/asm-arm/mach/arch.h中有具体的定义。对该结构的赋值使用MACHINE_START宏,该宏的定义同样在arch.h文件中。具体的机器体系结构的信息在arch/arm/kernel/arch.c中,当然也可以在arch/arm/mach-($machine-type)目录下的文件中添加与你自己的机器体系相对应的代码。这一点在进行linux移植的工作中很重要。该段子程序完成后,各寄存器情况如下:R5 = 内存(SDRAM)的起始物理地址R6 = IO的起始物理地址R7 = IO虚拟地址在页表中的索引项?这里有一个疑问。将R7赋值是为了调试的需要,使得串口可以打印调试信息,因此需要操作IO。现在,我的IO起始地址为0x40000000,在这里被映射到了0xFC000000。获得UART的虚拟地址的宏addruart在/arch/arm/kernel/debug-armv.S中被定义,这个宏通过io_p2v宏得到IO的虚拟地址,该宏在include/asm-arm/arch-pxa/hardware.h中被定义,但是它将0x40000000的物理地址映射到了0xF8000000,而不是上面提到的0xFC000000,这是为什么呢?希望能有人解释一下这个问题。__create_page_tables: pgtbl r4, r5 @ page table address /* Clear the 16K level 1 swapper page table */ mov r0, r4 mov r3,
#0 add r2, r0, #
0x40001: str r3, [r0],
#4 str r3, [r0], #
4 str r3, [r0],
#4 str r3, [r0], #
4 teq r0, r2 bne 1b /* * Create identity mapping for first MB of kernel to * cater for the MMU enable. This identity mapping * will be removed by paging_init() */ krnladr r2, r4, r5 @ start of kernel add r3, r8, r2 @ flags + kernel base