zoukankan      html  css  js  c++  java
  • linux内核镜像的加载地址和入口地址

    copy from :https://blog.csdn.net/whahu1989/article/details/85255538  https://wenku.baidu.com/view/2670021c195f312b3069a532.html

    linux内核启动时几个关键地址  
    1、名词解释
    ZTEXTADDR  解压代码运行的开始地址。没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。  

    ZRELADDR  内核启动在RAM中的物理地址。压缩的内核映像被解压到这个地址,然后执行。  
               This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid:     
                          __virt_to_phys(TEXTADDR) == ZRELADDR  The initial part of the kernel is carefully coded to be position independent.  
                          
    TEXTADDR  内核启动的虚拟地址,与ZRELADDR相对应。一般内核启动的虚拟地址为RAM的第一个bank地址加上0x8000。        
              TEXTADDR = PAGE_OFFSET + TEXTOFFST  Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.
              This is where the kernel image ends up. With the latest kernels, it must be located at 32768 bytes into a 128MB region.
              Previous kernels placed a restriction of 256MB here.   
              
    TEXT_OFFSET  内核偏移地址,即内核起始位置相对于内存起始位置的偏移,对于相对于物理内存还是相对于虚拟内存都是一样的结果。在arch/arm/makefile中设定。   

    PHYS_OFFSET  RAM第一个bank的物理起始地址,即物理内存的起始地址。
                 Physical start address of the first bank of RAM.   
                 PAGE_OFFSET  RAM第一个bank的虚拟起始地址,即内核虚拟地址空间的起始地址。
                  
    2、小结  
    从上面分析可知道,linux内核被bootloader拷贝到RAM后,解压代码从ZTEXTADDR开始运行(这段代码是与位置无关的PIC)。
    内核被解压缩到ZREALADDR处,也就是内核启动的物理地址处。
    相应地,内核启动的虚拟地址被设定为TEXTADDR,满足如下条件:
      TEXTADDR = PAGE_OFFSET + TEXT_OFFSET 内核启动的物理地址和虚拟地址满足入下条件:  
      ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)= virt_to_phys(TEXTADDR)
      假定开发板为smdk2410,则有:
      内核启动的虚拟地址 TEXTADDR  = 0xC0008000 内核启动的物理地址   ZRELADDR  = 0x30008000  
      如果直接从flash中启动还需要设置ZTEXTADDR地址。

    uboot引导linux内核镜像(uImage)启动时,会有2个地址

    加载地址(Load Address),即内核镜像整体要放置的内存空间位置
    入口地址(Entry Point),即从内核镜像中开始执行的地址
    示意图如下,

    其中,内核镜像的加载地址是100,入口地址是180,也就是说内核镜像本身要加载到内存地址为100的地方,然后从地址180开始执行内核代码(一般是_start指示的tag位置)。

    uboot启动内核的步骤是

    先把内核镜像uImage拷贝到内存某个位置上
    然后使用bootm命令去启动内存里的内核镜像
    如果我们没有把内核镜像uImage拷贝到指定的加载地址,那么bootm就会把内核镜像在内存中移动到指定的加载地址上,然后再去从内核的入口地址开始执行。

    加载地址和入口地址在uImage的开头部分有定义,这是编译内核镜像时指定的。
    ————————————————
    版权声明:本文为CSDN博主「爱是恒久忍耐1989」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/whahu1989/article/details/85255538

    Always Believe Something Beauitful Will Be Happen
  • 相关阅读:
    算法笔记_225:数字密码发生器(Java)
    LVS专题-(1)LVS基本介绍
    Mysql加锁过程详解(7)-初步理解MySQL的gap锁
    java实现二叉树的构建以及3种遍历方法
    java设计模式-菜鸟网络
    数据结构与算法(周鹏-未出版)-第六章 树-习题
    数据结构与算法(周鹏-未出版)-第六章 树-6.5 Huffman 树
    数据结构与算法(周鹏-未出版)-第六章 树-6.4 树、森林
    数据结构与算法(周鹏-未出版)-第六章 树-6.3 二叉树基本操作的实现
    数据结构与算法(周鹏-未出版)-第六章 树-6.2 二叉树
  • 原文地址:https://www.cnblogs.com/Oude/p/12217750.html
Copyright © 2011-2022 走看看