61

帖子

0

TA的资源

一粒金砂(初级)

21
 
引用 19 楼 wohuazhen 的回复:
引用 15 楼 gooogleman 的回复:
引用 14 楼 wohuazhen 的回复:
难道编译器编译出来的东西也有物理地址和虚拟地址之分的?
我认为ldr r0, =PhysicalStart中的PhysicalStart,编译器给的是物理地址,但是当在打开MMU后,这段代码加载到cpu解释过程中会被处理器转换成虚拟地址。


不是啊,这个标号所标识的地址在MMU打开的时候是是标识虚拟地址,当关闭MMU它就是物理地址,由于,这个代码已经在MMU打开的时候跑到内存运行…


不是吧,标号的值不会变得
用mov pc的话,一定用的是绝对地址,和pc无关
如果用b指令,那么用的是pc相关的相对地址

回复

71

帖子

0

TA的资源

一粒金砂(初级)

22
 
好文章,学习了
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

23
 
编译器其实是不区分虚实地址的,只不过boot.bib里写了RAMIMAGE的地址是80000000(所谓的虚地址),所以PhysicalStart这个标号的值就是8XXXXXXX的虚地址,在关闭mmu后,必须把它转成物理地址3XXXXXXX

按你的解释,就是当编译出来的PhysicalStart这个标号的值就是8XXXXXXX的虚地址。那么在bootloader刚启动并未打开MMU的那伙,如果也存在一个标号的话,那编译出来是物理地址还是虚拟地址呢?如果是虚拟地址能正确运行吗?如果是物理地址,那么编译器就要去关注什么时候打开MMU,反之当然也要注意什么时候关闭MMU,那么编译器就再智能一点,将PhysicalStart编译成物理地址好了。还要用户去做转换,多麻烦啊。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

24
 
还有,我不明白在smdk2410的eboot的里边boot.bib里的memory都是0x8开头,说明都是虚拟地址。可是我的都是0x0开头说明是物理地址。都用到了MMU。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

25
 
引用 22 楼 wohuazhen 的回复:
编译器其实是不区分虚实地址的,只不过boot.bib里写了RAMIMAGE的地址是80000000(所谓的虚地址),所以PhysicalStart这个标号的值就是8XXXXXXX的虚地址,在关闭mmu后,必须把它转成物理地址3XXXXXXX

按你的解释,就是当编译出来的PhysicalStart这个标号的值就是8XXXXXXX的虚地址。那么在bootloader刚启动并未打开MMU的那伙,如果也存在一个标号的话,那编译出来是物理地址还是虚拟地址呢?如果是虚拟地址能正确运行吗?如果是…


越来越有意思了。本来想结贴了的。看来还是不行。
——在这里我也发表一下我的看法。
我觉得这个boot.bib文件是打包eboot的时候,把一些信息写进被打包的文件。在读出来的时候起到一些作用。
所以我觉得
编译器其实是不区分虚实地址的,只不过boot.bib里写了RAMIMAGE的地址是80000000(所谓的虚地址),所以PhysicalStart这个标号的值就是8XXXXXXX的虚地址,在关闭mmu后,必须把它转成物理地址3XXXXXXX
的说法比较合理。
这也是优龙 ADS bootloader为什么可以不用转换的原因之一。
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

26
 
我的开发板mboot(支持USB,NAND,SD,Ether等)boot.bib中
MBOOT    00010000  0003F000  RAMIMAGE
我用viewbin查看了一下,mboot.bin,也都是0x0开头的。
我在6楼也贴出了我的launch的汇编代码。也是用到MMU的。也做了那个虚拟地址到物理地址的转换。
如果做虚拟地址到物理地址的转换是因为RAMIMAGE的设置问题,显然是不成立的。
---我的理解。
我也觉得PC的值是绝对地址。但是当涉及到MMU的时候,在执行的过程中PC这个绝对地址会不会有所变化呢?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

27
 
引用 25 楼 wohuazhen 的回复:
我的开发板mboot(支持USB,NAND,SD,Ether等)boot.bib中
MBOOT    00010000  0003F000  RAMIMAGE
我用viewbin查看了一下,mboot.bin,也都是0x0开头的。
我在6楼也贴出了我的launch的汇编代码。也是用到MMU的。也做了那个虚拟地址到物理地址的转换。
如果做虚拟地址到物理地址的转换是因为RAMIMAGE的设置问题,显然是不成立的。
---我的理解。
我也觉得PC的值是绝对地址。但是当涉及到MMU的时候,在执行的过程中PC这个绝对地址会不会有所变化呢?


我觉得你是否是看到开MMU之前使用的那个bib文件。在bootloader中用到两个bib文件

对于2440 5.0 BSP中有boot.bib和stepldr.bib
=================boot.bib=========================
;******************************************************************************

