[Documentation]porting

初始化定义

-------------------

接下来的符号定义的前提是你知道在你的机器上运行的__virt_to_phy()这个转换函数的意思。这个宏把传进来的

虚拟地址转换成物理地址。通常情况下,它可以简化为:

  phys = virt - PAGE_OFFSET + PHYS_OFFSET

 

解压符号

-------------------

ZTEXTADDR

  解压代码(解压代码负责把内核镜像解压到RAM中的指定地址)的起始地址。此时谈论虚拟或者物理地址

没有意义,那是因为当调用解压代码时MMU是关闭的。它不必一定处于RAM中,可以处于flash、其他的只读

或可读写媒介。

 

ZBSSADDR

  解压代码初始化为0的工作区域起始地址。必须指向RAM。解压代码会把其初始化为0。同样的,MMU仍旧

是关闭的。

 

ZRELADDR

  解压后的内核写入到该地址,并从该地址开始执行。下列限制必须有效:

    __virt_to_phys(TEXTADDR) = ZRELADDR

  内核的初始化部分是经过精心编码的,与位置无关。

INITRD_PHYS

  放置初始化RAM的物理地址。只有在你使用bootpImage的使用才有用(只在旧的结构体param_struct中用到)。

INITRD_VIRT

   初始化RAM的虚拟地址。下列限制必须有效:

    __virt_to_phys(INITRD_VIRT) == INITRD_PHYS

PARAMS_PHYS

  param_struct结构体或标签列表的物理地址,提供内核关于其执行环境的变量参数。

 

内核符号

---------------

PHYS_OFFSET

  RAM的第一个bank的起始物理地址

PAGE_OFFSET

  RAM的第一个bank的起始虚拟地址。在内核启动阶段,虚拟地址PAGE_OFFSET会映射到物理地址PHYS_OFFSET,

TASK_SIZE

  用户空间进程的最大大小(字节)。由于用户空间总是从0开始,这是一个用户空间进程可访问的最大地址。用户空间栈从该

地址起向下生长。

  任何低于TASK_SIZE的虚拟地址都被认为是属于用户进程区域,由内核进行动态管理。我把这称作用户段(user segment)。

  任何超过TASK_SIZE的虚拟地址对所有进程来说都是相同的。我把这称作内核段(kernel segment)。

  (换句话说,你不能把IO映射在低于TASK_SIZE的地方)

TEXTADDR

  内核的起始虚拟地址,通常是PAGE_OFFSET + 0x8000。这是内核镜像结束的地方。最近版本的内核,它必须处于一个

128M区域的32768字节中。之前的内核对此的限制是256MB。

  (我的理解:对内核来说,内存的起始物理地址是PHYS_OFFSET,内存的起始虚拟地址是PAGE_OFFSET;内核运行的起始物理地址是ZRELADDR,内核运行的起始虚拟地址是TEXTADDR)

DATAADDR

  内核数据段的虚拟地址。解压代码运行时不用定义。

VMALLOC_START

VMALLOC_END

  限定了vmalloc()区域的虚拟地址范围。在该区域不能存在任何静态映射;vmalloc会重写它们的。该区域地址必须处于内核段。

通常,vmalloc()区域起始于距离上个虚拟RAM地址VMALLOC_OFFSET字节偏移处(上个虚拟RAM指的是VMALLOC区域之前的

物理内存映射区域,内核起来时标注位lowmem的区域)。

VMALLOC_OFFSET

  该偏移通常整合进VMALLOC_START在虚拟RAM和vmalloc区域之间提供一个间隔。以防止内存访问越界。通常是设置成8M。

 

体系相关的宏

--------------

BOOT_MEM(param,pio,vio)

  'param'指定了RAM的起始物理地址,和PHYS_OFFSET一样。

 

MAPIO(func)

  体系相关的函数,用来映射IO区域

INITIRQ(func)

  体系相关的函数,用来初始化中断

 

 

 

posted @ 2013-08-31 15:45  IrisZhou  阅读(314)  评论(0编辑  收藏  举报