PageSourceSearch

https://chasinglulu.github.io/posts/61970ccf/

html chasinglulu.github.io collected 2026-10-03 08:47:00 UTC 46,047 bytes, 652 lines download raw bytes

1<!DOCTYPE html>
2<html lang="zh-CN">
3<head>
4  <meta charset="UTF-8">
5<meta name="viewport" content="width=device-width">
6<meta name="theme-color" content="#222"><meta name="generator" content="Hexo 7.0.0">
7<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
8<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
9  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
10  <link rel="icon" type="image/png" sizes="32x32" href="/images/blog.svg">
11  <link rel="icon" type="image/png" sizes="16x16" href="/images/blog.svg">
12  <link rel="mask-icon" href="/images/logo.svg" color="#222">
13  <meta name="google-site-verification" content="vuSkRYPVceK1DXhqZWm7wVxYV4YmmnI1Dv_C1M8rJJM">
14
15<link rel="stylesheet" href="/css/main.css">
16
17<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Georgia:300,300italic,400,400italic,700,700italic%7CCourier+New:300,300italic,400,400italic,700,700italic&display=swap&subset=latin,latin-ext">
18
19<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" integrity="sha256-CTSx/A06dm1B063156EVh15m6Y67pAjZZaQc89LLSrU=" crossorigin="anonymous">
20  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
21
22<script class="next-config" data-name="main" type="application/json">{"hostname":"chasinglulu.github.io","root":"/","images":"/images","scheme":"Mist","darkmode":false,"version":"8.18.2","exturl":false,"sidebar":{"position":"right","display":"hide","padding":18,"offset":12},"copycode":{"enable":true,"style":"mac"},"fold":{"enable":true,"height":500},"bookmark":{"enable":true,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":true,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":false,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果:${query}","hits_time":"找到 ${hits} 个搜索结果(用时 ${time} 毫秒)","hits":"找到 ${hits} 个搜索结果"},"path":"/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false}}</script>
22<script src="/js/config.js"></script>
22
23
24    <meta name="description" content="在芯片开发的前期,RTL代码还在开发中,FPGA原型验证平台也没有可用的环境。这时候我们可以根据SoC spec在Qemu中开发一个新的Virtual Platform,那么BSP软件团队就可以提前完成一些软件环境的准备,比如最小系统。这样当RTL0.1释放后,我们可以直接复用这些软件在FPGA验证,从而减小搭建软件环境的压力和缩小验证时间。随着Qemu里面模拟的外设越来越多,我们可以把更多的软件">
25<meta property="og:type" content="article">
26<meta property="og:title" content="基于Qemu LMT虚拟平台的bringup">
27<meta property="og:url" content="https://chasinglulu.github.io/posts/61970ccf/index.html">
28<meta property="og:site_name" content="点滴汇聚">
29<meta property="og:description" content="在芯片开发的前期,RTL代码还在开发中,FPGA原型验证平台也没有可用的环境。这时候我们可以根据SoC spec在Qemu中开发一个新的Virtual Platform,那么BSP软件团队就可以提前完成一些软件环境的准备,比如最小系统。这样当RTL0.1释放后,我们可以直接复用这些软件在FPGA验证,从而减小搭建软件环境的压力和缩小验证时间。随着Qemu里面模拟的外设越来越多,我们可以把更多的软件">
30<meta property="og:locale" content="zh_CN">
31<meta property="og:image" content="https://chasinglulu.github.io/images/29/lmt-arch.png">
32<meta property="og:image" content="https://chasinglulu.github.io/images/29/mult-process-qemu.png">
33<meta property="og:image" content="https://chasinglulu.github.io/images/29/lmt-bootflow.png">
34<meta property="og:image" content="https://chasinglulu.github.io/images/29/uboot_kernel.gif">
35<meta property="og:image" content="https://chasinglulu.github.io/images/29/spl_uboot_kernel.gif">
36<meta property="og:image" content="https://chasinglulu.github.io/images/29/atf_uboot_kernel.gif">
37<meta property="og:image" content="https://chasinglulu.github.io/images/29/spl_atf_uboot_kernel.gif">
38<meta property="og:image" content="https://chasinglulu.github.io/images/29/atf_optee_uboot_kernel.gif">
39<meta property="og:image" content="https://chasinglulu.github.io/images/29/spl_atf_optee_uboot_kernel.gif">
40<meta property="og:image" content="https://chasinglulu.github.io/images/29/safety-virt.png">
41<meta property="og:image" content="https://chasinglulu.github.io/images/29/both-virt.gif">
42<meta property="article:published_time" content="2023-11-24T18:00:28.000Z">
43<meta property="article:modified_time" content="2024-09-24T07:39:19.294Z">
44<meta property="article:author" content="Xinlu Wang">
45<meta property="article:tag" content="IT宅、DIY技术">
46<meta name="twitter:card" content="summary">
47<meta name="twitter:image" content="https://chasinglulu.github.io/images/29/lmt-arch.png">
48
49
50<link rel="canonical" href="https://chasinglulu.github.io/posts/61970ccf/">
51
52
53
54<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":true,"permalink":"https://chasinglulu.github.io/posts/61970ccf/","path":"posts/61970ccf/","title":"基于Qemu LMT虚拟平台的bringup"}</script>
54
55
56<script class="next-config" data-name="calendar" type="application/json">""</script>
56
57<title>基于Qemu LMT虚拟平台的bringup | 点滴汇聚</title>
58  
59
60
61
62
63
64
65
66<link rel="dns-prefetch" href="www.chasinglulu.cn"><link rel="stylesheet" href="//cdn.jsdelivr.net/gh/theme-next/theme-next-needmoreshare2@1/needsharebutton.min.css"><style>
67#needsharebutton-postbottom {
68  cursor: pointer;
69  height: 26px;
70  margin-top: 10px;
71  position: relative;
72}
73#needsharebutton-postbottom .btn {
74  border: 1px solid $btn-default-border-color;
75  border-radius: 3px;
76  display: initial;
77  padding: 1px 4px;
78}
79</style><style>
80#needsharebutton-float {
81  bottom: 88px;
82  cursor: pointer;
83  left: -8px;
84  position: fixed;
85  z-index: 9999;
86}
87#needsharebutton-float .btn {
88  border: 1px solid $btn-default-border-color;
89  border-radius: 4px;
90  padding: 0 10px 0 14px;
91}
92</style>
93  <noscript>
94    <link rel="stylesheet" href="/css/noscript.css">
95  </noscript>
96</head>
97
98<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
99  <div class="headband"></div>
100
101  <main class="main">
102    <div class="column">
103      <header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
104  <div class="site-nav-toggle">
105    <div class="toggle" aria-label="切换导航栏" role="button">
106        <span class="toggle-line"></span>
107        <span class="toggle-line"></span>
108        <span class="toggle-line"></span>
109    </div>
110  </div>
111
112  <div class="site-meta">
113
114    <a href="/" class="brand" rel="start">
115      <i class="logo-line"></i>
116      <p class="site-title">点滴汇聚</p>
117      <i class="logo-line"></i>
118    </a>
119      <p class="site-subtitle" itemprop="description">不积跬步无以至千里,不积小流无以成江海</p>
120  </div>
121
122  <div class="site-nav-right">
123    <div class="toggle popup-trigger" aria-label="搜索" role="button">
124        <i class="fa fa-search fa-fw fa-lg"></i>
125    </div>
126  </div>
127</div>
128
129
130
131<nav class="site-nav">
132  <ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-address-card fa-fw"></i>关于</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签<span class="badge">70</span></a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类<span class="badge">9</span></a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档<span class="badge">43</span></a></li>
133      <li class="menu-item menu-item-search">
134        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
135        </a>
136      </li>
137  </ul>
138</nav>
139
140
141
142  <div class="search-pop-overlay">
143    <div class="popup search-popup"><div class="search-header">
144  <span class="search-icon">
145    <i class="fa fa-search"></i>
146  </span>
147  <div class="search-input-container">
148    <input autocomplete="off" autocapitalize="off" maxlength="80"
149           placeholder="搜索..." spellcheck="false"
150           type="search" class="search-input">
151  </div>
152  <span class="popup-btn-close" role="button">
153    <i class="fa fa-times-circle"></i>
154  </span>
155</div>
156<div class="search-result-container no-result">
157  <div class="search-result-icon">
158    <i class="fa fa-spinner fa-pulse fa-5x"></i>
159  </div>
160</div>
161
162    </div>
163  </div>
164
165</header>
166        
167  
168  <aside class="sidebar">
169
170    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
171      <ul class="sidebar-nav">
172        <li class="sidebar-nav-toc">
173          文章目录
174        </li>
175        <li class="sidebar-nav-overview">
176          站点概览
177        </li>
178      </ul>
179
180      <div class="sidebar-panel-container">
181        <!--noindex-->
182        <div class="post-toc-wrap sidebar-panel">
183            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%8A%AF%E7%89%87%E4%BB%8B%E7%BB%8D"><span class="nav-number">1.</span> <span class="nav-text">芯片介绍</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8%E4%BB%8B%E7%BB%8D"><span class="nav-number">2.</span> <span class="nav-text">启动介绍</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8%E9%A1%BA%E5%BA%8F"><span class="nav-number">2.1.</span> <span class="nav-text">启动顺序</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%95%9C%E5%83%8F%E6%9E%84%E5%BB%BA"><span class="nav-number">3.</span> <span class="nav-text">镜像构建</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#ATF"><span class="nav-number">3.1.</span> <span class="nav-text">ATF</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#OPTEE"><span class="nav-number">3.2.</span> <span class="nav-text">OPTEE</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#U-Boot"><span class="nav-number">3.3.</span> <span class="nav-text">U-Boot</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Linux-Kernel"><span class="nav-number">
1833.4.</span> <span class="nav-text">Linux Kernel</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#lmt-virt%E8%BF%90%E8%A1%8C%E9%AA%8C%E8%AF%81"><span class="nav-number">4.</span> <span class="nav-text">lmt-virt运行验证</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8U-Boot-Kernel"><span class="nav-number">4.1.</span> <span class="nav-text">启动U-Boot+Kernel</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8SPL-U-Boot-Kernel"><span class="nav-number">4.2.</span> <span class="nav-text">启动SPL+U-Boot+Kernel</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8ATF-U-Boot-Kernel"><span class="nav-number">4.3.</span> <span class="nav-text">启动ATF+U-Boot+Kernel</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8SPL-ATF-U-Boot-Kernel"><span class="nav-number">4.4.</span> <span class="nav-text">启动SPL+ATF+U-Boot+Kernel</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8ATF-OPTEE-U-Boot-Kernel"><span class="nav-number">4.5.</span> <span class="nav-text">启动ATF+OPTEE+U-Boot+Kernel</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%AF%E5%8A%A8SPL-ATF-OPTEE-U-Boot-Kernel"><span class="nav-number">4.6.</span> <span class="nav-text">启动SPL+ATF+OPTEE+U-Boot+Kernel</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#lmt-safety-virt%E8%BF%90%E8%A1%8C%E9%AA%8C%E8%AF%81"><span class="nav-number">5.</span> <span class="nav-text">lmt-safety-virt运行验证</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#lmt-virt%E5%92%8Clmt-safety-virt%E8%81%94%E5%90%88%E8%BF%90%E8%A1%8C"><span class="nav-number">6.</span> <span class="nav-text">lmt-virt和lmt-safety-virt联合运行</span></a></li></ol></div>
184        </div>
185        <!--/noindex-->
186
187        <div class="site-overview-wrap sidebar-panel">
188          <div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
189    <img class="site-author-image" itemprop="image" alt="Xinlu Wang"
190      src="/images/avatar.jpeg">
191  <p class="site-author-name" itemprop="name">Xinlu Wang</p>
192  <div class="site-description" itemprop="description">不积跬步无以至千里 不积小流无以成江海</div>
193</div>
194<div class="site-state-wrap animated">
195  <nav class="site-state">
196      <div class="site-state-item site-state-posts">
197        <a href="/archives/">
198          <span class="site-state-item-count">43</span>
199          <span class="site-state-item-name">日志</span>
200        </a>
201      </div>
202      <div class="site-state-item site-state-categories">
203          <a href="/categories/">
204        <span class="site-state-item-count">9</span>
205        <span class="site-state-item-name">分类</span></a>
206      </div>
207      <div class="site-state-item site-state-tags">
208          <a href="/tags/">
209        <span class="site-state-item-count">70</span>
210        <span class="site-state-item-name">标签</span></a>
211      </div>
212  </nav>
213</div>
214  <div class="links-of-author animated">
215      <span class="links-of-author-item">
216        <a href="https://github.com/chasinglulu" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;chasinglulu" rel="noopener me" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
217      </span>
218      <span class="links-of-author-item">
219        <a href="mailto:[email protected]" title="E-Mail → mailto:[email protected]" rel="noopener me" target="_blank"><i class="fa fa-envelope fa-fw"></i>E-Mail</a>
220      </span>
221      <span class="links-of-author-item">
222        <a href="https://weibo.com/5052275150" title="Weibo → https:&#x2F;&#x2F;weibo.com&#x2F;5052275150" rel="noopener me" target="_blank"><i class="fab fa-weibo fa-fw"></i>Weibo</a>
223      </span>
224  </div>
225
226        </div>
227      </div>
228    </div>
229
230    
231    <div class="sidebar-inner sidebar-blogroll">
232      <div class="links-of-blogroll animated">
233        <div class="links-of-blogroll-title"><i class="fa fa-globe fa-fw"></i>
234          链接
235        </div>
236        <ul class="links-of-blogroll-list">
237            <li class="links-of-blogroll-item">
238              <a href="https://lore.kernel.org/qemu-devel/" title="https:&#x2F;&#x2F;lore.kernel.org&#x2F;qemu-devel&#x2F;" rel="noopener" target="_blank">Qemu</a>
239            </li>
240            <li class="links-of-blogroll-item">
241              <a href="https://wiki.linuxfoundation.org/realtime/documentation/start" title="https:&#x2F;&#x2F;wiki.linuxfoundation.org&#x2F;realtime&#x2F;documentation&#x2F;start" rel="noopener" target="_blank">RT_Linux</a>
242            </li>
243        </ul>
244      </div>
245    </div>
246  </aside>
247
248
249    </div>
250
251    <div class="main-inner post posts-expand">
252
253
254  
255
256
257<div class="post-block">
258  
259  
260
261  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN">
262    <link itemprop="mainEntityOfPage" href="https://chasinglulu.github.io/posts/61970ccf/">
263
264    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
265      <meta itemprop="image" content="/images/avatar.jpeg">
266      <meta itemprop="name" content="Xinlu Wang">
267    </span>
268
269    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
270      <meta itemprop="name" content="点滴汇聚">
271      <meta itemprop="description" content="不积跬步无以至千里 不积小流无以成江海">
272    </span>
273
274    <span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
275      <meta itemprop="name" content="基于Qemu LMT虚拟平台的bringup | 点滴汇聚">
276      <meta itemprop="description" content="">
277    </span>
278      <header class="post-header">
279        <h1 class="post-title" itemprop="name headline">
280          基于Qemu LMT虚拟平台的bringup
281        </h1>
282
283        <div class="post-meta-container">
284          <div class="post-meta">
285    <span class="post-meta-item">
286      <span class="post-meta-item-icon">
287        <i class="far fa-calendar"></i>
288      </span>
289      <span class="post-meta-item-text">发表于</span>
290
291      <time title="创建时间:2023-11-25 02:00:28" itemprop="dateCreated datePublished" datetime="2023-11-25T02:00:28+08:00">2023-11-25</time>
292    </span>
293    <span class="post-meta-item">
294      <span class="post-meta-item-icon">
295        <i class="far fa-calendar-check"></i>
296      </span>
297      <span class="post-meta-item-text">更新于</span>
298      <time title="修改时间:2024-09-24 15:39:19" itemprop="dateModified" datetime="2024-09-24T15:39:19+08:00">2024-09-24</time>
299    </span>
300
301  
302  
303  <span class="post-meta-item">
304    
305    <span class="post-meta-item-icon">
306      <i class="far fa-comment"></i>
307    </span>
308    <span class="post-meta-item-text">Waline:</span>
309  
310    <a title="waline" href="/posts/61970ccf/#waline" itemprop="discussionUrl">
311      <span class="post-comments-count waline-comment-count" data-path="/posts/61970ccf/" itemprop="commentCount"></span>
312    </a>
313  </span>
314  
315  
316    <span class="post-meta-item" title="阅读次数">
317      <span class="post-meta-item-icon">
318        <i class="far fa-eye"></i>
319      </span>
320      <span class="post-meta-item-text">阅读次数:</span>
321      <span class="waline-pageview-count" data-path="/posts/61970ccf/"></span>
322    </span>
323  
324    <span class="post-meta-break"></span>
325    <span class="post-meta-item" title="本文字数">
326      <span class="post-meta-item-icon">
327        <i class="far fa-file-word"></i>
328      </span>
329      <span class="post-meta-item-text">本文字数:</span>
330      <span>2.2k</span>
331    </span>
332    <span class="post-meta-item" title="阅读时长">
333      <span class="post-meta-item-icon">
334        <i class="far fa-clock"></i>
335      </span>
336      <span class="post-meta-item-text">阅读时长 &asymp;</span>
337      <span>8 分钟</span>
338    </span>
339</div>
340
341        </div>
342      </header>
343
344    
345    
346    
347    <div class="post-body" itemprop="articleBody"><p>在芯片开发的前期,RTL代码还在开发中,FPGA原型验证平台也没有可用的环境。这时候我们可以根据SoC spec在Qemu中开发一个新的Virtual Platform,那么BSP软件团队就可以提前完成一些软件环境的准备,比如最小系统。这样当RTL0.1释放后,我们可以直接复用这些软件在FPGA验证,从而减小搭建软件环境的压力和缩小验证时间。随着Qemu里面模拟的外设越来越多,我们可以把更多的软件function在Qemu里面完成开发和验证,然后再迁移到FPGA原型平台上进行验证,从而完善软件的时序方面的逻辑。通过这样的验证手段,让我们软件准备提前,缩短FPGA的占用时间,减少验证成本。</p>
348<span id="more"></span>
349
350<hr>
351<ul>
352<li><strong>Qemu:</strong> v7.2.0</li>
353<li><strong>U-Boot:</strong> v2022.10</li>
354<li><strong>ATF:</strong> v2.10</li>
355<li><strong>OPTEE:</strong> v4.0.0</li>
356<li><strong>Linux Kernel:</strong> linux-6.1.12</li>
357<li><strong>aarch64-none-linux-gnu-gcc:</strong> 10.3.1 20210621</li>
358<li><strong>riscv32-unknown-linux-gnu-gcc:</strong> 12.2.0</li>
359</ul>
360<hr>
361<h3 id="芯片介绍"><a href="#芯片介绍" class="headerlink" title="芯片介绍"></a>芯片介绍</h3><p><img data-src="/images/29/lmt-arch.png" alt="lmt-arch"></p>
362<center>图1 lmt芯片的架构</center>
363如上图所示,展示了芯片产品的框图,左边是基于ARM的主域,右边是基于RISC-V的从域。这样的芯片架构是目前很多自动驾驶ADAS芯片的解决方案,通过MCU Domain来实现芯片的故障诊断、甚至承接一部分车规相关的规控功能。
364
365
366<p>芯片是异构系统架构的,包含两种指令集CPU(ARM和RISC-V),因此我们在Qemu里面添加了两个machine:lmt-virt和lmt-safety-virt,前者用于模拟ARM系统部分,后面用于模拟RISC-V系统部分,最后通过Qemu里面的共享内存和chardev socket实现两个machine的联动(multi-process Qemu的交互)。</p>
367<p><img data-src="/images/29/mult-process-qemu.png" alt="mult-process-qemu"></p>
368<center>图2 multi-process QEMU的架构</center>
369
370
371<h3 id="启动介绍"><a href="#启动介绍" class="headerlink" title="启动介绍"></a>启动介绍</h3><p>在运行起来之前,我们先明确最小系统涉及的组件以及它们的启动顺序</p>
372<ul>
373<li>ATF:提供EL3 runtime service,具有整个硬件系统的全部权限</li>
374<li>OPTEE:提供可信执行环境</li>
375<li>SPL:完成Bootloader镜像的加载,以及DDR、Clock等初始化</li>
376<li>U-Boot:加载和启动不同OS的镜像</li>
377<li>Kernel:Linux kernel OS,常用的OS</li>
378<li>initramfs:最小的文件系统,用作临时跳转</li>
379<li>Ubuntu Rootfs:根文件系统,存放在存储介质上,里面包含很多应用、库和工具</li>
380</ul>
381<h4 id="启动顺序"><a href="#启动顺序" class="headerlink" title="启动顺序"></a>启动顺序</h4><p><img data-src="/images/29/lmt-bootflow.png" alt="lmt-bootflow"></p>
382<center>图3 启动流程</center>
383
384<ul>
385<li>SPL将BL31 ATF、BL32 OPTEE和BL33 U-Boot三个镜像加载到DDR,将RISC-V Firmware加载到Safety SRAM中,然后跳转到BL31 ATF执行</li>
386<li>
386ATF完成基本的初始化,然后跳转到BL32 OPTEE执行</li>
387<li>OPTEE完成基本的初始化,然后返回到ATF的执行环境中,最后ATF直接跳转到U-Boot执行</li>
388<li>U-Boot完成初始化,外设的初始化,从eMMC&#x2F;Nor Flash等媒介中加载Kernel、initramfs和dtb等镜像文件,然后跳转到Kernel开始执行</li>
389<li>Kernel完成启动初始化,拉起应用程序</li>
390</ul>
391<h3 id="镜像构建"><a href="#镜像构建" class="headerlink" title="镜像构建"></a>镜像构建</h3><h4 id="ATF"><a href="#ATF" class="headerlink" title="ATF"></a>ATF</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">git clone -b atf-v2.10 https://github.com/chasinglulu/arm-trusted-firmware.git</span><br><span class="line">cd arm-trusted-firmware</span><br><span class="line">make PLAT=lmt CROSS_COMPILE=aarch64-none-linux-gnu-</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line">make PLAT=lmt CROSS_COMPILE=aarch64-none-linux-gnu- DEBUG=1 #debug</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line">make PLAT=lmt CROSS_COMPILE=aarch64-none-linux-gnu- DEBUG=1 LOG_LEVEL=50 #verbose mode</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line">make PLAT=lmt CROSS_COMPILE=aarch64-none-linux-gnu- SPD=opteed #with BL32 optee</span><br><span class="line"></span><br></pre></td></tr></table></figure>
392
393<h4 id="OPTEE"><a href="#OPTEE" class="headerlink" title="OPTEE"></a>OPTEE</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">git clone -b optee_os-4.0.0 https://github.com/chasinglulu/optee_os.git</span><br><span class="line">cd optee_os</span><br><span class="line">export ARCH=arm</span><br><span class="line"></span><br><span class="line">make CROSS_COMPILE64=aarch64-none-linux-gnu- CROSS_COMPILE_ta_arm64=aarch64-none-linux-gnu- CROSS_COMPILE_ta_arm32=arm-linux-gnueabi- PLATFORM=ax-lmt</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line">make CROSS_COMPILE64=aarch64-none-linux-gnu- CROSS_COMPILE_ta_arm64=aarch64-none-linux-gnu- CROSS_COMPILE_ta_arm32=arm-linux-gnueabi- PLATFORM=ax-lmt DEBUG=1  #debug</span><br></pre></td></tr></table></figure>
394
395<h4 id="U-Boot"><a href="#U-Boot" class="headerlink" title="U-Boot"></a>U-Boot</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git clone -b uboot-2022.10 https://github.com/chasinglulu/u-boot.git</span><br><span class="line">cd u-boot</span><br><span class="line">make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 lmt-qemu-virt_defconfig</span><br><span class="line">make -j4</span><br></pre></td></tr></table></figure>
396
397<h4 id="Linux-Kernel"><a href="#Linux-Kernel" class="headerlink" title="Linux Kernel"></a>Linux Kernel</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git clone -b linux-v6.1-rt https://github.com/chasinglulu/linux.git</span><br><span class="line">cd linux</span><br><span class="line">make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 lmt-tiny_defconfig</span><br><span class="line">make -j64</span><br></pre></td></tr></table></figure>
398
399
400<h3 id="lmt-virt运行验证"><a href="#lmt-virt运行验证" class="headerlink" title="lmt-virt运行验证"></a>lmt-virt运行验证</h3><h4 id="启动U-Boot-Kernel"><a href="#启动U-Boot-Kernel" class="headerlink" title="启动U-Boot+Kernel"></a>启动U-Boot+Kernel</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-aarch64 -M lmt-virt,virt=on,emmc=on -m 4G -display none -device loader,addr=0x400200000,file=/path/to/u-boot/u-boot.bin,cpu-num=0 -drive file=/path/to/emmc.img,format=raw,<span class="keyword">if</span>=emmc -serial stdio</span><br></pre></td></tr></table></figure>
401
402<p><code>virt=on</code>:使能CPU的EL2<br><code>secure=off</code>:关闭CPU的EL3<br><code>emmc=on</code>:使能eMMC模拟支持</p>
403<p>U-Boot既可以运行在EL2也可以运行在EL3上,但是打开EL3的时候,需要运行ATF,不然Kernel发起PSCI访问会触发panic。</p>
404<p><img data-src="/images/29/uboot_kernel.gif" alt="uboot_kernel"></p>
405<p>启动日志附件:<a href="/images/29/uboot_kernel.txt">U-Boot-&gt;kernel Booting</a></p>
406<h4 id="启动SPL-U-Boot-Kernel"><a href="#启动SPL-U-Boot-Kernel" class="headerlink" title="启动SPL+U-Boot+Kernel"></a>启动SPL+U-Boot+Kernel</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-aarch64 -M lmt-virt,virt=on,secure=on,emmc=on -m 4G -display none -device loader,addr=0x00,file=/path/to/u-boot/spl/u-boot-spl.bin,cpu-num=0 -device loader,addr=0x400200000,file=/path/to/u-boot/u-boot.img -drive file=/path/to/emmc.img,format=raw,<span class="keyword">if</span>=emmc -serial stdio</span><br></pre></td></tr></table></figure>
407<p><code>virt=on</code>:使能CPU的EL2<br><code>secure=on</code>:使能CPU的EL3<br><code>emmc=on</code>:使能eMMC模拟支持</p>
408<p>因为SPL和U-Boot既可以运行在EL2也可以运行在EL3,因此<code>virt=</code>和<code>secure=</code>两个选项既可以<code>on</code>也可以<code>off</code>,两个选项可以随意组合,用于验证不同的使用场景。</p>
409<p><code>secure=off</code>:关闭CPU的EL3,Kernel下的PSCI访问请求都由Qemu捕获进行处理。如果使能EL3,必须运行ATF软件,不然Kernel发出PSCI请求会触发panic。</p>
410<p><img data-src="/images/29/spl_uboot_kernel.gif" alt="spl_uboot_kernel"></p>
411<p>启动日志附件:<a href="/images/29/spl_uboot_kernel.txt">ATF-&gt;U-Boot-&gt;kernel Booting</a></p>
412<h4 id="启动ATF-U-Boot-Kernel"><a href="#启动ATF-U-Boot-Kernel" class="headerlink" title="启动ATF+U-Boot+Kernel"></a>启动ATF+U-Boot+Kernel</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-aarch64 -M lmt-virt,virt=on,secure=on,emmc=on -m 4G -display none -device loader,addr=0x400104000,file=/path/to/arm-trusted-firmware/build/lmt/release/bl31.bin,cpu-num=0 -device loader,addr=0x400200000,file=/path/to/u-boot/u-boot.bin -drive file=/path/to/emmc.img,format=raw,<span class="keyword">if</span>=emmc -serial stdio</span><br></pre></td></tr></table></figure>
413<p><code>virt=on</code>:使能CPU的EL2<br><code>secure=on</code>:使能CPU的EL3<br><code>emmc=on</code>:使能eMMC模拟支持</p>
414<p><img data-src="/images/29/atf_uboot_kernel.gif" alt="atf_uboot_kernel"></p>
415<p>启动日志附件:<a href="/images/29/atf_uboot_kernel.txt">ATF-&gt;U-Boot-&gt;kernel Booting</a></p>
416<h4 id="启动SPL-ATF-U-Boot-Kernel"><a href="#启动SPL-ATF-U-Boot-Kernel" class="headerlink" title="启动SPL+ATF+U-Boot+Kernel"></a>启动SPL+ATF+U-Boot+Kernel</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-aarch64 -M lmt-virt,virt=on,secure=on,emmc=on -m 4G -display none -device loader,addr=0x0,file=/path/to/u-boot/spl/u-boot-spl.bin,cpu-num=0 -device loader,addr=0x400104000,file=/path/to/arm-trusted-firmware/build/lmt/release/bl31.bin -device loader,addr=0x400200000,file=/path/to/u-boot/u-boot.bin -drive file=/path/to/emmc.img,format=raw,<span class="keyword">if</span>=emmc -serial stdio</span><br></pre></td></tr></table></figure>
417
418<p><code>virt=on</code>:使能CPU的EL2<br><code>secure=on</code>:使能CPU的EL3<br><code>emmc=on</code>:使能eMMC模拟支持</p>
419<p><img data-src="/images/29/spl_atf_uboot_kernel.gif" alt="spl_atf_uboot_kernel"></p>
420<p>启动日志附件:<a href="/images/29/spl_atf_uboot_kernel.txt">SPL-&gt;ATF-&gt;U-Boot-&gt;kernel Booting</a></p>
421<h4 id="启动ATF-OPTEE-U-Boot-Kernel"><a href="#启动ATF-OPTEE-U-Boot-Kernel" class="headerlink" title="启动ATF+OPTEE+U-Boot+Kernel"></a>启动ATF+OPTEE+U-Boot+Kernel</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-aarch64 -M lmt-virt,virt=on,secure=on,emmc=on -m 4G -display none -device loader,addr=0x400104000,file=/path/to/arm-trusted-firmware/build/lmt/release/bl31.bin,cpu-num=0 -device loader,addr=0x400200000,file=/path/to/u-boot/u-boot.bin -device loader,addr=0x404000000,file=/path/to/optee_os/out/arm-plat-ax/core/tee-pager_v2.bin -drive file=/path/to/emmc.img,format=raw,<span class="keyword">if</span>=emmc -serial stdio</span><br></pre></td></tr></table></figure>
422<p><code>virt=on</code>:使能CPU的EL2<br><code>secure=on</code>:使能CPU的EL3<br><code>emmc=on</code>:使能eMMC模拟支持</p>
423<p><img data-src="/images/29/atf_optee_uboot_kernel.gif" alt="atf_optee_uboot_kernel"></p>
424<p>启动日志附件:<a href="/images/29/atf_optee_uboot_kernel.txt">ATF-&gt;OPTEE-&gt;U-Boot-&gt;kernel Booting</a></p>
425<h4 id="启动SPL-ATF-OPTEE-U-Boot-Kernel"><a href="#启动SPL-ATF-OPTEE-U-Boot-Kernel" class="headerlink" title="启动SPL+ATF+OPTEE+U-Boot+Kernel"></a>启动SPL+ATF+OPTEE+U-Boot+Kernel</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-aarch64 -M lmt-virt,virt=on,secure=on,emmc=on -m 4G -display none -device loader,addr=0x0,file=/path/to/u-boot/spl/u-boot-spl.bin,cpu-num=0 -device loader,addr=0x400104000,file=/path/to/arm-trusted-firmware/build/lmt/release/bl31.bin -device loader,addr=0x400200000,file=/path/to/u-boot/u-boot.bin -device loader,addr=0x404000000,file=/path/to/optee_os/out/arm-plat-ax/core/tee-pager_v2.bin -drive file=/path/to/emmc.img,format=raw,<span class="keyword">if</span>=emmc -serial stdio</span><br></pre></td></tr></table></figure>
426
427<p><code>virt=on</code>:使能CPU的EL2<br><code>secure=on</code>:使能CPU的EL3<br><code>emmc=on</code>:使能eMMC模拟支持</p>
428<p><img data-src="/images/29/spl_atf_optee_uboot_kernel.gif" alt="spl_atf_optee_uboot_kernel"></p>
429<p>启动日志附件:<a href="/images/29/spl_atf_optee_uboot_kernel.txt">SPL-&gt;ATF-&gt;OPTEE-&gt;U-Boot-&gt;kernel Booting</a></p>
430<h3 id="lmt-safety-virt运行验证"><a href="#lmt-safety-virt运行验证" class="headerlink" title="lmt-safety-virt运行验证"></a>lmt-safety-virt运行验证</h3><p>lmt-safety-virt虚拟平台是基于RISC-V 32-bit架构开发的,在U-Boot里面添加了lmt-safety-virt平台的支持。下面是U-Boot编译构建命令:</p>
431<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> u-boot</span><br><span class="line">make ARCH=riscv CROSS_COMPILE=riscv32-unknown-linux-gnu- lmt-qemu-riscv-without-dram_defconfig</span><br><span class="line">make ARCH=riscv CROSS_COMPILE=riscv32-unknown-linux-gnu- -j4</span><br></pre></td></tr></table></figure>
432
433<p>下面是运行验证命令:</p>
434<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">
434qemu-system-riscv32 -M lmt-safety-virt -m 1M -display none -device loader,file=/path/to/u-boot/u-boot-with-spl.bin,addr=0x60c00000,cpu-num=0 -serial stdio</span><br></pre></td></tr></table></figure>
435
436<p><img data-src="/images/29/safety-virt.png" alt="lmt-safety-virt"></p>
437<h3 id="lmt-virt和lmt-safety-virt联合运行"><a href="#lmt-virt和lmt-safety-virt联合运行" class="headerlink" title="lmt-virt和lmt-safety-virt联合运行"></a>lmt-virt和lmt-safety-virt联合运行</h3><p>SoC是异构的,里面即集成了ARM Cortex-A系列的CPU,也集成了RISC-V系列的CPU。因此一种架构的CPU开发一个对应的虚拟平台,两个及以上的虚拟平台对应多个Qemu进程,就涉及到多个Qemu之间的联动,用于仿真异构核之间的交互和控制逻辑。</p>
438<p>下面是启动lmt-virt的命令:</p>
439<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-aarch64 -M lmt-virt,riscv-memdev=iram-safety -m 4G -display none -device loader,addr=0x400200000,file=/path/to/u-boot/u-boot.bin,cpu-num=0 -object memory-backend-file,size=512K,id=iram-safety,share=on,mem-path=/path/to/qemu-shm,discard-data=on -rp-path /tmp/coemu -serial stdio -semihosting</span><br></pre></td></tr></table></figure>
440
441<p><code>/tmp/coemu</code>:如果目录不存在,<em>mkdir</em>创建<br><code>riscv-memdev</code>:指定IRAM的内存后端ID,由machine使用</p>
442<p>下面是启动lmt-safety-virt的命令:</p>
443<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">qemu-system-riscv32 -M lmt-safety-virt,standalone=off,memdev=iram-safety -m 2M -display none -chardev socket,id=coemu,path=/tmp/coemu/qemu_rport_machine_lmt_soc_cosim_rp -object memory-backend-file,size=512K,id=iram-safety,share=on,mem-path=/path/to/qemu-shm,discard-data=on -serial stdio</span><br></pre></td></tr></table></figure>
444
445<p><code>standalone=</code>:指定machine的运行模式(单独或者联动)<br><code>memdev=</code>:指定machine所使用内存后端的ID</p>
446<p><img data-src="/images/29/both-virt.gif" alt="both-virt"></p>
447<p>AArch64侧的启动日志附件:<a href="/images/29/aarch64_booting.txt">AArch64 Booting</a></p>
448<p>RISC-V侧的启动日志附件:<a href="/images/29/riscv_booting.txt">RISC-V Booting</a></p>
449<p>目前只是做到了AArch64侧能够控制RISC-V侧的启动,两侧的通信交互还没有开发,比如在Linux内核下AArch64与RISC-V进行交互访问等。</p>
450
451    </div>
452
453    
454    
455    
456
457    <footer class="post-footer"><div class="post-widgets">
458      <div id="needsharebutton-postbottom">
459        <span class="btn">
460          <i class="fa fa-share-alt" aria-hidden="true"></i>
461        </span>
462      </div>
463    </div>
464          <div class="reward-container">
465  <div>请我一杯咖啡吧!</div>
466  <button>
467    赞赏
468  </button>
469  <div class="post-reward">
470      <div>
471        <img src="/images/wechatpay.png" alt="Xinlu Wang 微信">
472        <span>微信</span>
473      </div>
474      <div>
475        <img src="/images/alipay.jpg" alt="Xinlu Wang 支付宝">
476        <span>支付宝</span>
477      </div>
478
479  </div>
480</div>
481
482          
483
484<div class="post-copyright">
485<ul>
486  <li class="post-copyright-author">
487      <strong>本文作者: </strong>Xinlu Wang
488  </li>
489  <li class="post-copyright-link">
490      <strong>本文链接:</strong>
491      <a href="https://chasinglulu.github.io/posts/61970ccf/" title="基于Qemu LMT虚拟平台的bringup">https://chasinglulu.github.io/posts/61970ccf/</a>
492  </li>
493  <li class="post-copyright-license">
494      <strong>版权声明: </strong>本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="noopener" target="_blank"><i class="fab fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处!
495  </li>
496</ul>
497</div>
498
499
500        
501
502          <div class="post-nav">
503            <div class="post-nav-item">
504                <a href="/posts/8ef16649/" rel="prev" title="基于Qemu搭建Xen on ARM开发环境">
505                  <i class="fa fa-angle-left"></i> 基于Qemu搭建Xen on ARM开发环境
506                </a>
507            </div>
508            <div class="post-nav-item">
509            </div>
510          </div>
511    </footer>
512  </article>
513</div>
514
515
516
517
518
519
520    <div class="comments" id="waline"></div>
521</div>
522  </main>
523
524  <footer class="footer">
525    <div class="footer-inner">
526
527  <div class="copyright">
528    &copy; 2018 – 
529    <span itemprop="copyrightYear">2024</span>
530    <span class="with-love">
531      <i class="fa fa-anchor"></i>
532    </span><a href="http://abitacc.com/about" rel="noopener" target="_blank">Xinlu Wang</a>
533    <!-- annotation
534    <span class="author" itemprop="copyrightHolder">Xinlu Wang</span>
535    -->
536  </div>
537<div class="wordcount">
538  <span class="post-meta-item">
539    <span class="post-meta-item-icon">
540      <i class="fa fa-chart-line"></i>
541    </span>
542      <span>站点总字数:</span>
543    <span title="站点总字数">82k</span>
544  </span>
545  <span class="post-meta-item">
546    <span class="post-meta-item-icon">
547      <i class="fa fa-coffee"></i>
548    </span>
549      <span>站点阅读时长 &asymp;</span>
550    <span title="站点阅读时长">4:57</span>
551  </span>
552</div>
553<div class="busuanzi-count">
554    <span class="post-meta-item" id="busuanzi_container_site_uv">
555      <span class="post-meta-item-icon">
556        <i class="fa fa-user"></i>
557      </span>
558      <span class="site-uv" title="总访客量">
559        <span id="busuanzi_value_site_uv"></span>
560      </span>
561    </span>
562    <span class="post-meta-item" id="busuanzi_container_site_pv">
563      <span class="post-meta-item-icon">
564        <i class="fa fa-eye"></i>
565      </span>
566      <span class="site-pv" title="总访问量">
567        <span id="busuanzi_value_site_pv"></span>
568      </span>
569    </span>
570</div>
571
572    </div>
573  </footer>
574
575  
576  <div class="toggle sidebar-toggle" role="button">
577    <span class="toggle-line"></span>
578    <span class="toggle-line"></span>
579    <span class="toggle-line"></span>
580  </div>
581  <div class="sidebar-dimmer"></div>
582  <div class="back-to-top" role="button" aria-label="返回顶部">
583    <i class="fa fa-arrow-up fa-lg"></i>
584    <span>0%</span>
585  </div>
586  <div class="reading-progress-bar"></div>
587  <a role="button" class="book-mark-link book-mark-link-fixed"></a>
588
589  <a href="https://github.com/chasinglulu" class="github-corner" title="在 GitHub 上关注我" aria-label="在 GitHub 上关注我" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
590
591<noscript>
592  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
593</noscript>
594
595
596  
597  
597<script size="300" alpha="0.6" zIndex="-1" src="https://cdnjs.cloudflare.com/ajax/libs/ribbon.js/1.0.2/ribbon.min.js"></script>
597
598  
598<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
598
599  
599<script src="https://cdnjs.cloudflare.com/ajax/libs/lozad.js/1.16.0/lozad.min.js" integrity="sha256-mOFREFhqmHeQbXpK2lp4nA3qooVgACfh88fpJftLBbc=" crossorigin="anonymous"></script>
vendor: 1 bytes, line 599
599
600<script src="/js/comments.js"></script>
600<script src="/js/utils.js"></script>
600<script src="/js/motion.js"></script>
600<script src="/js/schemes/muse.js"></script>
600<script src="/js/next-boot.js"></script>
600<script src="/js/bookmark.js"></script>
600
601
602  
602<script src="https://cdnjs.cloudflare.com/ajax/libs/hexo-generator-searchdb/1.4.1/search.js" integrity="sha256-1kfA5uHPf65M5cphT2dvymhkuyHPQp5A53EGZOnOLmc=" crossorigin="anonymous"></script>
vendor: 1 bytes, line 602
602
603<script src="/js/third-party/search/local-search.js"></script>
603
604
605
606
607
608
609
610
611  
612  
612<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
612
613
614
615
616
617  
617<script src="https://cdnjs.cloudflare.com/ajax/libs/quicklink/2.3.0/quicklink.umd.js" integrity="sha256-yvJQOINiH9fWemHn0vCA5lsHWJaHs6/ZmO+1Ft04SvM=" crossorigin="anonymous"></script>
617
618  
618<script class="next-config" data-name="quicklink" type="application/json">{"enable":true,"home":false,"archive":false,"delay":true,"timeout":3000,"priority":true,"url":"https://chasinglulu.github.io/posts/61970ccf/"}</script>
618
619  
619<script src="/js/third-party/quicklink.js"></script>
vendor: 1 bytes, line 619
619
620<script class="next-config" data-name="waline" type="application/json">{"lang":"zh-CN","enable":true,"serverURL":"www.chasinglulu.cn","cssUrl":"https://unpkg.com/@waline/client@v2/dist/waline.css","commentCount":true,"pageview":true,"placeholder":"请文明评论呀","avatar":"mm","meta":["nick","mail"],"pageSize":10,"comment_count":true,"requiredFields":["mail"],"libUrl":"https://cdn.jsdelivr.net/npm/@waline/[email protected]/dist/waline.js","emoji":["https://cdn.jsdelivr.net/gh/walinejs/[email protected]/tw-emoji/"],"el":"#waline","comment":true,"path":"/posts/61970ccf/"}</script>
620
621<link rel="stylesheet" href="https://unpkg.com/@waline/client@v2/dist/waline.css">
622<script>
623document.addEventListener('page:loaded', () => {
624  NexT.utils.loadComments(CONFIG.waline.el).then(() =>
625    NexT.utils.getScript(CONFIG.waline.libUrl, { condition: window.Waline })
626  ).then(() => 
627    Waline.init(Object.assign({}, CONFIG.waline,{ el: document.querySelector(CONFIG.waline.el) }))
628  );
629});
630</script>
630
631<div id="needsharebutton-float">
632      <span class="btn">
633        <i class="fa fa-share-alt" aria-hidden="true"></i>
634      </span>
635    </div>
636  
636<script src="//cdn.jsdelivr.net/gh/theme-next/theme-next-needmoreshare2@1/needsharebutton.min.js"></script>
636
637  
637<script>
638      pbOptions = {};
639        pbOptions.iconStyle = "default";
640        pbOptions.boxForm = "horizontal";
641        pbOptions.position = "bottomCenter";
642        pbOptions.networks = "Weibo,Wechat,Douban,QQZone,Mailto";
643      new needShareButton('#needsharebutton-postbottom', pbOptions);
644      flOptions = {};
645        flOptions.iconStyle = "box";
646        flOptions.boxForm = "vertical";
647        flOptions.position = "topRight";
648        flOptions.networks = "Weibo,Wechat,Douban,QQZone,Mailto";
649      new needShareButton('#needsharebutton-float', flOptions);
650  </script>
650
651</body>
652</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.