zoukankan      html  css  js  c++  java
  • 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(),这个函数的具体实现以后再详细分析。

  • 相关阅读:
    DICOMDIR结构
    给文件夹添加Everyone用户
    关于Predicate<T>委托
    开发者必备的6款源码搜索引擎
    Create XML Files Out Of SQL Server With SSIS And FOR XML Syntax
    create xml file from sql script
    DICOM中的入门概念
    小米note开启调试模式
    [转] Java基础知识——Java语言基础
    Java语言基本语法
  • 原文地址:https://www.cnblogs.com/yangjiguang/p/9483878.html
Copyright © 2011-2022 走看看