设备树学习(十二、uboot如何给内核传dtb文件)

在通过tag给内核传参时,是只需要知道内核的地址就可以了。

因为uboot给内核传的参数一般是放到内存的某个地址,因为tag所占的内存比较小,所以一般都时放在内存的起始地址+0x100的位置

之后直接使用,bootm + 内核所在内存的地址

bootm 

在使用了设备树之后,一般我们是这样启动的

bootm   

这里的initrd是一个内存文件系统,因为在内核内启动之前,一般是文件系统还没加载上的。而有些东西必须要通过文件系统才能操作启动。所以必须要有一个过渡的文件系统。

有些情况是我们直接启动内核前,在内存中加载一个文件系统。

后来内核编译时自己在uImage中带了一个小的过渡文件系统,当然安也可以是优先使用我们启动内核前放到内存中的。

这个我们在设备树第4博文已经说过了。

https://blog.csdn.net/qq_16777851/article/details/87484238

 

 

 

设备树dtb文件被放在那里合适?

 

因为内核在编译uImage时我们指定了内核的链接地址

 make uImage LOADADDR=0x30008000 CROSS_COMPILE=arm-none-linux-gnueabi-

dtb文件肯定不能覆盖内核所在的空间,

 

下面给出uboot启动前到内核创建页表后的内存使用情况。

启动uboot启动内核前通过自举是把自己搬移到了内存的顶端。我之前的分析如下:

https://blog.csdn.net/qq_16777851/article/details/81749077

所以dtb文件也不能放在内存的最高地址存放uboot为位置

 

内核创建的页表临时页表起始地址在哪,可以参考这位网友的文章

https://blog.csdn.net/ooonebook/article/details/52850433

 

                     ------------------------------
  0x4ff80000       ->|    u-boot                  |
                     ------------------------------
                     |    u-boot所使用的内存(栈等)|
                     ------------------------------
                     |                            |
                     |                            |
                     |        空闲区域            |
                     |                            |
                     |                            |
                     |                            |
                     |                            |
                     ------------------------------
  0x30008000       ->|      zImage                |
                     ------------------------------  uImage = 64字节的头部+zImage
  0x30007FC0       ->|      uImage头部            |
                     ------------------------------
  0x30004000       ->|      内核创建的页表        |  head.S
                     ------------------------------
                     |                            |
                     |                            |
              -----> ------------------------------
              |
              |
              --- (内存基址 0x30000000)

除了这三个位置不能放之外,理论上其它位置都是可以放的。

比如0x30000000~内核临时页表之前,这段位置只有0x4000字节大小

比如uIage末尾到uboot之前,这段位置超级大上百兆大小

设备树学习(十二、uboot如何给内核传dtb文件)_第1张图片

我们看一下我们的设备树文件有多大,25k == 0x6400字节

所以如果放在内存低地址到页表前面这段,内核启动建立页表的时候,会破坏掉dtb文件。

所以一般dtb文件我们会放在内存中uImage到uboot之前的这一大段内存。

 

 

 

 

 

你可能感兴趣的:(设备树,设备树)