完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
你好
我跟着韦老师毕业班动手写bootloader后,调试完了,也都正常能用,但是关于链接脚本我有些疑惑: 链接脚本源代码如下: SECtiONS { . = 0x33f80000; .text : { *(.text) } . = ALIGN(4); .rodata : {*(.rodata*)} . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); __bss_start = .; .bss : { *(.bss) *(COMMON) } __bss_end = .; } 生成的反汇编起始部分如下: 33f80000 <_start>: 33f80000: e3a00453 mov r0, #1392508928 ; 0x53000000 33f80004: e3a01000 mov r1, #0 ; 0x0 33f80008: e5801000 str r1, [r0] 33f8000c: e59f0098 ldr r0, [pc, #152] ; 33f800ac 33f80010: e3a01003 mov r1, #3 ; 0x3 33f80014: e5801000 str r1, [r0] 33f80018: ee111f10 mrc 15, 0, r1, cr1, cr0, {0} 33f8001c: e3811103 orr r1, r1, #-1073741824 ; 0xc0000000 33f80020: ee011f10 mcr 15, 0, r1, cr1, cr0, {0} 33f80024: e59f0084 ldr r0, [pc, #132] ; 33f800b0 33f80028: e59f1084 ldr r1, [pc, #132] ; 33f800b4 33f8002c: e5801000 str r1, [r0] 现在疑惑来了,既然链接脚本指定的生成的目标文件的起始地址为0x33f80000,生成的目标代码中的起始地址也的确是0x33f80000,但是我无论是把bootloader烧写到nandflash还是norflash中后,开发板重新上电,2440都是从0地址开始执行的呀,那么这个链接脚本指定的0x33f80000这个地址在其中到底起着什么样的作用呢? |
|
相关推荐
3个回答
|
|
视频接着往后看,好像隐约感觉是因为前面的一段代码是位置无关代码的原因,具体的还需要进一步考虑证实,唉,自问自答
|
|
|
|
对于ARM架构的CPU,上电后PC寄存器是指向0地址处的,从这个地址开始运行程序,那么运行了启动代码后会把程序搬移到内存中去运行,这样就是产生程序会在运行时有个两地址,而由源码编译为可执行文件时只会指定一个链接地址,指定的这个地址通常是在内存中运行时的运行地址
|
|
|
|
嗯,明白了,感谢你
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2217 浏览 6 评论
2016 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4575 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-31 10:54 , Processed in 0.432387 second(s), Total 46, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号