MEMORY
;   Name     Start     Size      Type
;   -------  --------  --------  ----
    ARGS     80020800  00000800  RESERVED
    RAM      80026000  00006000  RAM   
    STACK    8002c000  00004000  RESERVED
    EBOOT    80038000  00040000  RAMIMAGEMMU打开,所以是虚拟地址,对应物理地址30038000       
    BINFS    80080000  00021000  RESERVED

; Area used to cache nk.bin while programming flash
    FLSCACHE 80200000  01400000  RESERVED
    DISPLAY  80100000  00100000  RESERVED

CONFIG
        COMPRESSION=OFF
        PROFILE=OFF
        KERNELFIXUPS=ON
;        ROMOFFSET=25FC8000
        SRE=ON
        ROMSTART=80038000
        ROMWIDTH=32
        ROMSIZE=40000
============================stepldr.bib========================
MEMORY
;   Name      Start     Size      Type
;   -------   --------  --------  ----
    STEPLDR   00000000  00001000  RAMIMAGE nboot阶段,没有开MMU,使用的是物理地址对应2440内部4K SRAM
    STACK     33ff5800  00001000  RESERVED
    RAM       33ff0000  00001000  RAM

CONFIG
        COMPRESSION=ON
        PROFILE=OFF
        KERNELFIXUPS=ON
   
        ROMSTART=00000000
        ROMWIDTH=32
        ROMSIZE=00001000

-----------------------------------------wohuazhen 请你把你的两个bib文件都贴出来看看。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

28
 
引用 22 楼 wohuazhen 的回复:
编译器其实是不区分虚实地址的,只不过boot.bib里写了RAMIMAGE的地址是80000000(所谓的虚地址),所以PhysicalStart这个标号的值就是8XXXXXXX的虚地址,在关闭mmu后,必须把它转成物理地址3XXXXXXX

按你的解释,就是当编译出来的PhysicalStart这个标号的值就是8XXXXXXX的虚地址。那么在bootloader刚启动并未打开MMU的那伙,如果也存在一个标号的话,那编译出来是物理地址还是虚拟地址呢?如果是虚拟地址能正确运行吗?如果是…


在bootloader刚启动并未打开MMU的那伙,pc的实际值和程序地址是不一致,因此那段指令必须都是位置无关的,并且不能直接引用全局变量,不能直接使用标号
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

29
 
MEMORY
;   Name     Start     Size      Type
;   -------  --------  --------  ----
    MBOOT    00010000  0003F000  RAMIMAGE
    RAM      00050000  00020000  RAM

CONFIG
        COMPRESSION=OFF
        PROFILE=OFF
        KERNELFIXUPS=ON
        ROMOFFSET=0
        SRE=OFF
        ROMSTART=00010000
        ROMWIDTH=32
;        ROMSIZE=3F000
        ROMSIZE=25000

MODULES
;   Name            Path                                                              Memory Type
;   --------------  ----------------------------------------------                    -----------
    nk.exe          $(_TARGETPLATROOT)\target\$(_TGTCPU)\$(WINCEDEBUG)\mboot.exe      MBOOT
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

30
 
ViewBin... mboot.bin
Image Start = 0x00010000, length = 0x00022738
                Start address = 0x00011000
Checking record #5 for potential TOC (ROMOFFSET = 0x00000000)
Found pTOC  = 0x00031e90
ROMOFFSET = 0x00000000

ROMHDR ----------------------------------------
    DLL First           : 0x02000000  
    DLL Last            : 0x02000000  
    Physical First      : 0x00010000  
    Physical Last       : 0x00032738  
    RAM Start           : 0x00050000  
    RAM Free            : 0x00060000  
    RAM End             : 0x00070000  
    Kernel flags        : 0x00000000  
    Prof Symbol Offset  : 0x00000000  
    Num Copy Entries    :          1   
    Copy Entries Offset : 0x00031F04  
    Num Modules         :          1   
    Num Files           :          0   
    MiscFlags           : 0x00000002  
    CPU                 :     0x01c2 (Thumb)
    Extensions          : 0x00000000

COPY Sections ---------------------------------
    Src: 0x00032000   Dest: 0x00050000   CLen: 0x738      DLen: 0xFEF0  

MODULES ---------------------------------------
    12/11/2008  03:07:04      143360  nk.exe

FILES ----------------------------------------
Done.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

31
 
我的开发板芯片不是三星的。
在mboot这个文件夹下,我只看到了boot.bib,没有别的*.bib。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

32
 
引用 30 楼 wohuazhen 的回复:
我的开发板芯片不是三星的。
在mboot这个文件夹下,我只看到了boot.bib,没有别的*.bib。


我的那两个bib不是在同一个文件夹的。

