游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

编译器是如何将芯片执行的第一个指令放到芯片起始地址的?

  编译器是如何将芯片执行的第一个指令放到芯片起始地址的?
  芯片上电后,会自动跳到第一需要执行的指令,那么编译器和链接器是做了哪些工作才让第一条指令被放在了正确的地方,以arm为例,uboot编译后为何能确保reset被放在了起始地址呢?
  本人8年嵌入式LinuxBSP开发经验,关于UBoot的开发经验如下:
  平台开发:涉及ARM3264、MIPS架构,MTK、海思等不下5个厂商UBoot的BSP开发
  版本升级:将某平台的低版本Uboot升级至最新uboot2022。01版本
  架构设计:将业务代码从UBoot中剥离,灵活适配不同Uboot版本、所有产品不同平台不同架构的不同单板
  所以,相信有资格回答这个问题。
  本文8000多字,掏心带你深入理解背后的原理,需要你耐心往下看。除了问题本身,你还将收获:
  什么是链接脚本,UBoot下的链接脚本长什么样?
  UBoot编译时是怎么链接的?
  UBoot下这么多start。s,当前设备跑的到底是哪一个?
  正文
  这个问题往深了说就涉及到了编译原理。
  在计算机世界中,其实每一次链接过程都是由链接脚本控制的。那么什么是链接脚本呢?简单说就是由链接器命令语言书写的,给链接器看的,主要的目的是描述输入文件中的段(如text段、data段、bss段等)如何在输出文件中组装,并控制输出文件的存储布局。
  那么上面提到的链接器、链接脚本、输入文件、输出文件分别是指什么呢?
  读万卷书,不如走一步路。动动手指,编译一下UBoot就知道了,如果你还不清楚怎么编译或者没有环境的话,建议你参考我的文章搭建一个:
  闪光吧Linux:走进嵌入式Linux大门的第二步构建最新uboot学习环境9赞同0评论文章
  下面是编译结果,截取重点如下:
  makeCROSSCOMPILEaarch64linuxgnuV1
  。。。。
  aarch64linuxgnuld。bfdpiegcsectionsBstaticnodynamiclinkerznotextbuildidnoneTtext0x00000000oubootTuboot。ldsarcharmcpuarmv8start。owholearchivearcharmcpubuiltin。oarcharmcpuarmv8builtin。oarcharmlibbuiltin。oboardemulationcommonbuiltin。oboardemulationqemuarmbuiltin。obootbuiltin。ocmdbuiltin。ocommonbuiltin。odiskbuiltin。odriversbuiltin。odriversusbcdns3builtin。odriversusbcommonbuiltin。odriversusbdwc3builtin。odriversusbemulbuiltin。odriversusbethbuiltin。odriversusbhostbuiltin。odriversusbmtu3builtin。odriversusbmusbnewbuiltin。odriversusbmusbbuiltin。odriversusbphybuiltin。odriversusbulpibuiltin。oenvbuiltin。ofsbuiltin。olibbuiltin。onetbuiltin。onowholearchiveLusrlibgcccrossaarch64linuxgnu9lgccMapuboot。map;true
  aarch64linuxgnuobjcopygapfill0xffj。textj。securetextj。securedataj。rodataj。dataj。ubootlistj。rela。dynj。gotj。got。pltj。binmansymtablej。textrestj。dtb。init。rodataj。efiruntimej。efiruntimerelOsrecubootuboot。srec
  aarch64linuxgnuobjcopygapfill0xffj。textj。securetextj。securedataj。rodataj。dataj。ubootlistj。rela。dynj。gotj。got。pltj。binmansymtablej。textrestj。dtb。init。rodataj。efiruntimej。efiruntimerelObinaryubootubootnodtb。bin{echostart(aarch64linuxgnunmgrepreldynstartcutf1d);end(aarch64linuxgnunmgrepreldynendcutf1d);toolsrelocaterelastartend;start(aarch64linuxgnunmubootgrepreldynstartcutf1d);end(aarch64linuxgnunmubootgrepreldynendcutf1d);toolsrelocaterelaubootnodtb。bin0x00000000startend;}{rmfubootnodtb。bin;false;}
  start(aarch64linuxgnunmgrepreldynstartcutf1d);end(aarch64linuxgnunmgrepreldynendcutf1d);toolsrelocaterelastartend
  cpubootnodtb。binuboot。bin
  aarch64linuxgnuobjdumptubootuboot。sym
  。。。。
  这里的链接器就是aarch64linuxgnuld。bfd。链接脚本就是uboot。lds,用T命令行选项来指定。输入文件就是各个目录下编译好的buildin。o以及lib库。输出文件就是uboot,通过o命令行选项来指定。
  千呼万唤始出来,我们来看看uboot。lds这个链接脚本长的帅不帅:
  linuxerlinuxervirtualmachine:workuboot2022。01vimuboot。lds
  OUTPUTFORMAT(elf64littleaarch64,elf64littleaarch64,elf64littleaarch64)
  OUTPUTARCH(aarch64)
  ENTRY(start)
  SECTIONS
  {
  。0x00000000;
  。ALIGN(8);
  。text:
  {
  (。imagecopystart)
  archarmcpuarmv8start。o(。text)
  }
  。efiruntime:{
  efiruntimestart。;
  (。text。efiruntime)
  (。rodata。efiruntime)
  (。data。efiruntime)
  efiruntimestop。;
  }
  。textrest:
  {
  (。text)
  }
  。ALIGN(8);
  。rodata:{(SORTBYALIGNMENT(SORTBYNAME(。rodata)))}
  。ALIGN(8);
  。data:{
  (。data)
  }
  。ALIGN(8);
  。。;
  。ALIGN(8);
  。ubootlist:{
  KEEP((SORT(。ubootlist)));
  }
  。ALIGN(8);
  。efiruntimerel:{
  efiruntimerelstart。;
  (。rel。efiruntime)
  (。rel。efiruntime。)
  linuxerlinuxervirtualmachine:workuboot2022。01catuboot。lds
  OUTPUTFORMAT(elf64littleaarch64,elf64littleaarch64,elf64littleaarch64)
  OUTPUTARCH(aarch64)
  ENTRY(start)
  SECTIONS
  {
  。0x00000000;
  。ALIGN(8);
  。text:
  {
  (。imagecopystart)
  archarmcpuarmv8start。o(。text)
  }
  。efiruntime:{
  efiruntimestart。;
  (。text。efiruntime)
  (。rodata。efiruntime)
  (。data。efiruntime)
  efiruntimestop。;
  }
  。textrest:
  {
  (。text)
  }
  。ALIGN(8);
  。rodata:{(SORTBYALIGNMENT(SORTBYNAME(。rodata)))}
  。ALIGN(8);
  。data:{
  (。data)
  }
  。ALIGN(8);
  。。;
  。ALIGN(8);
  。ubootlist:{
  KEEP((SORT(。ubootlist)));
  }
  。ALIGN(8);
  。efiruntimerel:{
  efiruntimerelstart。;
  (。rel。efiruntime)
  (。rel。efiruntime。)
  efiruntimerelstop。;
  }
  。ALIGN(8);
  。imagecopyend:
  {
  (。imagecopyend)
  }
  。ALIGN(8);
  。reldynstart:
  {
  (。reldynstart)
  }
  。rela。dyn:{
  (。rela)
  }
  。reldynend:
  {
  (。reldynend)
  }
  end。;
  。ALIGN(8);
  。bssstart:{
  KEEP((。bssstart));
  }
  。bss:{
  (。bss)
  。ALIGN(8);
  }
  。bssend:{
  KEEP((。bssend));
  }
  DISCARD:{(。dynsym)}
  DISCARD:{(。dynstr)}
  DISCARD:{(。dynamic)}
  DISCARD:{(。plt)}
  DISCARD:{(。interp)}
  DISCARD:{(。gnu)}
  }
  咋一看是不是挺帅的,好,那我们来认识一下这位大帅哥。
  他首先是一个文本文件,里面有一系列命令。其中SECTIONS该命令用于描述输出文件的内存布局,它后面跟着花括号中的一些列符号分配和输出段的描述。该命令的第一行设定了特殊符号。的值,。值是位置计数器。如果不用其他方式指定输出段的地址,地址从位置计数器的当前值开始计算。在SECTIONS命令的最开始,位置计数器的值是0。
  接下来定义输出段。text。冒号是必需的格式。在输出段的名称后有一个花括号,里面可以列举放入该输出段的输入段。是匹配任何文件名的通配符。表达式(。imagecopystart)表示所有输入文件中的所有。imagecopystart输入段。接下来是表达式archarmcpuarmv8start。o(。text)表示所有输入文件中的。text段的archarmcpuarmv8start。o。
  题主的关切点来了:
  UBoot执行的第一条指令用链接脚本中的术语叫做入口点。链接脚本中使用ENTRY命令来设置。参数是一个符号名称:ENTRY(symol),这里的符号就是start。这里的start是什么呢?就是0x0,查看方式如下:
  那么0x0后面放什么呢?摘取关键部分如下:
  。0x00000000;
  。ALIGN(8);
  。text:
  {
  (。imagecopystart)
  archarmcpuarmv8start。o(。text)
  }
  0x0后面放text段,text段里面先放什么呢?就是(。imagecopystart),是什么呢,还是0x0:
  下面就是主角的真面目了,就是archarmcpuarmv8start。o(。text),再揭开面纱一睹真容:
  linuxerlinuxervirtualmachine:workuboot2022。01vimarcharmcpuarmv8start。S
  。globlstart
  start:
  breset
  。align3
  。。。。
  懂了吧,现在知道为啥breset就会放在存储介质的0地址了吧,圆满解答题主的问题。
  20220403更新(没想到阅读量已快1千,感谢知友的赞同和追更):
  关于链接脚本的入口点的补充:
  前面提到,可以使用ENTRY链接脚本命令设置入口点。其实链接器支持多种方式设置入口点,会按照如下优先顺序尝试设定入口点:
  。e入口命令行选项。
  。链接脚本中的ENTRY(symbol)命令。
  。已经定义的目标特定符号的值。通常是start。
  。链接脚本段中第一个字节的地址。
  。地址0。
  光说不练假把式,实验来检验。
  实验一:屏蔽链接脚本中的ENTRY(start)和archarmcpuarmv8start。o
  重新编译后,查看映射表不再是从breset开始了,直接是armsmcccsmc函数:
  lessSystem。map
  0000000000000000Tarmsmcccsmc
  0000000000000000Tefiruntimestart
  0000000000000000Timagecopystart
  000000000000002cTarmsmccchvc
  0000000000000058Tinvokepscifn
  00000000000000d4Tefiresetsystem
  0000000000000130Wefigettime
  0000000000000138Wefisettime
  这种情况直接走顺序4,而。text段描述并没有指定具体内容,顺着肯定就是。efiruntime段的第一个字节了。
  实验二:保留ENTRY(start),并将archarmcpuarmv8start。o替换为(。text):
  这种情况扔能通过ENTRY(start)找到对应入口:
  lessSystem。map
  0000000000000000Timagecopystart
  0000000000000000Tstart
  0000000000000008TTEXTBASE
  0000000000000010Tendofs
  0000000000000018Tbssstartofs
  0000000000000020Tbssendofs
  0000000000000028treset
  000000000000002cTsavebootparamsret
  但无法直接看出是哪个。o,实际确实是archarmcpuarmv8start。o,因为只有archarmcpuarmv8start。S定义了。globlstart。
  这种情况直接走顺序3。
  实验三:删除ENTRY(start),并将archarmcpuarmv8start。o替换为(。text):
  扔能找到archarmcpuarmv8start。S作为入口:
  lessSystem。map
  0000000000000000Timagecopystart
  0000000000000000Tstart
  0000000000000008TTEXTBASE
  0000000000000010Tendofs
  0000000000000018Tbssstartofs
  0000000000000020Tbssendofs
  0000000000000028treset
  000000000000002cTsavebootparamsret
  这种情况直接走顺序4。
  剩下的实验就交给你啦。

甘肃名人潘石屹赵满堂王进喜,他们身上都有甘肃人优秀的品质潘石屹潘石屹,甘肃天水人。中国著名的房地产领域大亨,SOHO中国联合创始人,现任SOHO中国有限公司董事长。2022年4月6日,胡润研究院发布《2022胡润全球房地……适合冬天喝的萝卜汤,汤鲜味美乳白色,我家隔三差五做一锅适合冬天喝的萝卜汤,汤鲜味美乳白色,我家隔三差五做一锅虽然已经立春了,但是天气依然很冷,走在路上会不自觉地缩着脖子,揣着兜,这时候最惬意的莫过于一碗热汤了。今天就跟大家分……教你在家做蛋糕,不用抹面不用裱花,简单零失败,健康又好吃教你在家做蛋糕,不用抹面不用裱花,简单零失败,健康又好吃甜食,无论是大人,还是小孩,都对它没有抵抗力。当我们吃了高糖食物之后,会刺激分泌多巴胺,让我们觉得更加快乐。……外面卖5块钱一个的雪媚娘,自己做也简单,香甜又拉丝,2天都不外面卖5块钱一个的雪媚娘,自己做也简单,香甜又拉丝,2天都不硬转眼四月已经到了末尾,夏天就在眼前。要说最适合夏天吃的甜点,雪媚娘必须算一个。雪媚娘外皮软糯Q弹,内馅是香甜……清华女博士谈个人生育观,直言未来不会生孩子,被赞人间清醒文宋妈说育儿(原创文章,欢迎转载分享)未来我不会生孩子,更不会为孩子中断自我成长。如此惊世骇俗的话语,出自一位清华女博士之口,看似离经叛道的观点,却被网友盛赞为人间……到底怎么回事?竟然有大量老百姓退保!全民医保制度怎么了?我们都知道,平时社保大厅里人来人往,进进出出的人也不少,可是近些年,却出现了一些怪象,社保局大厅几乎挤满了人,里面热闹的跟七八点钟菜市场一样,甚至还排起了长队,关键他们是来退保……游戏玩家福音手游更流畅,游戏掌机也要来了移动游戏在整个游戏行业的占比越来越高,伴随着各种竞技赛事的推出,移动游戏迎来了快速发展的新阶段。不过,移动游戏的发展也离不开终端设备的支持,目前游戏手机已经初具规模,随着手机性……吃香椿时,到底要不要焯水?还好及时知道了,吃对了更有益健康吃香椿时,到底要不要焯水?还好及时知道了,吃对了更有益健康最近有一则新闻,说的是家住陕西西安的李先生,在自己家门口种了几棵核桃树,由于叶子跟香椿树长得非常像,周围很多人误……冰箱储存的技巧!这4类食物不要放冰箱,现在知道还不晚在吃货们的眼中,冰箱绝对是人类历史上最伟大的发明了,相信很多人都跟我以前一样使用冰箱,不管是什么食材,买回来之后都一股脑扔进冰箱,甚至有一些连包装都懒得拆开,结果就是有的食材保……我和三角梅的缘分我和三角梅的缘分始于12年前。12年前弟妹送我一棵刚扦插成活的三角梅小苗,那是我第一次见到种花。刚开始的时候并不会养护它,只知道给它浇水,以至于它只长叶不开花,后来,逐渐……人民币结算令来了!超40亿人不再使用美元结算,企业出海更有底说起世界货币,大家或许第一时间想到的是美元。7月21日,人民银行印发的《关于支持外贸新业态跨境人民币结算的通知》正式实施。《通知》主要内容包括:一是加大对外贸……小米别总熬粥了,加1块南瓜,做成好吃的面食,挑食的孩子都爱吃大家好,我是洪洋,一个喜欢在家研究各种美食的人,尤其爱分享家庭美食哦!转眼间已经到5月中旬了,孩子们的开学时间还没有定下来,孩子每天在家上网课,我们做家长的不仅仅要看好孩……
威士忌怎样区分入门与不入门?每一个人喝威士忌总是有一个契机。这种源自苏格兰的生命之水,最开始总是不那么讨喜。它风格强壮,像一个壮汉,艾雷岛的威士忌总是充满着一种医院里的消毒水味道;高地的酒香气……怎样才能学得做好凉皮?感谢邀请。个人认为做好凉皮关键在两个方面,一是蒸制凉皮的技巧,二是配制凉皮的调料。先说说凉皮的蒸制技巧。网上各种达人经验分享以及视频教案等等,合面、洗面筋、配面水啦……70岁粤菜大厨,教你正宗避风塘菜品的制作和6个诀窍,十分珍贵看了大胃王密子君近期的视频,她吃了一道避风塘鸡翅,没吃几口就说鸡翅的外壳太硬了,看她的表情口感确实一般。到底什么是避风塘?到底正宗的避风塘鸡翅怎样做才正宗?带着一系列问题,今天……菩提大院暖胃靓汤猪肚包鸡(凤凰投胎)这样做,简单又正宗猪肚包鸡是一道广东客家名菜,别名凤凰投胎,有极为好的滋补作用,胃寒者最契合吃猪肚包鸡,加之胡椒、小北芪、党参,白果,枸杞等药材,有很好的滋补、驱风、驱寒的感召,肾亏的人吃了减少……线上平台线下渠道,VR营销推广渠道大盘点随着各方面技术的成熟,VR内容越来越多地出现在了生活的各个角落,凭借其身临其境的3D沉浸式体验,惊艳了不少消费者,为线上平台、实体店铺导流变现实现了极大的价值,成为了当下商企最……最全野菜图集,56种野菜大图鉴,教你认识不同的野菜和吃法最全野菜图集,56种野菜大图鉴,教你认识不同的野菜和吃法。夏天已经过去,秋天到了。秋天是收获的季节。秋季的野菜也有很多品种,今天通过我的收集有56种,下面我来分享这56种照片和……五花肉整块放入锅中,不加水不加油,30分钟后出锅,连渣都不剩五花肉整块放入锅中,不加水不加油,30分钟后出锅,连渣都不剩五花肉虽然很肥,但是人们都喜欢买这个部位,好的五花肉是肥瘦相间的,拿来做成红烧肉非常美味。红烧肉是五花肉最常见……她帮我写了第一篇小作文最近以ChatGPT为代表的人工智能大火。今天看了一下,关注的几个人工智能股票全部涨停了(仅是案例举例,不作为投资建议,市场有风险,投资需谨慎)。公布使用ChatG……做辣椒油时,记住放入这3种配料,方法也是简单,试着在家做一做做辣椒油时,记住放入这3种配料,方法也是简单,试着在家做一做,相信很多人现在也是非常喜欢吃辣椒的,还有一些人就是无辣不欢,并且就是到了冬天之后大家更喜欢吃一些辣椒了,因为吃过之……宁宁姐私房菜三个秘诀,做出喷香下饭的芹菜炒肉末!芹菜炒肉末虽然是道家常菜,但想让芹菜清脆可口、肉末干香诱人,可没你想象的这么容易!现在宁宁姐就告诉你做好这道下饭菜的3个秘诀,赶快学起来!芹菜炒肉末牛肉、香干、香芹……不管炒什么肉,别傻傻的直接下油锅,多加这3步,炒肉入味吃着嫩大家好,欢迎大家收看本期的生活侣,每天为大家分享实用有趣瞎编的小窍门!平常家里面都会买一些肉类来吃,但是在炒肉的时候一定要记住这三点,炒出来的肉就会非常鲜嫩爽滑,快来跟着小编一……正宗杂酱面的杂酱怎么调制?正宗的老北京炸酱面。讲究用面酱和黄酱1:1。面酱的滋味甜,黄酱的回甘好。把黄酱用酱油和干香菇水泄开,在和面酱活匀拌开,到此,炸酱面的酱算是准备得了。接下来,就是炸酱……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网