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;

原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298850.html