mirror of
https://github.com/LearningOS/rust-based-os-comp2022.git
synced 2026-11-05 06:48:50 +08:00
deploy: 05e1d62ebd
This commit is contained in:
@@ -427,25 +427,23 @@
|
||||
<span class="p">}</span><span class="w"></span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>然后实现基于 <code class="docutils literal notranslate"><span class="pre">Write</span></code> Trait 的数据结构,并完成 <code class="docutils literal notranslate"><span class="pre">Write</span></code> Trait 所需要的 <code class="docutils literal notranslate"><span class="pre">write_str</span></code> 函数,并用 <code class="docutils literal notranslate"><span class="pre">print</span></code> 函数进行包装。</p>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="c1">// os/src/console.rs</span>
|
||||
<p>然后实现基于 <code class="docutils literal notranslate"><span class="pre">Write</span></code> Trait 的数据结构,并完成 <code class="docutils literal notranslate"><span class="pre">Write</span></code> Trait 所需要的 <code class="docutils literal notranslate"><span class="pre">write_str</span></code> 函数,并用 <code class="docutils literal notranslate"><span class="pre">print</span></code> 函数进行包装。最后,基于 <code class="docutils literal notranslate"><span class="pre">print</span></code> 函数,实现Rust语言 <strong>格式化宏</strong> ( <a class="reference external" href="https://doc.rust-lang.org/std/fmt/#related-macros">formatting macros</a> )。</p>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="c1">// os/src/console.rs</span>
|
||||
<span class="k">use</span><span class="w"> </span><span class="n">core</span>::<span class="n">fmt</span>::<span class="p">{</span><span class="n">Write</span><span class="p">,</span><span class="w"> </span><span class="n">Arguments</span><span class="p">,</span><span class="w"> </span><span class="nb">Result</span><span class="p">};</span><span class="w"></span>
|
||||
<span class="k">use</span><span class="w"> </span><span class="k">crate</span>::<span class="n">sys_write</span><span class="p">;</span><span class="w"></span>
|
||||
|
||||
<span class="k">struct</span> <span class="nc">Stdout</span><span class="p">;</span><span class="w"></span>
|
||||
|
||||
<span class="k">impl</span><span class="w"> </span><span class="n">Write</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">Stdout</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="k">fn</span> <span class="nf">write_str</span><span class="p">(</span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">s</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">)</span><span class="w"> </span>-> <span class="nc">fmt</span>::<span class="nb">Result</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="k">fn</span> <span class="nf">write_str</span><span class="p">(</span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">s</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">)</span><span class="w"> </span>-> <span class="nb">Result</span> <span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">sys_write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="p">.</span><span class="n">as_bytes</span><span class="p">());</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="nb">Ok</span><span class="p">(())</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">}</span><span class="w"></span>
|
||||
<span class="p">}</span><span class="w"></span>
|
||||
|
||||
<span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">print</span><span class="p">(</span><span class="n">args</span>: <span class="nc">fmt</span>::<span class="n">Arguments</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">print</span><span class="p">(</span><span class="n">args</span>: <span class="nc">Arguments</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">Stdout</span><span class="p">.</span><span class="n">write_fmt</span><span class="p">(</span><span class="n">args</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span><span class="w"></span>
|
||||
<span class="p">}</span><span class="w"></span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>最后,实现基于 <code class="docutils literal notranslate"><span class="pre">print</span></code> 函数,实现Rust语言 <strong>格式化宏</strong> ( <a class="reference external" href="https://doc.rust-lang.org/std/fmt/#related-macros">formatting macros</a> )。</p>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="c1">// os/src/console.rs</span>
|
||||
|
||||
<span class="fm">macro_rules!</span><span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">(</span><span class="cp">$fmt</span>: <span class="nc">literal</span><span class="w"> </span><span class="cp">$(,</span><span class="w"> </span><span class="cp">$($arg</span>: <span class="nc">tt</span><span class="p">)</span><span class="o">+</span><span class="p">)</span><span class="o">?</span><span class="p">)</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
@@ -455,24 +453,27 @@
|
||||
|
||||
<span class="fm">macro_rules!</span><span class="w"> </span><span class="n">println</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">(</span><span class="cp">$fmt</span>: <span class="nc">literal</span><span class="w"> </span><span class="cp">$(,</span><span class="w"> </span><span class="cp">$($arg</span>: <span class="nc">tt</span><span class="p">)</span><span class="o">+</span><span class="p">)</span><span class="o">?</span><span class="p">)</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="cp">$crate</span>::<span class="n">console</span>::<span class="n">print</span><span class="p">(</span><span class="fm">format_args!</span><span class="p">(</span><span class="fm">concat!</span><span class="p">(</span><span class="cp">$fmt</span><span class="p">,</span><span class="w"> </span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span><span class="w"> </span><span class="cp">$(,</span><span class="w"> </span><span class="cp">$($arg</span><span class="p">)</span><span class="o">+</span><span class="p">)</span><span class="o">?</span><span class="p">));</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="cp">$crate</span>::<span class="n">console</span>::<span class="n">print</span><span class="p">(</span><span class="fm">format_args!</span><span class="p">(</span><span class="fm">concat!</span><span class="p">(</span><span class="cp">$fmt</span><span class="p">,</span><span class="w"> </span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span><span class="w"> </span><span class="cp">$(,</span><span class="w"> </span><span class="cp">$($arg</span><span class="p">)</span><span class="o">+</span><span class="p">)</span><span class="o">?</span><span class="p">));</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="p">}</span><span class="w"></span>
|
||||
<span class="p">}</span><span class="w"></span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>注: <code class="docutils literal notranslate"><span class="pre">os/src/console.rs</span></code> 文件的代码中使用到了 <code class="docutils literal notranslate"><span class="pre">main.rs</span></code> 文件中的sys_write方法,需要说明在文件头部声明 <code class="docutils literal notranslate"><span class="pre">use</span> <span class="pre">crate::sys_write;</span></code> 。</p>
|
||||
<p>而 <code class="docutils literal notranslate"><span class="pre">main.rs</span></code> 为了能够用到 <code class="docutils literal notranslate"><span class="pre">console.rs</span></code> 提供的功能,也需要添加对 console 的引用。主要的添加如下:</p>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="w"> </span><span class="c1">// os/src/main.rs</span>
|
||||
|
||||
<span class="c1">// os/src/main.rs</span>
|
||||
|
||||
<span class="cp">#![no_std]</span><span class="w"></span>
|
||||
<span class="cp">#![no_main]</span><span class="w"></span>
|
||||
|
||||
<span class="cp">#[macro_use]</span><span class="w"></span>
|
||||
<span class="k">mod</span> <span class="nn">console</span><span class="p">;</span><span class="w"></span>
|
||||
<span class="k">mod</span> <span class="nn">lang_items</span><span class="p">;</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="c1">//... other code</span>
|
||||
<span class="w"> </span><span class="cp">#[macro_use]</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="k">mod</span> <span class="nn">console</span><span class="p">;</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="c1">//... other code</span>
|
||||
|
||||
<span class="o">..</span><span class="p">.</span><span class="w"></span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>接下来,我们调整一下应用程序,让它发出显示字符串和退出的请求:</p>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="cp">#[no_mangle]</span><span class="w"></span>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="c1">// os/src/main.rs</span>
|
||||
|
||||
<span class="cp">#[no_mangle]</span><span class="w"></span>
|
||||
<span class="k">extern</span><span class="w"> </span><span class="s">"C"</span><span class="w"> </span><span class="k">fn</span> <span class="nf">_start</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"Hello, world!"</span><span class="p">);</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">sys_exit</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span><span class="w"></span>
|
||||
|
||||
Reference in New Issue
Block a user