<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>MicroOrangeStudio</title><description>Blog</description><link>https://blog.microorange.online/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.11.0</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年6月14日 16:25:12</lastBuildDate><item><title>低卡也可以好吃吗？黑椒/豆瓣肉酱拌面/拌粉配方设计，300g · 470kcal/400kcal</title><link>https://blog.microorange.online/posts/noodle_sauce_400k_260611/noodle_sauce/</link><guid isPermaLink="true">https://blog.microorange.online/posts/noodle_sauce_400k_260611/noodle_sauce/</guid><description>“减脂餐必须难吃”，这几乎是减脂工业的共识，低卡与好吃的冲突，是物理约束吗，“为普通人所设计”这一说法的边界在哪里？我尝试设计了一种新的拌面，拌粉配方，一锅备餐14份，餐前准备10分钟，无需洗碗，也许有助于理解这一问题。</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;绿的，黄的，紫的，白的&lt;a href=&quot;#绿的黄的紫的白的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;让我们想象一个场景，今天你的朋友让你回寝室的时候给他带一顿减脂餐，你会去买什么？我想大部分人和我一样，去食堂那个专门卖健康减脂食品的档口，花上十几块钱点一封经典的减脂套装，一个圆形的，四分格的餐盘，一块撒了一点黑胡椒的，水煮的鸡胸肉，一小块紫薯，一点虾，青绿色的西兰花或者青绿色的芦笋。这几乎构成了我们对正经减脂餐的全部想象。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;养眼的一款减脂餐&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;683&quot; src=&quot;/_astro/traditional_food.DOVhVppn_Z241UCd.webp&quot; srcset=&quot;/_astro/traditional_food.DOVhVppn_Z1SFNr9.webp 640w, /_astro/traditional_food.DOVhVppn_1SjkBY.webp 750w, /_astro/traditional_food.DOVhVppn_ZLCaYH.webp 828w, /_astro/traditional_food.DOVhVppn_Z241UCd.webp 1024w&quot; /&gt;&lt;figcaption&gt;养眼的一款减脂餐&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果打开购物平台，搜索减脂，更多琳琅满目，也更多陷阱的产品跳出来，有预调味和煮的鸡胸，鸡腿，用鸡胸肉做的香肠，10块一盒的冲泡意面，说实话他们算蛮有良心和蛮好吃的。因为还有一点味道没有的牛肉。好喝的代餐粉，但是不顶饿。捏着鼻子才能喝下去的代餐粉，依旧不顶饿。健康的油，热量爆炸。浓重碱味的魔芋面，还有“放纵日”一天总热量预算400大卡的饿成干套装。&lt;/p&gt;&lt;p&gt;再看看网络菜谱呢，有“体现蔬菜本味”的焖锅（对于爱吃蔬菜的人也许不错），除了酸没有任何味道的酸奶，放一点沙拉酱就热量爆炸，不放沙拉酱又纯吃草的沙拉，连锅带盘子一起扔掉的羽衣甘蓝，还有（让不爱吃胡萝卜的人）吃彩椒的美丽食物。&lt;/p&gt;&lt;p&gt;再看看健身减脂圈，好吧，我也不掌握那些把健身当作主要爱好的能力和各种复杂规则，他们太过专业，大部分人难以使用。&lt;/p&gt;&lt;p&gt;“减脂餐必须难吃，至少要忍受很多东西”，这一点在所有的案例中，几乎无一例外，我相信绝大多数人都不会在不减脂的状态下，买一根味同嚼蜡的香肠，或者是四格的减脂餐套装。至于这个“减脂餐必须难吃”公理，也看起来很显而易见的，减脂，要减掉油，减掉糖，甚至减掉碳水，食物当然会变得不好吃。&lt;/p&gt;&lt;p&gt;有一天，我给我的挑食小猫煮鸡胸肉吃，煮的过程比减脂餐还随意，就是扔水里硬煮。白煮鸡胸肉的味道，尝过的人应该记得，那不是一块多汁的，焦香软嫩的肉，而是一块白色的东西，摆在白色的盘子里，撕开之后是粗大的肌纤维，淡腥气，吃起来有一种沙沙的感觉。&lt;/p&gt;&lt;p&gt;小猫喜欢这种腥味，人类不喜欢。那块鸡胸肉最后我的小猫没吃，纯挑食，被我蘸酱油吃掉了。我早已经放弃减脂了，就这样吃了一块白煮鸡胸肉，我们知道酱油的热量，大约是50大卡每百克，尽管蘸一块鸡胸肉所需要的酱油中钠含量已经超过了一餐合理值，尽管吃了不久就饿了，尽管根本没有纤维。但是这让我不禁在想，为什么减脂界的标杆——水煮鸡胸，配一个酱油，味道就能达到还可以接受的程度，而热量没有增加太多。&lt;/p&gt;&lt;p&gt;从酱油的成分上来说，这是比较好理解的，鲜味，香气，盐，颜色，这些东西带来了真实的美味组件，却没有增加太多热量。这不仅让人好奇，“减脂餐必须难吃”公理，他是由物理决定的约束吗，如果不是，又能够解耦到什么程度，我尝试设计一种具体的菜谱来探索这一边界，这就是这个菜谱的来源。&lt;/p&gt;&lt;p&gt;P.S.这不是一个系统性的研究，而是尝试制作一个反例的揭示这一问题过程，所以是不严谨的，特别是没法显著的对比/消融，因为其结果依赖我的口感&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;美味 vs 热量&lt;a href=&quot;#美味-vs-热量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一道菜为什么好吃？可能是口味，甜的，咸的，酸的，辣的，鲜的，或者他们的混合。可能是香的，油脂香，孜然的辛香，果木炭火的熏香，美拉德反应的复杂挥发性物质，或者他们的混合。可能是口感，脆的，软的，有嚼劲的，润的。&lt;/p&gt;&lt;p&gt;一道菜为什么发胖？油脂，碳水，蛋白。油脂最危险。&lt;/p&gt;&lt;p&gt;第一个观察是，风味的构成和热量的构成并不是一模一样的，油脂可能高温下促进脆壳的形成，可能溶出香味物质，可能提供油脂香，可能让菜变得更润，但油不直接导致好吃，人们不爱吃一个油温不够的油腻炸鸡翅，油更多了，却没有变得更好吃。酱油蘸鸡胸肉，没有增加油，却更好吃了。&lt;/p&gt;&lt;p&gt;这一观察引出了第一个设计方向：&lt;strong&gt;权衡美味因素和热量因素，尝试使用更少的热量因素实现美味因素。使用多种美味因素混合，以减小单一因素损失的影响&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;第二个观察是，酱油在鸡胸肉丝的表面，接触味蕾和挥发的只是表面层，不需要为整个鸡胸肉填入均匀的风味物质。奶茶的糖位于整杯奶茶，实际起到味觉作用的只有与味蕾接触的一层，其他的都是“额外的热量”。&lt;/p&gt;&lt;p&gt;这引出了第二个设计方向，&lt;strong&gt;不需要均匀的美味，只需要可感知的美味&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;酱拌面，就决定是你了&lt;a href=&quot;#酱拌面就决定是你了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;从头设计一个干净的，验证解耦假设的例子容易，但实际上我们需要的是一个我们觉得它真的可以办到的例子。要找到一个“我也能用”的反例，实际要做的事情是在：美味，制作代价，使用代价，热量，重量，代谢路径，营养素比例，这几件事间做权衡。我决定在某一种现成的食物上，使用这两条设计方向加以改造。&lt;/p&gt;&lt;p&gt;至于为什么是酱拌面，因为我想这个问题的那天中午吃的是某牛肉面家的牛肉酱拌面。我发现这东西，甚至很多中餐本身就有进行这两点改造的潜质，它使用混合风味，同时酱汁只裹在面的表面！如果要我改造的是蛋糕（必须使用精粉），薯片（依赖油炸形成多孔结构），火腿肠（整个食品是均匀调味的），反而带来很多额外的麻烦。&lt;/p&gt;&lt;p&gt;我们先来分析我手里这碗牛肉酱拌面，大约150g的酱，上面飘着一层油，由于我们不知道它的具体配方，可以从老百京炸酱类猜测一下它的用油目的：&lt;strong&gt;首先肯定要在炸肉时防粘锅，同时高油环境可以提供局部高温，为肉的美拉德反应提供环境，然后是溶解和激发香气，然后是用来增稠，增加裹面能力，最后是其本身的油脂香&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;再看它的口味，豆瓣酱的咸，甜面酱的甜，发酵产物的鲜。油脂和美拉德反应，发酵产物共同的香气，有微焦的肉，酱的润，面的嚼劲混合在一起。这使得单独影响某一因素近乎不可能，但同时也为美味因素的调整带来了相当大的容错空间，不至于因为某种因素的去除而全面味道崩溃。&lt;/p&gt;&lt;p&gt;如果我们直接降低油（包括肉的肥瘦比）用量，与用油目的相关的种种美味因素就会逐一崩溃。还记得第一设计方向吗：“权衡美味因素和热量因素，尝试使用更少的热量因素实现美味因素。”，我们来试试看：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;防粘锅&lt;/strong&gt;：可以改用不粘锅+少量喷油，而不是直接油炸，同时不额外加过多的油，而是让肉末中的油炒制渗出润滑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;美拉德反应&lt;/strong&gt;：少量油+煎到焦化，也能部分实现，通过补足糖，本方案使用预炒洋葱，洋葱本身发生的美拉德反应和渗出汁水和肉作用的美拉德反应补足&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;溶解和激发香气&lt;/strong&gt;：酱可以在炖煮前，混入微焦的肉丁中混炒激发香气。香料可以在炒肉前炒制激发香气。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;额外的香气补偿&lt;/strong&gt;：可以添加别的香味物质，甚至改变酱的主味道，例如使用味道更淡的发酵酱基+辣椒实现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增稠&lt;/strong&gt;：可以勾芡或使用其他增稠手段，至于这个酱在使用上的一些其他问题，后面另说。同时中式肉燥酱本身对于增稠的需求没有西式肉酱高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;油脂香&lt;/strong&gt;：这个没办法，因此需要保留一些油脂用于此目的。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;而糖（甜面酱）的使用，放弃甜面酱风味后，几乎只是提供粘度和甜味，此方案直接用阿洛酮糖代替。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;！！！菜谱 ！！！&lt;a href=&quot;#菜谱-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果想要直接制作一个尝一尝，从这里开始读也是可以的。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;孜然豆瓣味拌面酱&lt;a href=&quot;#孜然豆瓣味拌面酱&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;准备材料&lt;/strong&gt;：油2g，洋葱50g，猪肉馅（肥瘦1：9，本文使用中粮猪肉）250g，干辣椒调味品（本文使用七婆/单山蘸水）10g，孜然粉2g，豆瓣酱（本文使用欣和葱）50g，阿洛酮糖15g，生抽15g，鸡精1g，黄原胶0.6g（实在不想加也行），玉米淀粉3g，料酒&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;准备一不粘锅，喷入2g油，下50g洋葱，小火炒8-10分钟，至洋葱炒软微焦。&lt;/li&gt;
&lt;li&gt;下250g猪肉馅与洋葱混炒，炒到微微焦，呈现微棕色。&lt;/li&gt;
&lt;li&gt;倒入干辣椒调味品10g，孜然粉2g继续大火炒制。&lt;/li&gt;
&lt;li&gt;倒入豆瓣酱，大火炒制至肉馅完全裹满。这几步要不断翻炒，否则会粘锅。&lt;/li&gt;
&lt;li&gt;倒入约300g清水，倒入生抽15g，鸡精1g，料酒一勺。&lt;/li&gt;
&lt;li&gt;沸腾状态下，干粉混合阿洛酮糖15g和黄原胶0.6g，倒入锅中。&lt;/li&gt;
&lt;li&gt;待小火煮到肉露出汤汁，玉米淀粉3g加少量水分散后倒入，搅拌。&lt;/li&gt;
&lt;li&gt;继续收汁，直至酱汁明显挂锅铲。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;注意事项&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;猪肉的比例必须使用准确比例，而不是普通肉馅，否则热量将严重不准确。&lt;/li&gt;
&lt;li&gt;油量必须使用定量喷油壶或称量，否则热量将严重不准确。&lt;/li&gt;
&lt;li&gt;洋葱需要炒焦一点，脆洋葱混入酱中可能导致口感下降。&lt;/li&gt;
&lt;li&gt;肉炒的微焦，香气会更好一点。&lt;/li&gt;
&lt;li&gt;几个翻炒步骤需要注意，有可能粘锅。同时大火炒，激发香气。&lt;/li&gt;
&lt;li&gt;黄原胶在不冷冻储存下不加也行，如果加的话要和阿洛酮糖先干粉混合再加入锅中。&lt;/li&gt;
&lt;li&gt;玉米淀粉最好用玉米淀粉。最好不要和阿洛酮糖那步一起加，而是到收汁近乎结束再加，否则增稠作用可能减弱。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;分装&lt;/strong&gt;：每次4x批量（也就是猪肉1kg）制作，分装14份，PP盒（200ML）冷冻&lt;/p&gt;&lt;p&gt;&lt;strong&gt;热量&lt;/strong&gt;：计算过程见附录.A,204kcal/袋，约120g。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;黑椒猪肉味拌面酱&lt;a href=&quot;#黑椒猪肉味拌面酱&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;准备材料&lt;/strong&gt;：油2g，洋葱50g，猪肉馅（肥瘦1：9，本文使用中粮猪肉）250g，粗粒黑胡椒8g，黑胡椒粉2g，阿洛酮糖15g，生抽15g，鸡精1g（或伍斯特酱10g），盐1g，黄原胶0.6g（实在不想加也行），玉米淀粉3g，料酒&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;准备一不粘锅，喷入2g油，下50g洋葱，小火炒8-10分钟，至洋葱炒软微焦。&lt;/li&gt;
&lt;li&gt;下250g猪肉馅与洋葱混炒，炒到微微焦，呈现微棕色。&lt;/li&gt;
&lt;li&gt;下粗粒黑胡椒8g继续大火炒制。这几步要不断翻炒，否则会粘锅。&lt;/li&gt;
&lt;li&gt;倒入约300g清水，倒入生抽15g，鸡精1g，盐1g，黑胡椒粉2g，料酒一勺。&lt;/li&gt;
&lt;li&gt;沸腾状态下，干粉混合阿洛酮糖15g和黄原胶0.6g，倒入锅中。&lt;/li&gt;
&lt;li&gt;待小火煮到肉露出汤汁，玉米淀粉3g加少量水分散后倒入，搅拌。&lt;/li&gt;
&lt;li&gt;继续收汁，直至酱汁明显挂锅铲。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;注意事项&lt;/strong&gt;：完全同上&lt;/p&gt;&lt;p&gt;&lt;strong&gt;分装&lt;/strong&gt;：每次4x批量（也就是猪肉1kg）制作，分装13份，PP盒（200ML）冷冻&lt;/p&gt;&lt;p&gt;&lt;strong&gt;热量&lt;/strong&gt;：计算过程见附录.A,191kcal/袋，约110g。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;面或者粉&lt;a href=&quot;#面或者粉&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;典型款&lt;/strong&gt;：40g干粉条（粗），40g干意面，270kcal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更少的热量&lt;/strong&gt;：55g干粉条，190kcal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;经典意面&lt;/strong&gt;：90g干意面，350kcal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;经典火锅面&lt;/strong&gt;：100g干火锅面（非油炸），310kcal&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;粉条需煮15分钟，意面煮8分钟（可以在粉条煮一半下面）&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;热量与美味之外，我们还需要关注什么&lt;a href=&quot;#热量与美味之外我们还需要关注什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们常常选择外卖，很大程度上是因为它不用煮，不用洗碗，不用等待太久就能吃到一顿香喷喷的饭。这让我们想到，一个好用的食谱的设计并不仅仅有关于热量与美味，&lt;strong&gt;备菜需要多久，制作起来需要多久，吃一顿需要多久，要洗多少碗，饱腹感如何，饱腹持续时间，热效应，营养素计算，弥漫的香气，颜色，对美味的记忆，乃至最后产生垃圾的体积&lt;/strong&gt;，这些东西共同构成了一道菜的使用场景。&lt;/p&gt;&lt;p&gt;如果热量可以与美味部分解耦，这些“减脂餐不方便因素”因素能否同时被加以考量？&lt;/p&gt;&lt;section&gt;&lt;h3&gt;制作的考虑&lt;a href=&quot;#制作的考虑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;洗菜，切菜，煮，洗盘子，洗锅，这些恰恰是一个食谱难以被常常使用的原因。这一食谱通过某种程度上的备餐解决这一问题。&lt;/p&gt;&lt;p&gt;此酱使用的大多材料都是预制品，除洋葱可能需要切一下之外，其他的都可以使用购买的绞肉和购买的调味品。制作过程中仅需要一个调汁碗，用水冲即可洗净，以及刷一个锅。&lt;/p&gt;&lt;p&gt;制作过程可以在普通的家庭炒锅中批量生产此酱，推荐&lt;strong&gt;一次投料四份&lt;/strong&gt;，作为一个批量，其制作过程与一份投料几乎相同，下猪肉馅的过程可以先下一份250g，炒焦后在加另外三份，以便更好的炒焦。两个配方都是如此，一次投料四份，最终可获得&lt;strong&gt;14份酱料，每份约110g&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;储存，食用的考虑&lt;a href=&quot;#储存食用的考虑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;制作过程可以在周末完成，然而吃面的过程发生在一个疲倦的周三晚上，如何很快就能吃到，如何吃完不用洗碗，这是决定这个食谱会不会实际被使用的关键。&lt;/p&gt;&lt;p&gt;批量制作后，分装入&lt;strong&gt;14个，200ML，PP盒中&lt;/strong&gt;。盖紧盖子放入冰箱冷冻保存，在冷冻状态下可以极大延长保质期。使用PP盒的目的为适合加热，同时不需要清洗容器和处理垃圾。分装为了防止反复冻融导致的香气损失，每次可以只取一盒。使用黄原胶的目的是增加冻融稳定性（尽管没有做对照实验）。&lt;/p&gt;&lt;p&gt;冷冻带来了额外的复热问题，一种方式是使用热水解冻和加热，相对稳定但无法很好的重新激发香气。另一种方式是使用微波炉，由于冰和液态水的微波吸收率差异极大，复热过程依旧存在外面焦了里面还是冰的问题，&lt;strong&gt;建议先解冻档三分钟，拿出来搅拌一遍酱，再中火一分钟，使用微波炉加热后能很好的激发香气&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;煮面后使用锡纸（或PP盒）盛放，过凉水，沥水，加入酱拌。吃完后直接把小盒子放在大盒子里扔掉，如果不是每吃一次都扔，盒子也可以堆叠。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;日常每餐的准备时间约为10-20分钟，热酱和煮面可以同时进行，可以一边煮一遍刷视频，冰箱里有14盒酱，十几分钟就能吃上一顿像样的面，把锅里的水倒掉就行，不需要洗任何东西。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;饱腹感，营养素的权衡&lt;a href=&quot;#饱腹感营养素的权衡&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一问题，在这里是最难权衡的，意面本身的热量已经算高，面食本身也无法做到过高的蛋白质比例。&lt;/p&gt;&lt;p&gt;使用意面和粉，是因这两个的GI较低，相对来说饱腹时间更久，以及一些中低GI的其他好处。&lt;/p&gt;&lt;p&gt;使用他们的组合，是因为意面（杜兰小麦）的煮后吸水实测重量只有2倍左右，而粉接近3倍，在同等重量和体积提供更少热量。但是粉的口感不够好，没有面的韧感，而是一种偏脆的感觉，在更多次的食用下会逐渐产生口感差异。另外注意这个粉丝不要使用龙口粉丝，面积过大，110g酱不够拌。&lt;/p&gt;&lt;p&gt;魔芋粉条作为几乎无热量的，碱水交联后提供纤维的面，在减脂圈很常见，此配方不使用魔芋粉条的原因，除了无法干品保存之外，碱味的存在，口感与面的差异也是难以处理的问题。或许可以与面混合使用，但不推荐把此配方换成只使用魔芋粉条的版本。&lt;/p&gt;&lt;p&gt;1：9猪肉的使用，而不是换成鸡胸肉或纯瘦肉酱，是因少量肥肉在炒制时起到润滑作用，以及提供真实的猪油香气，进一步换掉会减少香气。&lt;/p&gt;&lt;p&gt;此配方设计为肉燥酱（肉比例70%左右），而不是酱汁更多的肉酱（肉比例40%或以下），是因过多的酱汁需要更多增稠，以及更多的风味，我实测后发现在没有油，又使用不太复杂的调料和制作流程时，做的太稀会有更重的“调料味”，同时使制作过程的容错率更低。而且更大的肉比例有利于提供蛋白，通过胆囊收缩素途径抗饿。&lt;/p&gt;&lt;p&gt;至于含碳水，蛋白质不是特别高等等宏量营养素问题，这一配方并不是用于某种特定饮食，而是作为一顿普通的饭设计的。但是纤维确实不足，建议配一点绿叶菜，或者配草莓吃。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;大众减脂工业——究竟该为谁服务&lt;a href=&quot;#大众减脂工业究竟该为谁服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在做这个配方的过程中，我看了许多减脂菜谱与减脂食品。&lt;strong&gt;它们的默认目标，是一个大多数情况下不存在的人&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;减脂和健身是这个人的重要爱好，这个人每天早起打卡，把鸡胸肉的克数记在备忘录里，在饥饿和目标之间永远选择目标，没有坏心情，没有社交压力，没有一个会在周五晚上发消息说”出来吃烧烤吧”的朋友，他用杯子装蛋白粉，在健身房撸铁，分享自己的腹肌照片。这个人是减脂工业的理论用户，他的存在支撑了所有关于”坚持”和”自律”的内容。现实中，大多数减肥的人不是这样的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;真正想减肥的人大多是什么样的？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;是那个机械工程师，下午三点还在调一个液压系统的参数，脑子里装着公差和压力曲线，减脂餐这件事完全没有在他的认知带宽里占据任何位置。他想着晚上去哪吃，不是今晚的宏量营养素怎么分配。他知道自己应该少吃，但”应该”和工位上盯了八小时CAD图纸之后的状态之间，有一段巨大的距离。&lt;/p&gt;&lt;p&gt;是那个吉他手，他生命里最有活力的时刻是他在琴弦上找到一个声音的时刻。他理解什么是好的——好的音色，好的和声，好的共鸣。这种对好的感知能力，让他在食物上也有相似的敏感度。让他吃难吃的减脂餐，等于让他拿一把音调不准的吉他练习。不是做不到，是每一次都在消耗一些什么。他减肥，不是因为他不喜欢自己，而是因为他喜欢自己到一定程度，希望更好。但他不会为此放弃好吃的东西，因为对他来说，好吃是生活里一个真实的价值，不是需要被克服的软弱。&lt;/p&gt;&lt;p&gt;被拒绝的人，是最脆弱也最常见的一种。他鼓起勇气说了，然后得到了一个温柔但清晰的”不”。接下来的那个下午，他可能坐在电脑前什么都没做，或者骑车在路上绕了很远的圈。这个时候，减脂这件事的优先级在哪里？它不在任何地方。他可能会叫一份炸鸡，因为炸鸡不拒绝他。这不是意志力的问题，这是人在低谷时的正常反应——你不会在最脆弱的时候再给自己加一个需要克服的任务。&lt;/p&gt;&lt;p&gt;减脂工业对这个人没有设计。它对他说的是”坚持”，但”坚持”这个词在他今天的状态里是空的。他需要的不是一个更高的要求，而是一个门槛低到他在这种状态下也能跨过去的选项——不需要思考，不需要准备，拿出来就能吃，而且能让他在吃的这十分钟里稍微好一点点。&lt;/p&gt;&lt;p&gt;幸福肥的人，是另一种。他刚刚开始谈恋爱，生活在一种稍微失重的状态里。他们去了很多餐厅，因为吃饭是约会最自然的载体。他喝了很多啤酒，因为气氛需要啤酒。他睡得不规律，因为聊天聊到很晚。他增加的每一克，都附带着一段具体的记忆。&lt;/p&gt;&lt;p&gt;让他在这个阶段严格控制饮食，等于让他把恋爱的感觉过滤掉一部分。他不会这么做，也不应该这么做。但他心里知道这样下去会胖，这个知道让他有轻微的焦虑，不足以让他改变行为，却足以在镜子前产生一闪而过的不适。&lt;/p&gt;&lt;p&gt;这种人需要的不是一个替代恋爱饮食的方案，而是一个在恋爱期间的其他那些普通午餐和独自吃饭的晚上，不费力气就能选择的好选项。不是零热量，是足够好吃、足够方便，让他在不是约会的那些时候自然而然地选择它。&lt;/p&gt;&lt;p&gt;自卑的人，有一种特殊的困难。他想减肥，部分原因是他对自己的身体有负面的感知。但减脂的整个过程，是一个持续提醒他”你现在的状态需要被改变”的过程。每一顿难吃的鸡胸肉都在说：你还没到可以吃好东西的地步。每一次没有坚持下去，都在叠加”我连这个都做不到”的感觉。&lt;/p&gt;&lt;p&gt;减脂工业的逻辑里，成功的奖励是未来的身体，当下是代价。对自卑的人来说，这个逻辑格外残忍——他已经觉得自己不够好，而减脂还要求他在证明自己足够好之前，继续接受惩罚式的食物。&lt;/p&gt;&lt;p&gt;他需要的，是一个让他在当下就能有正常的进食体验的选项。不是奖励，不是特殊待遇，就是正常的、他值得拥有的一顿饭。好吃的低卡食物，在他这里不只是一个便利，而是一个与他对自己的态度有关的东西。&lt;/p&gt;&lt;p&gt;打了一天游戏的人，进入了某种心流状态的反面——不是专注，是麻木。他知道自己该吃饭，但决策能力在下午四点就耗尽了。他叫外卖不是因为饿，是因为叫外卖只需要点几下，而其他任何选项都需要更多的思考。&lt;/p&gt;&lt;p&gt;对他来说，减脂从来不是优先级，但如果有一个选项和叫外卖的决策成本一样低，他有可能选它。不是因为自律，是因为它足够省事。冰箱里有一袋现成的酱包，一边刷手机，十几分钟分钟能出锅，不用思考，吃完连碗都不用洗——这个方案和他的认知状态是匹配的，不要求他在耗尽状态下动用任何额外资源。&lt;/p&gt;&lt;p&gt;被邀请去吃烧烤的人，面对的是社交和饮食计划之间永恒的冲突。减脂内容给他的答案通常是两种：要么拒绝朋友（自律优先），要么”享受今晚，明天补回来”（欺骗餐逻辑）。这两个答案都没有解决真正的问题。&lt;/p&gt;&lt;p&gt;真正的问题是：他不需要、也不应该在去吃烧烤这件事上有任何负担。烧烤是正常的社交，是生活的组成部分，不是需要被”补偿”的罪行。真正有价值的饮食设计，不是帮他抵制烧烤，而是让他在烧烤之外的那些普通时刻——周一到周四的午饭，不饿不特别想吃的那些晚餐——自然地选择一个不坏的选项，不需要意志力，不需要提前计划，打开冰箱就有。&lt;/p&gt;&lt;p&gt;这些人加在一起，才是真实的”想减肥的人”的分布。他们不是在减脂，他们是在过生活，而减肥只是生活里一个权重不太高的意愿，随时会被更紧迫的情绪、社交、疲劳和欲望覆盖。&lt;/p&gt;&lt;p&gt;那些紫色，绿色，白色的标准减脂餐，单论热量他们不需质疑，但是对于许多“想减肥的人”，那是一种持续数个月，也许是数年的，没有被写明的惩罚。是周三晚上精疲力尽，依然需要忍受切菜洗碗的麻烦。是朋友聚餐后，或者某个深夜饿到不行点了一份炸鸡后，第二天因为热量超标的自责。有人在这个过程中放弃了——他们没有被统计，有人减重10斤后反弹——他们无法忍受这种折磨。&lt;strong&gt;减脂工业看不见失败的案例。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;减脂工业为它的极少数用户设计了一整套完美的系统，然后指责真实的人”不够自律”。真实的情况是，这个系统从来就不是为真实的人设计的。&lt;/p&gt;&lt;p&gt;一个为真实的人设计的方案，前提不是”你已经处于减脂状态”，而是**“你是一个有完整生活的人，减肥只是你偶尔想起来的一个愿望”**。它需要在你疲惫的时候工作，在你难过的时候工作，在你打了一天游戏的时候工作，在你昨晚刚刚吃了烧烤之后的那个午饭时间工作。&lt;strong&gt;它不能依赖你的意志力，因为意志力总是不够用的，而且应该留给更重要的事。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个配方不需要成为完美的减脂增肌餐，不需要打入健身圈。它只需要足够好吃，足够方便，让你在它和外卖之间，有理由选择它，不是因为你在减脂，而是因为它就是一顿好饭。&lt;/p&gt;&lt;p&gt;也许不是每个配方都能进行类似这样的改造，也许这个配方还有很多不完美之处。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;但减脂的常态本就是关于普通人，普通愿望的故事。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;附录.A&lt;a href=&quot;#附录a&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;孜然豆瓣味拌面酱原料热量明细（4倍配方）&lt;a href=&quot;#孜然豆瓣味拌面酱原料热量明细4倍配方&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;













































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;原料&lt;/th&gt;&lt;th&gt;单份用量&lt;/th&gt;&lt;th&gt;×4用量&lt;/th&gt;&lt;th&gt;热量密度&lt;/th&gt;&lt;th&gt;单份热量 (kcal)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;植物油&lt;/td&gt;&lt;td&gt;2g&lt;/td&gt;&lt;td&gt;8g&lt;/td&gt;&lt;td&gt;884 kcal/100g&lt;/td&gt;&lt;td&gt;17.68&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;洋葱&lt;/td&gt;&lt;td&gt;50g&lt;/td&gt;&lt;td&gt;200g&lt;/td&gt;&lt;td&gt;40 kcal/100g&lt;/td&gt;&lt;td&gt;20.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;猪肉馅 (1:9)&lt;/td&gt;&lt;td&gt;250g&lt;/td&gt;&lt;td&gt;1000g&lt;/td&gt;&lt;td&gt;210 kcal/100g&lt;/td&gt;&lt;td&gt;525.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;干辣椒面&lt;/td&gt;&lt;td&gt;10g&lt;/td&gt;&lt;td&gt;40g&lt;/td&gt;&lt;td&gt;413 kcal/100g&lt;/td&gt;&lt;td&gt;41.30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;孜然粉&lt;/td&gt;&lt;td&gt;2g&lt;/td&gt;&lt;td&gt;8g&lt;/td&gt;&lt;td&gt;375 kcal/100g&lt;/td&gt;&lt;td&gt;7.50&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;豆瓣酱&lt;/td&gt;&lt;td&gt;50g&lt;/td&gt;&lt;td&gt;200g&lt;/td&gt;&lt;td&gt;139 kcal/100g&lt;/td&gt;&lt;td&gt;69.50&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;阿洛酮糖&lt;/td&gt;&lt;td&gt;15g&lt;/td&gt;&lt;td&gt;60g&lt;/td&gt;&lt;td&gt;≈0.2 kcal/g&lt;/td&gt;&lt;td&gt;3.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;生抽&lt;/td&gt;&lt;td&gt;15g&lt;/td&gt;&lt;td&gt;60g&lt;/td&gt;&lt;td&gt;60 kcal/100g&lt;/td&gt;&lt;td&gt;9.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;鸡精&lt;/td&gt;&lt;td&gt;1g&lt;/td&gt;&lt;td&gt;4g&lt;/td&gt;&lt;td&gt;≈200 kcal/100g&lt;/td&gt;&lt;td&gt;2.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;黄原胶&lt;/td&gt;&lt;td&gt;0.6g&lt;/td&gt;&lt;td&gt;2.4g&lt;/td&gt;&lt;td&gt;膳食纤维 ≈0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;玉米淀粉&lt;/td&gt;&lt;td&gt;3g&lt;/td&gt;&lt;td&gt;12g&lt;/td&gt;&lt;td&gt;346 kcal/100g&lt;/td&gt;&lt;td&gt;10.38&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;料酒 (1勺≈15g)&lt;/td&gt;&lt;td&gt;15g&lt;/td&gt;&lt;td&gt;60g&lt;/td&gt;&lt;td&gt;≈50 kcal/100g&lt;/td&gt;&lt;td&gt;7.50&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;单份合计&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;413.6g&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1654.4g&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;&lt;strong&gt;712.86&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;4倍配方合计&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2851.4 kcal&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;分装结果（4倍配方）（14袋 × ~118g）&lt;a href=&quot;#分装结果4倍配方14袋--118g&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;数值&lt;/th&gt;&lt;th&gt;计算&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;每袋重量&lt;/td&gt;&lt;td&gt;&lt;strong&gt;≈118g&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;根据收汁不同，此为估计值，以每袋热量为准&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;每袋热量&lt;/td&gt;&lt;td&gt;&lt;strong&gt;≈204 kcal&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2851.4 ÷ 14&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;每100g 热量&lt;/td&gt;&lt;td&gt;&lt;strong&gt;≈172 kcal&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;203.7 ÷ 118.2 × 100&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;黑胡椒猪肉配方原料热量明细（4倍配方）&lt;a href=&quot;#黑胡椒猪肉配方原料热量明细4倍配方&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;













































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;原料&lt;/th&gt;&lt;th&gt;单份用量&lt;/th&gt;&lt;th&gt;×4用量&lt;/th&gt;&lt;th&gt;热量密度&lt;/th&gt;&lt;th&gt;热量 (kcal)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;植物油&lt;/td&gt;&lt;td&gt;2g&lt;/td&gt;&lt;td&gt;8g&lt;/td&gt;&lt;td&gt;884 kcal/100g&lt;/td&gt;&lt;td&gt;17.68&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;洋葱&lt;/td&gt;&lt;td&gt;50g&lt;/td&gt;&lt;td&gt;200g&lt;/td&gt;&lt;td&gt;40 kcal/100g&lt;/td&gt;&lt;td&gt;20.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;猪肉馅 (1:9)&lt;/td&gt;&lt;td&gt;250g&lt;/td&gt;&lt;td&gt;1000g&lt;/td&gt;&lt;td&gt;210 kcal/100g&lt;/td&gt;&lt;td&gt;525.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;粗粒黑胡椒&lt;/td&gt;&lt;td&gt;8g&lt;/td&gt;&lt;td&gt;32g&lt;/td&gt;&lt;td&gt;251 kcal/100g&lt;/td&gt;&lt;td&gt;20.08&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;黑胡椒粉&lt;/td&gt;&lt;td&gt;2g&lt;/td&gt;&lt;td&gt;8g&lt;/td&gt;&lt;td&gt;251 kcal/100g&lt;/td&gt;&lt;td&gt;5.02&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;阿洛酮糖&lt;/td&gt;&lt;td&gt;15g&lt;/td&gt;&lt;td&gt;60g&lt;/td&gt;&lt;td&gt;≈0.2 kcal/g&lt;/td&gt;&lt;td&gt;3.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;生抽&lt;/td&gt;&lt;td&gt;15g&lt;/td&gt;&lt;td&gt;60g&lt;/td&gt;&lt;td&gt;60 kcal/100g&lt;/td&gt;&lt;td&gt;9.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;鸡精&lt;/td&gt;&lt;td&gt;1g&lt;/td&gt;&lt;td&gt;4g&lt;/td&gt;&lt;td&gt;≈200 kcal/100g&lt;/td&gt;&lt;td&gt;2.00&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;盐&lt;/td&gt;&lt;td&gt;1g&lt;/td&gt;&lt;td&gt;4g&lt;/td&gt;&lt;td&gt;0 kcal/100g&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;黄原胶&lt;/td&gt;&lt;td&gt;0.6g&lt;/td&gt;&lt;td&gt;2.4g&lt;/td&gt;&lt;td&gt;膳食纤维 ≈0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;玉米淀粉&lt;/td&gt;&lt;td&gt;3g&lt;/td&gt;&lt;td&gt;12g&lt;/td&gt;&lt;td&gt;346 kcal/100g&lt;/td&gt;&lt;td&gt;10.38&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;料酒 (1勺≈15g)&lt;/td&gt;&lt;td&gt;15g&lt;/td&gt;&lt;td&gt;60g&lt;/td&gt;&lt;td&gt;≈50 kcal/100g&lt;/td&gt;&lt;td&gt;7.50&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;单份合计&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;362.6g&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1450.4g&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;&lt;strong&gt;619.66&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;4倍配方合计&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2478.6 kcal&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;分装结果（4倍配方）（13袋 × ~112g）&lt;a href=&quot;#分装结果4倍配方13袋--112g&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;数值&lt;/th&gt;&lt;th&gt;计算&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;每袋重量&lt;/td&gt;&lt;td&gt;&lt;strong&gt;≈112g&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;根据收汁不同，此为估计值，以每袋热量为准&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;每袋热量&lt;/td&gt;&lt;td&gt;&lt;strong&gt;≈191 kcal&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2478.6 ÷ 13&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;每100g 热量&lt;/td&gt;&lt;td&gt;&lt;strong&gt;≈171 kcal&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;619.66 ÷ 362.6 × 100&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>SG2002（CVITEK） Linux+RTOS异构操作系统bootloader构建与启动分析</title><link>https://blog.microorange.online/posts/sg2002_genfip_260610/sg2002_genfip/</link><guid isPermaLink="true">https://blog.microorange.online/posts/sg2002_genfip_260610/sg2002_genfip/</guid><description>SG2002是sophgo（算能）的一颗异构处理器。本文是我2024年读它的构建脚本代码时所写，有助于回答该芯片从上电到Uboot执行之前的阶段都做了什么，编译又如何打包这部分代码。</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;性能or实时：为什么要搞异构&lt;a href=&quot;#性能or实时为什么要搞异构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前几年的时候，性能核配实时核的国内SOC市场突然迎来爆炸，各大开发板厂商也逐渐跟进，相较于经典款MCU或者x86的CPU，这些个芯片一边具备着“古法嵌入式”的实时能力，一边又有一个或多个配备MMU的核心运行高性能任务，享受Linux丰富的软件栈与敏捷开发。&lt;/p&gt;&lt;p&gt;在更早的时候，许多工业项目已经有此类需求，例如Klipper的大量轨迹计算与补偿+精确时刻微步，无人机的高级导航功能+高频位姿估计，ZYNQ的PS+PL软核（好吧这个贵），机器人领域几乎需要复杂图形界面+高频控制闭环的东西都在某种程度上需要这一配置。如果能减轻一边盯着实时核一遍重造网络，界面，以及各种意想不到的轮子的痛苦，爱好者和研究人员很愿意付一颗额外SOC的钱，只不过需要用一根片外导线把高性能核心和实时核心链接在一起，外加忍受一些时间基准和各种自定义协议的麻烦。&lt;/p&gt;&lt;p&gt;尝试将性能核和实时核塞在同一个SOC的产物，iMX8和ST的MP1，似乎要比这些国产SOC稍早一些，不过那个时候的物联网要求似乎还没那么广泛，很多还是哑终端，他们更多面向工业和专业场景。&lt;/p&gt;&lt;p&gt;而今天，物联网设备想要彩色大屏+低功耗待机，机器人想要智慧的AI大脑+上百Hz的控制闭环，而且都要便宜，如果一块SOC能解决就不要上[一块高性能SOC+DRAM+EMMC+一块嵌入式核心+片外Flash]。而今天的主角SG2002则是把大部分能塞在一起的塞在一起的其中之一（的廉价款芯片）。这些使得简单的物联网，基础的DL+控制任务无需传统的MPU+MCU构造，甚至一些型号具备了SIP的运行内存，可以狠狠的减小板子面积了。&lt;/p&gt;&lt;p&gt;P.S. 本文写于2024年，从公众号迁移到Blog，仅限对写作时所用最新构建脚本进行分析&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;芯片框图与初次编译&lt;a href=&quot;#芯片框图与初次编译&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;本文所使用的开发板是milk-v-duo  256M，其上搭载了一颗算能科技（sophgo）公司的sg2002 SOC。这个芯片一共有四个核心，一个A53性能核，一个C906性能核，一个C906实时核，一个8051低功耗核。离谱的是那两个性能核只能选一个启动（。后文将这个C906实时核心称为C906L。特色是它配有一个1Tops的NPU，明显是和全志和堪楠比划比划。其他的配置就中规中矩，两组SDIO，支持高速SPI，和一堆以通信为主的外设。不过国产SOC的通病，这个芯片的资料写的也不太全。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;sg2002结构图&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;1001&quot; src=&quot;/_astro/sg2002_struc.Dhda4vSa_1VCbjS.webp&quot; srcset=&quot;/_astro/sg2002_struc.Dhda4vSa_1OLAoc.webp 640w, /_astro/sg2002_struc.Dhda4vSa_Z1BEp8o.webp 750w, /_astro/sg2002_struc.Dhda4vSa_uGEXw.webp 828w, /_astro/sg2002_struc.Dhda4vSa_1VCbjS.webp 1080w&quot; /&gt;&lt;figcaption&gt;sg2002结构图&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;尽管爱好者最常见的开发方式是micropython和Arduino框架，但是要完全发挥它的性能，依然建议使用官方提供的linux+FreeRTOS  SDK，本文章基于milk-v开源社区移植的SDK来写。&lt;a href=&quot;https://github.com/milkv-duo/duo-buildroot-sdk&quot; target=&quot;_blank&quot;&gt;https://github.com/milkv-duo/duo-buildroot-sdk&lt;/a&gt;&lt;/p&gt;&lt;p&gt;首先把SDK的仓库clone下来，并按照README完成配置和编译all目标，编译过程在8核CPU上大约需要半个小时。编译成功后，会在install目录下生成以下几个升级文件。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;milk-v官方仓库编译产物&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;161&quot; src=&quot;/_astro/sg2002_compli_output.NpglHnHM_ZPCUzI.webp&quot; srcset=&quot;/_astro/sg2002_compli_output.NpglHnHM_ZPCUzI.webp 614w&quot; /&gt;&lt;figcaption&gt;milk-v官方仓库编译产物&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;因为写太多大家也不会看完，所以本文只分析一些fip.bin的构建和运行过程（使用risc-v核心）（sd卡启动），也就是从上电开始，到linux内核启动前启动之前的程序。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;构建脚本分析&lt;a href=&quot;#构建脚本分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;首先简单分析一下构建过程。
仓库目录下的build脚本通过对不同板子的选择来调用预编写的config文件。
随后调用build/milkvsetup.sh 中的build_all函数，该函数准备（主要是环境变量）环境，并逐一启动所有构建与打包工作。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function build_all()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# build bsp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;build_uboot || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;build_kernel || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;build_osdrv || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;build_middleware || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_access_guard_turnkey_app || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_ipc_turnkey_app || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_boot || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_cfg || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_rootfs || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_system || return &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;copy_tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pack_upgrade&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;fip.bin的构建工作由build_uboot函数完成&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function build_uboot()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;print_notice &quot;Run &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FUNCNAME[0]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;() function&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;_build_uboot_env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;_build_opensbi_env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;_link_uboot_logo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cd &quot;&lt;/span&gt;&lt;span&gt;$B&lt;/span&gt;&lt;span&gt;UILD_PATH&quot; || return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[[ &quot;&lt;/span&gt;&lt;span&gt;$C&lt;/span&gt;&lt;span&gt;HIP_ARCH&quot; == CV182X ]] || [[ &quot;&lt;/span&gt;&lt;span&gt;$C&lt;/span&gt;&lt;span&gt;HIP_ARCH&quot; == CV183X ]] &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cp -f &quot;&lt;/span&gt;&lt;span&gt;$O&lt;/span&gt;&lt;span&gt;UTPUT_DIR&quot;/fip_pre/fip_pre_&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;ATF_KEY_SEL&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.bin \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$O&lt;/span&gt;&lt;span&gt;UTPUT_DIR&quot;/fip_pre/fip_pre.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;make u-boot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;)}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;可以看到，完成环境准备后，主要构建实际上是由make完成&lt;/p&gt;&lt;p&gt;这个Makefile在build/ 目录下&lt;/p&gt;&lt;p&gt;找到u-boot目标&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;u-boot&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u-boot-dep&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;虽然说我们构建的是u-boot目标，实际上这个目标同时构建了fsbl+openSBI+FreeRTOS+u-boot并把他们打包嘞。&lt;/p&gt;&lt;p&gt;我们看到它只有一个u-boot-dep的依赖，这实际上是为了适应不同的fip构建流程，我们使用的是fip-v2，可以打开build/scripts/fip_v2.mk查看这个target&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;u-boot-dep&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; fsbl-build &lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OUTPUT_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/elf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt; print_target)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ifeq&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt; qstrip,${&lt;/span&gt;&lt;span&gt;CONFIG_ARCH&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,riscv)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;cp &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OPENSBI_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/build/platform/generic/firmware/fw_payload.bin &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OUTPUT_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fw_payload_uboot.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;cp &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OPENSBI_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/build/platform/generic/firmware/fw_payload.elf &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OUTPUT_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/elf/fw_payload_uboot.elf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这一目标实际上构建了fsbl-build&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opensbi&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export CROSS_COMPILE=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;CONFIG_CROSS_COMPILE_SDK&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opensbi&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u-boot-build&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt; print_target)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}$(&lt;/span&gt;&lt;span&gt;MAKE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; -j&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;NPROC&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; -C &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OPENSBI_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; PLATFORM=generic \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;FW_PAYLOAD_PATH&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_OUTPUT_FOLDER&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/u-boot-raw.bin &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;FW_FDT_PATH=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_OUTPUT_FOLDER&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/arch/riscv/dts/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CHIP&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BOARD&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.dtb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/build/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;PROJECT_FULLNAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ifeq&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt; qstrip,${&lt;/span&gt;&lt;span&gt;CONFIG_ARCH&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;span&gt;,riscv)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl-build&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; opensbi&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ifeq&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CONFIG_ENABLE_FREERTOS&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,y)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl-build&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; rtos&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export BLCP_2ND_PATH=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FREERTOS_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/cvitek/install/bin/cvirtos.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export RTOS_DUMP_PRINT_ENABLE=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;CONFIG_ENABLE_RTOS_DUMP_PRINT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export RTOS_DUMP_PRINT_SZ_IDX=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;CONFIG_DUMP_PRINT_SZ_IDX&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export RTOS_FAST_IMAGE_TYPE=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CONFIG_FAST_IMAGE_TYPE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export RTOS_ENABLE_FREERTOS=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CONFIG_ENABLE_FREERTOS&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export FSBL_SECURE_BOOT_SUPPORT=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CONFIG_FSBL_SECURE_BOOT_SUPPORT&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export ARCH=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt; qstrip,${&lt;/span&gt;&lt;span&gt;CONFIG_ARCH&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export OD_CLK_SEL=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CONFIG_OD_CLK_SEL&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; export VC_CLK_OVERDRIVE=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CONFIG_VC_CLK_OVERDRIVE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fsbl-build&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; u-boot-build memory-map&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt; print_target)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;mkdir -p &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;ln -snrf -t &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/build &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CVI_BOARD_MEMMAP_H_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}$(&lt;/span&gt;&lt;span&gt;MAKE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; -j&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;NPROC&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; -C &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; O=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; BLCP_2ND_PATH=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BLCP_2ND_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;LOADER_2ND_PATH&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_OUTPUT_FOLDER&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/u-boot-raw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;cp &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fip.bin &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OUTPUT_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ifeq&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CONFIG_UBOOT_SPL_CUSTOM&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;,y)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}$(&lt;/span&gt;&lt;span&gt;MAKE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; -C &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; clean O=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}$(&lt;/span&gt;&lt;span&gt;MAKE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; -j&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;NPROC&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; -C &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; O=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; BLCP_2ND_PATH=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BLCP_2ND_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;CONFIG_SKIP_UBOOT&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;CONFIG_SKIP_UBOOT&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; LOADER_2ND_PATH=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_OUTPUT_FOLDER&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/spl/u-boot-spl-raw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;cp &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fip.bin &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OUTPUT_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fip_spl.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;cp &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fip.bin &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;OUTPUT_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fip_spl.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;fsbl首先依赖opensbi，调用opensbi目录下的子Makefile完成构建，opensbi会先构建u-boot，并将u-boot与opensbi组合在一起，sd卡启动方式中似乎并未用到这一组合文件，所以不展开解释了。&lt;/p&gt;&lt;p&gt;随后fsbl依赖rtos，调用freertos下的cmake完成构建&lt;/p&gt;&lt;p&gt;实际在运行时，rtos与opensbi均被加载到DDR内，地址映射如下&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CONFIG_SYS_TEXT_BASE 0x80200000  /* offset 2.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_ATF_SIZE 0x80000  /* 512.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_BOOTLOGO_ADDR 0x8b13e000  /* offset 177.2421875MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_BOOTLOGO_SIZE 0x1c2000  /* 1.7578125MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_CONFIG_SYS_INIT_SP_ADDR 0x82800000  /* offset 40.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_CVI_UPDATE_HEADER_ADDR 0x817ffc00  /* offset 23.9990234375MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_CVI_UPDATE_HEADER_SIZE 0x400  /* 1.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_DRAM_BASE 0x80000000  /* offset 0.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_DRAM_SIZE 0x10000000  /* 256.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FRAMEBUFFER_ADDR 0x8b13e000  /* offset 177.2421875MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FRAMEBUFFER_SIZE 0x1c2000  /* 1.7578125MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FREERTOS_ADDR 0x8fe00000  /* offset 254.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FREERTOS_RESERVED_ION_SIZE 0x1600000  /* 22.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FREERTOS_SIZE 0x200000  /* 2.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FSBL_C906L_START_ADDR 0x8fe00000  /* offset 254.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FSBL_UNZIP_ADDR 0x81800000  /* offset 24.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_FSBL_UNZIP_SIZE 0x1000000  /* 16.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_H26X_BITSTREAM_ADDR 0x8b300000  /* offset 179.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_H26X_BITSTREAM_SIZE 0x200000  /* 2.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_H26X_ENC_BUFF_ADDR 0x8b500000  /* offset 181.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_H26X_ENC_BUFF_SIZE 0x0  /* 0.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_ION_ADDR 0x8b300000  /* offset 179.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_ION_SIZE 0x4b00000  /* 75.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_ISP_MEM_BASE_ADDR 0x8b500000  /* offset 181.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_ISP_MEM_BASE_SIZE 0x1400000  /* 20.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_KERNEL_MEMORY_ADDR 0x80000000  /* offset 0.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_KERNEL_MEMORY_SIZE 0xfe00000  /* 254.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_MONITOR_ADDR 0x80000000  /* offset 0.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_OPENSBI_FDT_ADDR 0x80080000  /* offset 512.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_OPENSBI_SIZE 0x80000  /* 512.0KiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_UIMAG_ADDR 0x81800000  /* offset 24.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define CVIMMAP_UIMAG_SIZE 0x1000000  /* 16.0MiB */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;但此时他们还是一个一个单独的bin文件，真正把他们组装到一起的代码在fsbl构建过程中&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}$(&lt;/span&gt;&lt;span&gt;MAKE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; -j&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;NPROC&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; -C &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; O=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FSBL_OUTPUT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; BLCP_2ND_PATH=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BLCP_2ND_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;LOADER_2ND_PATH&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;UBOOT_OUTPUT_FOLDER&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/u-boot-raw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这里调用了fsbl目录下的make，并为其传递了BLCP_2ND(协处理器第二阶段镜像)与LOADER_2ND（加载器第二阶段镜像）地址&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; fip bl2 blmacros&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;MAKE_HELPERS_DIRECTORY&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;fip.mk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这是fsbl下主目标的依赖目标，fip目标在make_helpers/fip.mk下被定义&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fip&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; fip-all&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fip-dep&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bl2 blmacros-env gen-chip-conf&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fip-all&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; fip-dep&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;print_target&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;echo &quot;  [GEN] fip.bin&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BUILD_PLAT&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/blmacros.env &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FIPTOOL&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; -v genfip \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BUILD_PLAT&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fip.bin&apos; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--MONITOR_RUNADDR&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;span&gt;{MONITOR_RUNADDR}&quot; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--BLCP_2ND_RUNADDR=&quot;&lt;/span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;span&gt;{BLCP_2ND_RUNADDR}&quot; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--CHIP_CONF=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;CHIP_CONF_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--NOR_INFO=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;NOR_INFO&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--NAND_INFO=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;NAND_INFO&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--BL2=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BUILD_PLAT&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/bl2.bin&apos; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--BLCP_IMG_RUNADDR=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BLCP_IMG_RUNADDR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--BLCP_PARAM_LOADADDR=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BLCP_PARAM_LOADADDR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--BLCP=&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BLCP_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--DDR_PARAM=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;DDR_PARAM_TEST_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--BLCP_2ND=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BLCP_2ND_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--MONITOR=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;MONITOR_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--LOADER_2ND=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;LOADER_2ND_PATH&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--compress=&apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FIP_COMPRESS&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;Q&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;echo &quot;  [LS] &quot; &lt;/span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;span&gt;(ls -l &apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;BUILD_PLAT&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/fip.bin&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;fip目标首先完成bl2（第二阶段引导器）的构建，随后打包一些芯片配置。&lt;/p&gt;&lt;p&gt;最后终于到了震撼人心的时候，通过genfip工具把上面构建出来那一堆镜像打包成一个。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;启动过程分析&lt;a href=&quot;#启动过程分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这一套启动流程其实借鉴的是arm的ATF启动。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;ATF启动流程&quot; loading=&quot;lazy&quot; width=&quot;799&quot; height=&quot;512&quot; src=&quot;/_astro/sg2002_atf.BWl39W9Y_Z8eeHG.webp&quot; srcset=&quot;/_astro/sg2002_atf.BWl39W9Y_Z2ab3cb.webp 640w, /_astro/sg2002_atf.BWl39W9Y_Z1TM856.webp 750w, /_astro/sg2002_atf.BWl39W9Y_Z8eeHG.webp 799w&quot; /&gt;&lt;figcaption&gt;ATF启动流程&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;接下来我们借助ATF的启动流程理解一下整个异构操作系统是如何一步一步启动起来的&lt;/p&gt;&lt;p&gt;我们先来看看调试串口的日志信息&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;C. E:RES▒C. E:RES▒C. E:RES▒C. E:RE▒C. E:RESC.C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/0▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/▒C.SCS/0/0.WD.URPL.SDI/25000000/6000000.BS/SD.PS.SD/0x0/0x1000/0x1000/0.PE.BS.SD/0x1000/0x8400/0x8400/0.BE.J.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FSBL Jb2829:g27ada50:2024-07-31T05:11:50+08:00&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;st_on_reason=d0000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;st_off_reason=0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;P2S/0x1000/0xc00a400.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SD/0x9400/0x1000/0x1000/0.P2E.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DPS/0xa400/0x2000.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SD/0xa400/0x2000/0x2000/0.DPE.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cv181x DDR init.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ddr_param[0]=0x78075562.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pkg_type=5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;D1_3_2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DDR3-2G-QFN&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Data rate=1866.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DDR BIST PASS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PLLS.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PLLE.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;C2S/0xc400/0x8fe00000/0x13200.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;R2TE:.00/0x13200/0x13200/0.RSC.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.[1M.S4/601x18f162]0P0r/e0x 8sy0s0t0e0m00 0in/i0tx 1dc2o0ne0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RT: [1.467648]CVIRTOS Build Date:Jul 31 2024  (Time :05:11:50)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RT: [1.473222]Post system init done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RT: [1.476310]dump_print_enable &amp;amp; log will not print&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SD/0x1f600/0x1c200/0x1c200/0.ME.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;L2/0x3b800.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SD/0x3b800/0x200/0x200/0.L2/0x414d3342/0xcafe8c84/0x80200000/0x37600/0x37600&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;COMP/1.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SD/0x3b800/0x37600/0x37600/0.DCP/0x80200020/0x1000000/0x81900020/0x37600/1.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DCP/0x74182/0.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Loader_2nd loaded.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Use internal 32k&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Jump to monitor at 0x80000000.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OPENSBI: next_addr=0x80200020 arg1=0x80080000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OpenSBI v0.9-56-gab9b8f8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;____                    _____ ____ _____&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/ __ \                  / ____|  _ \_   _|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;| |  | |_ __   ___ _ __ | (___ | |_) || |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;| |  | | &apos;_ \ / _ \ &apos;_ \ \___ \|  _ &amp;lt; | |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;| |__| | |_) |  __/ | | |____) | |_) || |_&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;\____/| .__/ \___|_| |_|_____/|____/_____|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;| |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;|_|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform Name             : Cvitek. CV181X ASIC. C906.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform Features         : mfdeleg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform HART Count       : 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform IPI Device       : clint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform Timer Device     : clint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform Console Device   : uart8250&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform HSM Device       : ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform SysReset Device  : ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Platform Suspend Device   : cvi-suspend&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Firmware Base             : 0x80000000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Firmware Size             : 144 KB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Runtime SBI Version       : 0.3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Name              : root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Boot HART         : 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 HARTs             : 0*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Region00          : 0x0000000074000000-0x000000007400ffff (I)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Region01          : 0x0000000080000000-0x000000008003ffff ()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Region02          : 0x0000000000000000-0xffffffffffffffff (R,W,X)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Next Address      : 0x0000000080200020&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Next Arg1         : 0x0000000080080000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 Next Mode         : S-mode&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 SysReset          : yes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Domain0 SysSuspend        : yes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART ID              : 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART Domain          : root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART ISA             : rv64imafdcvsux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART Features        : scounteren,mcounteren,time&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART PMP Count       : 16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART PMP Granularity : 4096&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART PMP Address Bits: 38&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART MHPM Count      : 8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART MHPM Count      : 8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART MIDELEG         : 0x0000000000000222&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot HART MEDELEG         : 0x000000000000b109&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;U-Boot 2021.10-gc8d23960 (Jul 31 2024 - 05:11:29 +0800) soph&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DRAM:  254 MiB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gd-&amp;gt;relocaddr=0x8b0c8000. offset=0xaec8000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MMC:   cv-sd@4310000: 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Loading Environment from nowhere... OK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;In:    serial&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Out:   serial&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Err:   serial&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Net:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Warning: ethernet@4070000 (eth0) using random MAC address - 22:e4:6e:4e:08:75&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;eth0: ethernet@4070000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Hit any key to stop autoboot:  0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot from SD ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;switch to partitions #0, OK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mmc0 is current device&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;最先运行的是BL1程序，这一程序由芯片厂商直接烧录进ROM里，上电或硬复位后从这里开始运行，它会最低限度的初始化时钟系统（低速），同时读取配置引脚以确定启动设备与启动A53计算核还是C906计算核心。这些任务准备完成后，如果启动设备为sd（emmc）设备，将会检查并装载FAT32文件系统，如果是裸烧，将从第一分区中载入fip.bin，如果已经烧录完成，将从boot分区中载入fip.bin&lt;/p&gt;&lt;p&gt;fip.bin是ATF启动中所需要的软件包，其中包含了各个阶段的镜像及其地址。&lt;/p&gt;&lt;p&gt;BL1程序随后从fip.bin中获得BL2程序的地址，并开始复制BL2程序。&lt;/p&gt;&lt;p&gt;注意，此时DDR还未被初始化，所以BL2不能被加载进DDR，让我们看看它的链接脚本。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MEMORY {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;RAM&lt;/span&gt;&lt;span&gt; (rwx): ORIGIN &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; BL2_BASE, LENGTH &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; BL2_SIZE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;哎，那么这个BL2_BASE在哪里呢？&lt;/p&gt;&lt;p&gt;在includes/mmap.h里面可以看到&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BL_RAM_BASE&lt;/span&gt;&lt;span&gt; TPU_SRAM_BASE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BL_RAM_SIZE&lt;/span&gt;&lt;span&gt; TPU_SRAM_SIZE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* IO buffer specific defines.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* block IO buffer&apos;s start address and size must be block size aligned&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BL2_BASE&lt;/span&gt;&lt;span&gt; (BL_RAM_BASE)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BL2_SIZE&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;0x&lt;/span&gt;&lt;span&gt;37000&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#define&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BL2_ENTRY_OFFSET&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其实BL2是被加载进神经网络加速器的SRAM下了&lt;/p&gt;&lt;p&gt;BL2的入口点在fsbl/lib/cpu/riscv下面，做的还是些搞一搞向量表，搞一搞标志位，搞一搞cache，搞一搞状态寄存器之类的任务，随后进入c环境bl2_main.&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bl2_main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Start of addition&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;set_baudrate&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// End of addition&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt; CHIP_CLK_MODE mode;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;uint32_t&lt;/span&gt;&lt;span&gt; v &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;p_rom_api_get_boot_src&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (v &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; BOOT_SRC_UART) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;console_init&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, PLAT_UART_CLK_IN_HZ, UART_DL_BAUDRATE);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ATF_STATE &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ATF_STATE_BL2_MAIN;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;time_records&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;fsbl_start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;read_time_ms&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;NOTICE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;FSBL &lt;/span&gt;&lt;span&gt;%s&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;%s&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, version_string, build_message);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;INFO&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;sw_info=0x&lt;/span&gt;&lt;span&gt;%x&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;get_sw_info&lt;/span&gt;&lt;span&gt;()-&amp;gt;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;INFO&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;fip_param1: param_cksum=0x&lt;/span&gt;&lt;span&gt;%x&lt;/span&gt;&lt;span&gt; param2_loadaddr=0x&lt;/span&gt;&lt;span&gt;%x&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;fip_param1&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;param_cksum&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;fip_param1&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;param2_loadaddr&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;INFO&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;CP_STATE_REG=0x&lt;/span&gt;&lt;span&gt;%x&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;mmio_read_32&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;0x&lt;/span&gt;&lt;span&gt;0E000018&lt;/span&gt;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// print_sram_log();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;lock_efuse_chipsn&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;setup_dl_flag&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;switch_rtc_mode_1st_stage&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;set_rtc_en_registers&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;load_ddr&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#ifdef&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OD_CLK_SEL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mode &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; CLK_OD;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#else&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#ifdef&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;VC_CLK_OVERDRIVE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mode &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; CLK_VC_OD;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#else&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mode &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; CLK_ND;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;load_rest&lt;/span&gt;&lt;span&gt;(mode);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;NOTICE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;BL2 end.&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;也就是说，调试信息的第二行开始FSBL：xxxxxx就是BL2已经启动的标志&lt;/p&gt;&lt;p&gt;后面的任务就很清晰了，初始化rtc域&lt;/p&gt;&lt;p&gt;随后load_ddr调用ddr初始化程序&lt;/p&gt;&lt;p&gt;也就是genfip中声明的DDR_PARAM镜像&lt;/p&gt;&lt;p&gt;随后我们看load_rest函数&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;load_rest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;&lt;span&gt; CHIP_CLK_MODE &lt;/span&gt;&lt;span&gt;mode&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; retry &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;uint64_t&lt;/span&gt;&lt;span&gt; monitor_entry &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;uint64_t&lt;/span&gt;&lt;span&gt; loader_2nd_entry &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// Init sys PLL and switch clocks to PLL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;sys_pll_init&lt;/span&gt;&lt;span&gt;(mode);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;retry_from_flash:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (retry &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;; retry &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;p_rom_api_get_number_of_retries&lt;/span&gt;&lt;span&gt;(); retry&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;load_blcp_2nd&lt;/span&gt;&lt;span&gt;(retry) &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;load_monitor&lt;/span&gt;&lt;span&gt;(retry, &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;monitor_entry) &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;load_loader_2nd&lt;/span&gt;&lt;span&gt;(retry, &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;loader_2nd_entry) &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (retry &lt;/span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;p_rom_api_get_number_of_retries&lt;/span&gt;&lt;span&gt;()) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;switch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;p_rom_api_get_boot_src&lt;/span&gt;&lt;span&gt;()) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; BOOT_SRC_UART:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; BOOT_SRC_SD:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; BOOT_SRC_USB:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;WARN&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;DL cancelled. Load flash. (&lt;/span&gt;&lt;span&gt;%d&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; retry&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// Continue to boot from flash if boot from external source&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;p_rom_api_flash_init&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;goto&lt;/span&gt;&lt;span&gt; retry_from_flash;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ERROR&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Failed to load rest (&lt;/span&gt;&lt;span&gt;%d&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; retry&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;panic_handler&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;sync_cache&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;console_flush&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;switch_rtc_mode_2nd_stage&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (monitor_entry) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;NOTICE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Jump to monitor at 0x&lt;/span&gt;&lt;span&gt;%lx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, monitor_entry);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;jump_to_monitor&lt;/span&gt;&lt;span&gt;(monitor_entry, loader_2nd_entry);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;NOTICE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Jump to loader_2nd at 0x&lt;/span&gt;&lt;span&gt;%lx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, loader_2nd_entry);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;jump_to_loader_2nd&lt;/span&gt;&lt;span&gt;(loader_2nd_entry);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;首先启动PLL，满频运行&lt;/p&gt;&lt;p&gt;load_blcp_2nd（协处理器第二阶段，在本项目中也就是FreeRTOS，函数会装载RTOS的镜像并校验，随后将实时核复位到FreeRTOS入口点&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (rtos_base &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; CVI_RTOS_MAGIC_CODE) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;mmio_write_32&lt;/span&gt;&lt;span&gt;(AXI_SRAM_RTOS_BASE, &lt;/span&gt;&lt;span&gt;fip_param2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;blcp_2nd_runaddr&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;reset_c906l&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fip_param2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;blcp_2nd_runaddr&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;NOTICE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;C2E.&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;实时核输出&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;107&quot; src=&quot;/_astro/sg2002_rt_output.Belv3sUR_eGvjC.webp&quot; srcset=&quot;/_astro/sg2002_rt_output.Belv3sUR_eGvjC.webp 488w&quot; /&gt;&lt;figcaption&gt;实时核输出&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;也就是这些调试信息&lt;/p&gt;&lt;p&gt;随后的load_monitor与load_loader_2nd只装载镜像，而不运行，随后在处理cache同步，更新rtc域后，正式跳转进入monitor，也就是openSBI，相当于ARM启动流程中的BL31，该程序初始化后将一直保留。&lt;/p&gt;&lt;p&gt;最后BL2将执行权限移交给loader_2nd也就是u-boot，随后u-boot初始化，准备引导内核镜像。&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>