From cd02afc8fff0c10d971988631f1dfb5b23206b2e Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Sat, 27 Feb 2021 14:58:54 +0800 Subject: [PATCH] update asm code for syscall & sbicall --- source/chapter1/3-1-mini-rt-usrland.rst | 2 ++ source/chapter1/3-2-mini-rt-baremetal.rst | 13 +++++++++++++ source/chapter2/2application.rst | 3 +-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/source/chapter1/3-1-mini-rt-usrland.rst b/source/chapter1/3-1-mini-rt-usrland.rst index dbda626..15b4e21 100644 --- a/source/chapter1/3-1-mini-rt-usrland.rst +++ b/source/chapter1/3-1-mini-rt-usrland.rst @@ -109,6 +109,8 @@ 先了解一下,操作系统会提供一个退出的系统调用服务接口,但应用程序调用这个接口,那这个程序就退出了。这里先给出代码: +.. _term-llvm-syscall: + .. code-block:: rust // os/src/main.rs diff --git a/source/chapter1/3-2-mini-rt-baremetal.rst b/source/chapter1/3-2-mini-rt-baremetal.rst index f2ecd6f..1cbf635 100644 --- a/source/chapter1/3-2-mini-rt-baremetal.rst +++ b/source/chapter1/3-2-mini-rt-baremetal.rst @@ -121,10 +121,21 @@ 如果在裸机上的应用程序执行完毕并通知操作系统后,那么“三叶虫”操作系统就没事干了,实现正常关机是一个合理的选择。所以我们要让“三叶虫”操作系统能够正常关机,这是需要调用SBI提供的关机功能 ``SBI_SHUTDOWN`` ,这与上一节的 ``SYSCALL_EXIT`` 类似, 只是在具体参数上有所不同。在上一节完成的没有显示功能的用户态最小化执行环境基础上,修改后的代码如下: +.. _term-llvm-sbicall: + .. code-block:: rust // bootloader/rustsbi-qemu.bin 直接添加的SBI规范实现的二进制代码,给操作系统提供基本支持服务 + // os/src/sbi.rs + fn sbi_call(which: usize, arg0: usize, arg1: usize, arg2: usize) -> usize { + let mut ret; + unsafe { + llvm_asm!("ecall" + : "={x10}" (ret) + : "{x10}" (arg0), "{x11}" (arg1), "{x12}" (arg2), "{x17}" (which) + ... + // os/src/main.rs const SBI_SHUTDOWN: usize = 8; @@ -139,6 +150,8 @@ } + + 也许有同学比较迷惑,应用程序访问操作系统提供的系统调用的指令是 ``ecall`` ,操作系统访问 RustSBI提供的SBI服务的SBI调用的指令也是 ``ecall`` 。 这其实是没有问题的,虽然指令一样,但它们所在的特权级和特权级转换是不一样的。简单地说,应用程序位于最弱的用户特权级(User Mode),操作系统位于 diff --git a/source/chapter2/2application.rst b/source/chapter2/2application.rst index 7ea7490..f671cbe 100644 --- a/source/chapter2/2application.rst +++ b/source/chapter2/2application.rst @@ -185,8 +185,7 @@ Rust 中的 ``llvm_asm!`` 宏的完整格式如下: 第 10 行用于告知编译器将我们在程序中给出的嵌入汇编代码保持原样放到最终构建的可执行文件中。如果不这样做的话,编译器可能会把它和其他代码 一视同仁并放在一起进行一些我们期望之外的优化。为了保证语义的正确性,一些比较关键的汇编代码需要加上该选项。 -第一章中的输出到屏幕的操作也同样是使用内联汇编调用 SEE 提供的 SBI 接口来实现的。有兴趣的读者可以回顾第一章的 ``console.rs`` 和 -``sbi.rs`` 。 +上面这一段汇编代码的含义和内容与第一章中的 :ref:`第一章中U-Mode应用程序中的系统调用汇编代码 ` 的是一致的。与 :ref:`第一章中的RustSBI输出到屏幕的SBI调用汇编代码 ` 涉及的汇编指令一样,但传递参数的寄存器的含义是不同的。有兴趣的读者可以回顾第一章的 ``console.rs`` 和 ``sbi.rs`` 。 .. note:: -- GitLab