• u-boot对设备树的支持__传递dtb给内核


    a. u-boot中内核启动命令:
       bootm                            // 无设备树,bootm 0x30007FC0
       bootm   // 有设备树
       
       比如 :
       nand read.jffs2 0x30007FC0 kernel;     // 读内核uImage到内存0x30007FC0
       nand read.jffs2 32000000 device_tree;  // 读dtb到内存32000000
       bootm 0x30007FC0 - 0x32000000          // 启动, 没有initrd时对应参数写为"-"

    b. bootm命令怎么把dtb_addr写入r2寄存器传给内核?
       百度搜索:ARM程序调用规则(ATPCS)
       
          c_function(p0, p1, p2) // p0 => r0, p1 => r1, p2 => r2
          
          所以我们只需要定义一个函数指针 the_kernel, 指向内核的启动地址,
          然后执行: the_kernel(0, machine_id, 0x32000000);


          

    c. dtb_addr 可以随便选吗?
       c.1 不要破坏u-boot本身
       c.2 不要挡内核的路: 内核本身的空间不能占用, 内核要用到的内存区域也不能占用
                           内核启动时一般会在它所处位置的下边放置页表, 这块空间(一般是0x4000即16K字节)不能被占用
       
      JZ2440内存使用情况:
                         ------------------------------
      0x33f80000       ->|    u-boot                  |
                         ------------------------------
                         |    u-boot所使用的内存(栈等)|
                         ------------------------------
                         |                            |
                         |                            |
                         |        空闲区域            |
                         |                            |
                         |                            |
                         |                            |
                         |                            |
                         ------------------------------
      0x30008000       ->|      zImage                |
                         ------------------------------  uImage = 64字节的头部+zImage
      0x30007FC0       ->|      uImage头部            |
                         ------------------------------
      0x30004000       ->|      内核创建的页表        |  head.S
                         ------------------------------
                         |                            |
                         |                            |
                  -----> ------------------------------
                  |
                  |
                  --- (内存基址 0x30000000)

    怎么看内核的地址是在0x30008000 ,用下面的命令

    命令示例:
    a. 可以启动:
    nand read.jffs2 30000000 device_tree
    nand read.jffs2 0x30007FC0 kernel
    bootm 0x30007FC0 - 30000000

    b. 不可以启动: 内核启动时会使用0x30004000的内存来存放页表,dtb会被破坏
    nand read.jffs2 30004000 device_tree
    nand read.jffs2 0x30007FC0 kernel
    bootm 0x30007FC0 - 30004000

  • 相关阅读:
    TuyaLink 快速入门教程
    【Linux】日志 日志管理服务 日志轮替
    小程序 | 黑马商城【未更完--实习去了】
    远程工作面临减薪,该何去何从?谷歌员工陷入焦虑
    Android - kts文件配置应用签名
    如何保留 Excel 表头和第一行数据并追加 CSV 数据
    Mysql知识点
    基于Web的美食分享平台的设计与实现——HTML+CSS+JavaScript水果介绍网页设计(橙子之家)
    PEI是聚醚酰亚胺(Polyetherimide)在粘接使用时使用UV胶水的优势有哪些?要注意哪些事项?
    Xcode 中设置APP的图标(Icon)和启动页面(Launch Screen)
  • 原文地址:https://blog.csdn.net/u013171226/article/details/127916753