估计你的也有,我的一个在eboot下,一个在stepldr下
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

33
 
boot.bib是在mboot这个文件夹下找到的。我也用viewbin看了mboo.bin是0x0开头的。
在bsp\files下还有config.bib,platform.bib。那是0x8开头的。用viewbin看nk.bin是0x8开头的。
----------------------------------------------------------------------------
下面是mboot的部分代码
----------------------------------------------------------------------------
Start.s的代码会跳到这个函数。
void BootMain(DWORD addresstable)
{
        OALCacheGlobalsInit();
        OALClearITLB();
        OALClearDTLB();
        OALFlushICache();
        OALFlushDCache();

        MakePageTable (addresstable);

        mmuOn( PTs, (unsigned int)(main));//mmuOn是个汇编函数,在里边才会打开MMU

        while(1);
}
----------------------------------------------------------------------
start.s 部分代码
----------------------------------------------------------------------
                STARTUPTEXT

                LEAF_ENTRY StartUp

        b                ResetHandler ;第一句代码就用了跳转
         ldr                pc, Undef_addr                        ; undefined instruction
        ldr                pc, SWI_addr                        ; SWI
        ldr                pc, Prefetch_addr                ; Prefetch abort
        ldr                pc, Dabort_addr                        ; Data abort
        ldr                pc, reset_addr                        ; reserved
        ldr                pc, IRQ_addr                        ; IRQ
        ldr                pc, FIQ_addr                        ; FIQ
......
ResetHandler
......
        mov                r0, r10             ; addressTable
        b                BootMain
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

34
 
Start.s的代码会跳到这个函数。
void BootMain(DWORD addresstable)
{
OALCacheGlobalsInit();
OALClearITLB();
OALClearDTLB();
OALFlushICache();
OALFlushDCache();

MakePageTable (addresstable);

mmuOn( PTs, (unsigned int)(main));//mmuOn是个汇编函数,在里边才会打开MMU

while(1);
}
——你的有点奇怪,这个东西有点像三星的stepldr部分,就是把eboot拷贝到内存中执行,并在最后开MMU的那部分
你的bootloader菜单打印那里才真正用到了虚拟地址,你把菜单打印那里的bib文件找出来看看,
我觉得你可能是找错了地方了。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

35
 
我调试自己画的第一块板子的时候,在mmuOn( PTs, (unsigned int)(main))前用物理地址初始化串口,并输出字符串,进入main函数后,用同一个THB,串口就不能输出了(当时我还对MMU没什么概念,还想了很久为什么),后来在带main函数的文件里我用虚拟地址重新定义了NTHB,就可以输出字符串了。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

36
 
就是把eboot拷贝到内存中执行,并在最后开MMU的那部分
把mboot拷贝到内存的是nboot,这个代码在最后并没有打开MMU,而是和你的优龙同样的方法跳到了mboot去执行的。
nboot是放在nand flash的第0块,mboot紧随其后。冷启动是nand 启动,先运行的nboot的代码。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

37
 
引用 35 楼 wohuazhen 的回复:
就是把eboot拷贝到内存中执行,并在最后开MMU的那部分
把mboot拷贝到内存的是nboot,这个代码在最后并没有打开MMU,而是和你的优龙同样的方法跳到了mboot去执行的。
nboot是放在nand flash的第0块,mboot紧随其后。冷启动是nand 启动,先运行的nboot的代码。


那你的真是奇怪了。
那个bib文件怎么会这样呢?

难道这个bib的文件不起作用?我觉得不太可能。因为这个文件是专门组织bin文件的。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

38
 
难道这个bib的文件不起作用?我觉得不太可能。因为这个文件是专门组织bin文件的。
怎么不起作用了?用viewbin查看,确实是按boot.bib来的啊。
问题是你认为那个程序相关标号是因为boot.bib的关系,编译时设定为0x8开头了。如果不是,倒是是什么呢?
我以前看何老师的书时也很困惑,为什么他说boot.bib里的地址是虚拟地址,而我的是物理地址。那时忙着调试板子我还是没去深究。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

39
 
你不是可以反汇编吗?去反汇编你的eboot,看看那段代码反汇编过来是什么。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

40
 
; 182  :         mmuOn( PTs, (unsigned int)(main));

  00024        e59f1008         ldr         r1, [pc, #8] ;r1是main的地址
  00028        e3a00902         mov         r0, #2, 18   ;r0是PTs的值,2右循环18位为0x8000,确实这样定义
  0002c        eb000000         bl          mmuOn
  00030                 |$L41691|

; 183  :
; 184  :         while(1);

  00030        eafffffe         b           |$L41691|
  00034                 |$L41740|
  00034        00000000         DCD         |main|
  00038                 |$M41736|

                         ENDP  ; |BootMain|
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表