mirror of
https://github.com/LearningOS/rust-based-os-comp2022.git
synced 2026-05-09 23:31:29 +08:00
deploy: 78adaf0e78
This commit is contained in:
@@ -162,11 +162,15 @@ Rust 的 core 库内建了以一系列帮助实现显示字符的基本 Trait
|
||||
|
||||
如果你觉得理解 Rust 宏有困难,把它当成黑盒就好!
|
||||
|
||||
学习rust宏的参考链接: `The Little Book of Rust Macros <https://veykril.github.io/tlborm/introduction.html>`_
|
||||
|
||||
|
||||
首先封装一下对 ``SYSCALL_WRITE`` 系统调用。
|
||||
|
||||
.. code-block:: rust
|
||||
|
||||
// os/src/main.rs
|
||||
|
||||
const SYSCALL_WRITE: usize = 64;
|
||||
|
||||
pub fn sys_write(fd: usize, buffer: &[u8]) -> isize {
|
||||
@@ -178,6 +182,8 @@ Rust 的 core 库内建了以一系列帮助实现显示字符的基本 Trait
|
||||
|
||||
.. code-block:: rust
|
||||
|
||||
// os/src/console.rs
|
||||
|
||||
struct Stdout;
|
||||
|
||||
impl Write for Stdout {
|
||||
@@ -196,20 +202,31 @@ Rust 的 core 库内建了以一系列帮助实现显示字符的基本 Trait
|
||||
|
||||
.. code-block:: rust
|
||||
|
||||
#[macro_export]
|
||||
// os/src/console.rs
|
||||
|
||||
macro_rules! print {
|
||||
($fmt: literal $(, $($arg: tt)+)?) => {
|
||||
$crate::console::print(format_args!($fmt $(, $($arg)+)?));
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! println {
|
||||
($fmt: literal $(, $($arg: tt)+)?) => {
|
||||
print(format_args!(concat!($fmt, "\n") $(, $($arg)+)?));
|
||||
$crate::console::print(format_args!(concat!($fmt, "\n") $(, $($arg)+)?));
|
||||
}
|
||||
}
|
||||
|
||||
// os/src/main.rs
|
||||
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
#[macro_use]
|
||||
mod console;
|
||||
mod lang_items;
|
||||
|
||||
...
|
||||
|
||||
接下来,我们调整一下应用程序,让它发出显示字符串和退出的请求:
|
||||
|
||||
.. code-block:: rust
|
||||
|
||||
@@ -415,9 +415,12 @@
|
||||
<div class="admonition attention">
|
||||
<p class="admonition-title">注意</p>
|
||||
<p>如果你觉得理解 Rust 宏有困难,把它当成黑盒就好!</p>
|
||||
<p>学习rust宏的参考链接: <a class="reference external" href="https://veykril.github.io/tlborm/introduction.html">The Little Book of Rust Macros</a></p>
|
||||
</div>
|
||||
<p>首先封装一下对 <code class="docutils literal notranslate"><span class="pre">SYSCALL_WRITE</span></code> 系统调用。</p>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="k">const</span><span class="w"> </span><span class="n">SYSCALL_WRITE</span>: <span class="kt">usize</span> <span class="o">=</span><span class="w"> </span><span class="mi">64</span><span class="p">;</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="k">const</span><span class="w"> </span><span class="n">SYSCALL_WRITE</span>: <span class="kt">usize</span> <span class="o">=</span><span class="w"> </span><span class="mi">64</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">sys_write</span><span class="p">(</span><span class="n">fd</span>: <span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="n">buffer</span>: <span class="kp">&</span><span class="p">[</span><span class="kt">u8</span><span class="p">])</span><span class="w"> </span>-> <span class="kt">isize</span> <span class="p">{</span><span class="w"></span>
|
||||
<span class="w"> </span><span class="n">syscall</span><span class="p">(</span><span class="n">SYSCALL_WRITE</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="n">fd</span><span class="p">,</span><span class="w"> </span><span class="n">buffer</span><span class="p">.</span><span class="n">as_ptr</span><span class="p">()</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="n">buffer</span><span class="p">.</span><span class="n">len</span><span class="p">()])</span><span class="w"></span>
|
||||
@@ -425,7 +428,9 @@
|
||||
</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="k">struct</span> <span class="nc">Stdout</span><span class="p">;</span><span class="w"></span>
|
||||
<div class="highlight-rust notranslate"><div class="highlight"><pre><span></span><span class="c1">// os/src/console.rs</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>
|
||||
@@ -440,19 +445,30 @@
|
||||
</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="cp">#[macro_export]</span><span class="w"></span>
|
||||
<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>
|
||||
<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="cp">$fmt</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>
|
||||
|
||||
<span class="cp">#[macro_export]</span><span class="w"></span>
|
||||
<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="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>
|
||||
|
||||
<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="o">..</span><span class="p">.</span><span class="w"></span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p>接下来,我们调整一下应用程序,让它发出显示字符串和退出的请求:</p>
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user