zoukankan      html  css  js  c++  java
  • NKStartup的参数KData

    NKStartup的参数KData是什么?,其实就是一个数据结构, 它位于nkldr的data区。如下:

          AREA |.KDATA|,DATA,NOINIT

            

    KDataArea

    PTs     %       0x4000          ; space for first-level page table

    ExceptionVectors 

            %       0x0400    ; space for exception vectors

            %       0x0400    ; space for interrupt stack

            %       0x0100    ; space for FIQ stack

            %       0x0700    ; space for Abort stack

    KPage  %       0x0c00   ; space for kernel stack & KDataStruct

    HighPT %       0x0400   ; 2nd level page table to map 0xFFF00000

    KDEnd %       0

    撇开实现, 单纯去理解的话, 和传递一个结构体指针没有什么区别。 再问: 这个数据结构干嘛的,代表什么? 这得明白高地址分配。

    [高地址分配]

       ^ 0xFFFD0000

    FirstPT         # 0x4000

                 # 0x4000

                 # 0x8000

                 # 0x10000       ; not mapped

    ExVector       # 0x0400        ; vectors and table

                 # 0x0400  ; 1K interrupt stack            (ffff0400)

    IntStack       # 0x0100 ; 256 byte FIQ stack            (ffff0800)

    FIQStack      # 0x0700 ; 2K-256 abort stack            (ffff0900)

    AbortStack  #0xC000-0x1000;not mapped                (ffff1000)

    KDBase       # 0x07E0        ; 2K-32 kernel stack

    KStack        # 0x0020        ; temporary register save area

    KData         # 0x400         ; kernel data area

    FirstPT就是之前说的一级页表所在。大小16kbytes。 后面保留了2块区域,也许是提供给2级页表使用。 ExVector是异常入口, Arm有个机制, 通过设定p15, 可以将异常入口从0x18改成高地址FFFF0000. IntStack, FIQStack, AbortStack, KStack分别是各个模式以及内核的堆栈。 KData就是内核参数区了。

    typedef struct ARM_HIGH {

        ulong   firstPT[4096];      // 0xFFFD0000: 1st level page table

        char    reserved2[0x20000-0x4000];

        char    exVectors[0x400];   // 0xFFFF0000: exception vectors

        char    reserved3[0x2400-0x400];

        char    intrStack[0x400];   // 0xFFFF2400: interrupt stack

        char    reserved4[0x4900-0x2800];

        char    abortStack[0x700];  // 0xFFFF4900: abort stack

        char    reserved5[0x6800-0x5000];

        char    fiqStack[0x100];    // 0xFFFF6800: FIQ stack

        char    reserved6[0xC000-0x6900];

        char    kStack[0x800];      // 0xFFFFC000: kernel stack

        struct KDataStruct kdata;   // 0xFFFFC800: kernel data page

    } ARM_HIGH;

  • 相关阅读:
    Ddr2,ddr3,ddr4内存条的读写速率
    Ddr2,ddr3,ddr4内存条的读写速率
    【VS开发】获取CPU tick tick 周期
    【VS开发】获取CPU tick tick 周期
    【VS开发】malloc申请内存错误分析
    【VS开发】malloc申请内存错误分析
    【VS开发】Return与Exit的区别
    【VS开发】Return与Exit的区别
    【VS开发】C/C++预编译命令
    【VS开发】C/C++预编译命令
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298850.html
Copyright © 2011-2022 走看看