免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7884 | 回复: 13
打印 上一主题 下一主题

[BootLoader] 请教各位嵌入式大牛一些基本的问题,非常感谢哈~ [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-06 20:39 |只看该作者 |倒序浏览
最近在学习ARM的嵌入式
有些疑问一直萦绕在心头解不开,今天特地来贵地请教下各位:

在uboot中
1.uboot.map文件中 “ 0x80800000”是虚拟地址吧?
Memory Configuration

.text           0x80800000    0x3fae0
                0x80800000                __image_copy_start = .
arch/arm/cpu/armv7/start.o(.text*)
.text          0x80800000      0x440 arch/arm/cpu/armv7/start.o
                0x80800000                _start

2.以下的tftp的入参“0x81080000”同样是虚拟地址的吧?
# get u-boot.img
tftp 0x81080000 u-boot.img

3.把uImage.bin烧写到norflash的某个分区中后,以后在启动的时候,uboot是通过什么方式知道uImage的地址的,今儿去copy它到ram中的?

期待大牛们的解答,非常感谢~!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2015-02-08 01:48 |只看该作者
自己先来顶一下,还没有答案呢,不要沉了啊
呼唤版主~!

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
3 [报告]
发表于 2015-02-09 10:56 |只看该作者
bootloader从该位置开始加载的image

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-02-09 14:15 |只看该作者
回复 3# T-Bagwell

斑竹大人是否曲解了我的疑问?
1.
uboot.map文件中 “ 0x80800000”是虚拟的地址还是物理地址?
我感觉是物理地址吧,uboot中没tlb影射太多的空间吧

2.
把uImage.bin烧写到norflash的某个分区中后,在以后的启动的时候,uboot是通过什么方式知道uImage烧写到哪个的地址的(进而去copy它到ram中的)?

以上问题,还望见笑,期待您的解答,非常感谢~!


   

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
5 [报告]
发表于 2015-02-09 15:07 |只看该作者
xuxiaohu572 发表于 2015-02-09 14:15
回复 3# T-Bagwell

斑竹大人是否曲解了我的疑问?


第一个我木有关注过,第二个是烧写uImage的时候就已经烧写入指定的分区了,读取的时候就是从指定的分区开始读的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2015-02-10 09:44 |只看该作者
T-Bagwell 发表于 2015-02-09 15:07
第一个我木有关注过,第二个是烧写uImage的时候就已经烧写入指定的分区了,读取的时候就是从指定的分区 ...


1.
uboot.map文件中 “ 0x80800000”是虚拟的地址还是物理地址?
-----这个问题,我目前的理解是 虚拟地址,但是在tftp addr这个地址,我认为是物理的寻址地址(或者被影射成数值对等的虚拟地址了)

2.
“第二个是烧写uImage的时候就已经烧写入指定的分区了,读取的时候就是从指定的分区 ...[/quote]”
---这个问题我很感兴趣,也很希望能得到斑竹的指导与提示,也许我换一个问法更好些:
“如果我把内核镜像uImage烧写在不同的norflash分区中,uboot的代码应该如何的调整”(即在uboot中哪边的代码定义的这个“指定的分区”)


-----以上,一如既往的期待得到斑竹及各位达人的指导,谢谢~!

论坛徽章:
0
7 [报告]
发表于 2015-02-10 11:42 |只看该作者
本帖最后由 crifan 于 2015-02-10 14:22 编辑

回复 6# xuxiaohu572


    1.
uboot.map文件中 “ 0x80800000”是虚拟的地址还是物理地址?
-----这个问题,我目前的理解是 虚拟地址,但是在tftp addr这个地址,我认为是物理的寻址地址(或者被影射成数值对等的虚拟地址了)
A:据我所知,uboot中涉及的内存的地址,也都是物理地址,而不是虚拟地址。
虚拟地址一般是等到操作系统,Linux,启动之后,开启了内存映射才会涉及到的。

2.
“第二个是烧写uImage的时候就已经烧写入指定的分区了,读取的时候就是从指定的分区 ...[/quote]”
---这个问题我很感兴趣,也很希望能得到斑竹的指导与提示,也许我换一个问法更好些:
“如果我把内核镜像uImage烧写在不同的norflash分区中,uboot的代码应该如何的调整”(即在uboot中哪边的代码定义的这个“指定的分区”)
A:
如果你把内核镜像uImage烧写在不同的NorFlash分区中:
(1)uboot代码中,不需要调整代码,只需要改变启动参数。
比如:
原先是uImage是在xxxx的地址,对应的是mtdblock2
你想要改为yyyy的地址,对应的是mtdblock3
那么就只是去uboot中把:
类似于
【解答】内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的地址的
http://www.crifan.com/answer_kernel_kernel_and_root_file_system_rootfs_is_mapped_to_the_corresponding_address_of_the_nand_flash/
中的:
#define CONFIG_BOOTARGS    "root=/dev/mtdblock2 rw init=/linuxrc console=ttyS0,115200 mem=16M rootfstype=yafffs2"
改为:
#define CONFIG_BOOTARGS    "root=/dev/mtdblock3 rw init=/linuxrc console=ttyS0,115200 mem=16M rootfstype=yafffs2"
即可。
而无需改动其他的uboot代码。

(2)Linux内核源码中的Flash分区的定义,也要同步修改。
但是对应的Linux中的Flash的分区,需要同步修改。
比如之前是
http://www.denx.de/wiki/publish/DULG/to-delete/FlashFilesystemsMTD.html
中的:
  1. /* partition definition for first flash bank
  2. * also ref. to "drivers/char/flash_config.c"
  3. */
  4. static struct mtd_partition incaip_partitions[] = {
  5.         {
  6.           name:         "U-Boot",       /* U-Boot firmware */
  7.           offset:       0x00000000,
  8.           size:         0x00030000,     /* 192KB           */
  9. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  10.         },
  11.         {
  12.           name:         "Environment",  /* default kernel image */
  13.           offset:       0x00030000,
  14.           size:         0x00010000,
  15. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  16.         },
  17.         {
  18.           name:         "Linux",        /* default kernel image */
  19.           offset:       0x00040000,
  20.           size:         0x000C0000,
  21. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  22.         },
  23.         {
  24.           name:         "rootfs",       /* default root filesystem */
  25.           offset:       0x00100000,
  26.           size:         0x00300000,
  27. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  28.         },
  29.         {
  30.           name:         "Linux 2",      /* alternate kernel image */
  31.           offset:       0x00400000,
  32.           size:         0x000C0000,
  33. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  34.         },
  35.         {
  36.           name:         "rootfs 2",     /* alternate root filesystem */
  37.           offset:       0x00500000,
  38.           size:         0x00300000,
  39. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  40.         },
  41. };
复制代码

改为:
  1. /* partition definition for first flash bank
  2. * also ref. to "drivers/char/flash_config.c"
  3. */
  4. static struct mtd_partition incaip_partitions[] = {
  5.         {
  6.           name:         "U-Boot",       /* U-Boot firmware */
  7.           offset:       0x00000000,
  8.           size:         0x00030000,     /* 192KB           */
  9. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  10.         },
  11.         {
  12.           name:         "Environment",  /* default kernel image */
  13.           offset:       0x00030000,
  14.           size:         0x00010000,
  15. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  16.         },
  17.         {
  18.           name:         "LinuxNotUseThis",        /* old kernel image */
  19.           offset:       0x00040000,
  20.           size:         0x000C0000,
  21. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  22.         },
  23. {
  24.           name:         "Linux",        /* new kernel image partition */
  25.           offset:       0x00100000,
  26.           size:         0x000C0000,
  27. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  28.         },
  29.         {
  30.           name:         "rootfs",       /* default root filesystem */
  31.           offset:       0x001C0000,
  32.           size:         0x004C0000,
  33. /*        mask_flags:   MTD_WRITEABLE,     force read-only */
  34.         },
  35.         。。。(后续起始地址相应的也要增加C0000)
  36. };
复制代码
(注:此处假定废弃不要之前旧的分区LinuxNotUseThis了。

这样,新的流程就变成:
启动uboot时候,uboot最后去
存放了Linux内核uImage的分区:
/dev/mtdblock3
(对应着新地址:0x00100000
加载内核
(而废弃,不用了之前的旧地址       0x00040000对应的旧分区/dev/mtdblock2
了。

更多相关内容可参考:
1.【解答】内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的地址的
http://www.crifan.com/answer_kernel_kernel_and_root_file_system_rootfs_is_mapped_to_the_corresponding_address_of_the_nand_flash/

2.以及:
在Linux运行期间升级Linux系统(Uboot+kernel+Rootfs)
http://www.crifan.com/files/doc/docbook/runtime_upgrade_linux/release/html/runtime_upgrade_linux.html
尤其是其中的:


3.这个也可以看看:
【详解】嵌入式开发中固件的烧录方式
http://www.crifan.com/files/doc/docbook/firmware_download/release/html/firmware_download.html


论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2015-02-10 15:58 |只看该作者
crifan 发表于 2015-02-10 11:42
回复 6# xuxiaohu572


首先,很感谢crifan的细致解答
对于
1.
“A:据我所知,uboot中涉及的内存的地址,也都是物理地址,而不是虚拟地址。
虚拟地址一般是等到操作系统,Linux,启动之后,开启了内存映射才会涉及到的。”

------powerpc的uboot中临时tlb映射了256M的空间的(只是物理地址映射成跟虚拟地址一样的数值,到了内核后又释放掉,重新映射的),arm目前还真是待研究ing,感谢各位赐教
下面重点向你请教下2.吧
2.
#define CONFIG_BOOTARGS    "root=/dev/mtdblock2 rw init=/linuxrc console=ttyS0,115200 mem=16M rootfstype=yafffs2"
----是我理解的有偏差吗:这里的root参数只是告诉内核启动时使用哪个设备作为根文件系统的吧?我感兴趣的还是uImage的那个分区的地址是如何告诉uboot的呢

期待您的答复,谢谢~!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2015-02-13 09:58 |只看该作者
回复 8# xuxiaohu572


    应该是由这个宏来搞定uImage的copy及启动的
在include/configs/xxx板子.h

#define CONFIG_EXTRA_ENV_SETTINGS \
"nandboot=echo Booting from nand ...; " \
                "run nandargs; " \
                "nand read ${loadaddr} ${nandsrcaddr} ${nandimgsize}; " \
                "bootm ${loadaddr}\0" \


本人是用的norflash,所以自己修改添加了下宏的内容(板子要年后才能焊接回来,现在无法验证修改是否正确,但是思路应该没错的,等验证好了再及时补上,感谢斑竹及crifan的指导
#define CONFIG_EXTRA_ENV_SETTINGS \
"norboot=echo Booting from nor ...; " \
                "setenv bootargs console=ttyO0,115200n8 " \
                "root=/dev/mtdblock2 rw " \                        //--暂且认为是mtdblock2设备
                "rootfstype=jffs2" \
                //"sf probe ${spibusno}:0; " \----这一步CFI norflash不需要吧?
                "cp.b 0x80008000 0x000000 0x400000; " \----//这个地址是编译器做出的load addr吧?这个命令也行吧fsload 0x80008000 uImage
                "bootm 0x80008000\0" \

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2015-02-15 18:15 |只看该作者
1、物理地址
2、uboot是自己不知道uImage.bin的地址的,正确的做法是:通过在uboot的时候设置启动参数,将物理地址的镜像数据读到指定的地址,然后uboot从该地址启动。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP