devicemaps_init(mdesc)

devicemaps_init的参数为machine_desc结构体。以s3c6410为例,在arch/arm/mach-s3c64xx/mach-smdk6410.c中使用上述宏声明machine_desc结构体

MACHINE_START(SMDK6410, "SMDK6410")
    /* Maintainer: Ben Dooks <ben-linux@fluff.org> */
    //.phys_io    = S3C_PA_UART & 0xfff00000,
    //.io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,
    .boot_params    = S3C64XX_PA_SDRAM + 0x100,

    .init_irq    = s3c6410_init_irq,
    .map_io        = smdk6410_map_io,
    .init_machine    = smdk6410_machine_init,
    .timer        = &s3c24xx_timer,
MACHINE_END

devicemaps_init的作用:

1.为中断向量分配内存,为中断向量虚拟地址映射的页表分配内存,建立虚拟地址到物理地址的映射。

具体参考create_mapping(&map)函数。

linux中ARM处理器使用的是高端中断向量地址0xffff_0000.

这一点可以在进入start_kernel之前的汇编函数__v6_setup中看到,该函数的返回值r0中保存的是要写入CP15 C1中的值。

/*
 *    __v6_setup
 *
 *    Initialise TLB, Caches, and MMU state ready to switch the MMU
 *    on.  Return in r0 the new CP15 C1 control register setting.
 *
 *    We automatically detect if we have a Harvard cache, and use the
 *    Harvard cache control instructions insead of the unified cache
 *    control instructions.
 *
 *    This should be able to cover all ARMv6 cores.
 *
 *    It is assumed that:
 *    - cache type register is implemented
 */
__v6_setup:
#ifdef CONFIG_SMP
    mrc    p15, 0, r0, c1, c0, 1        @ Enable SMP/nAMP mode
    orr    r0, r0, #0x20
    mcr    p15, 0, r0, c1, c0, 1
#endif

    mov    r0, #0
    mcr    p15, 0, r0, c7, c14, 0        @ clean+invalidate D cache
    mcr    p15, 0, r0, c7, c5, 0        @ invalidate I cache
    mcr    p15, 0, r0, c7, c15, 0        @ clean+invalidate cache
    mcr    p15, 0, r0, c7, c10, 4        @ drain write buffer
#ifdef CONFIG_MMU
    mcr    p15, 0, r0, c8, c7, 0        @ invalidate I + D TLBs
    mcr    p15, 0, r0, c2, c0, 2        @ TTB control register
    orr    r4, r4, #TTB_FLAGS
    mcr    p15, 0, r4, c2, c0, 1        @ load TTB1
#endif /* CONFIG_MMU */
    adr    r5, v6_crval
    ldmia    r5, {r5, r6}
    mrc    p15, 0, r0, c1, c0, 0        @ read control register
    bic    r0, r0, r5            @ clear bits them
    orr    r0, r0, r6            @ set them
    mov    pc, lr                @ return to head.S:__ret

v6_crval宏的定义如下:

    .macro    crval, clear, mmuset, ucset
#ifdef CONFIG_MMU
    .word    \clear
    .word    \mmuset
#else
    .word    \clear
    .word    \ucset
#endif
    .endm

    .type    v6_crval, #object
v6_crval:
    crval    clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c

r0 = r0 & (~clear) | (mmuset)

 可以看到,最终V是被设置为1了,所以是高端地址中断。

 

2.调用mdesc->map_io()进行SOC相关的初始化。

以S3C6410为例调用的是smdk6410_map_io(),这个函数的具体实现以后再详细分析。

posted @ 2018-08-15 20:41  bluebluebluesky  阅读(450)  评论(0编辑  收藏  举报