未验证 提交 6ce365ae 编写于 作者: wyfcyx_forever's avatar wyfcyx_forever 提交者: GitHub

Merge pull request #27 from DeathWish5/zyr

lab1 lab2 exercise
训练
=====================================================
.. toctree::
:hidden:
:maxdepth: 4
- 本节难度: **低**
彩色化 LOG
-------------------------------
lab1 的工作使得我们从硬件世界跳入了软件世界,当看到自己的小 os 可以在裸机硬件上输出 ``hello world`` 是不是很高兴呢?但是为了后续的一步开发,更好的调试环境也是必不可少的,第一章的练习要求大家实现更加炫酷的彩色log。
详细的原理不多说,感兴趣的同学可以参考 `ANSI转义序列 <https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97>`_ ,现在执行如下这条命令试试
.. code-block:: console
$ echo -e "\x1b[31mhello world\x1b[0m"
如果你明白了我们是如何利用串口实现输出,那么要实现彩色输出就十分容易了,只需要用需要输出的字符串替换上一条命令中的 ``hello world``,用期望颜色替换 ``31(代表红色)`` 即可。
我们推荐实现如下几个等级的输出,输出优先级依次降低:
.. list-table:: log 等级推荐
:header-rows: 1
:align: center
* - 名称
- 颜色
- 用途
* - ERROR
- 红色(31)
- 表示发生严重错误,很可能或者已经导致程序崩溃
* - WARN
- 黄色(93)
- 表示发生不常见情况,但是并不一定导致系统错误
* - INFO
- 蓝色(34)
- 比较中庸的选项,输出比较重要的信息,比较常用
* - DEBUG
- 绿色(32)
- 输出信息较多,在 debug 时使用
* - TRACE
- 灰色(90)
- 最详细的输出,跟踪了每一步关键路径的执行
我们要求输出设定输出等级以及更高输出等级的信息,如设置 ``LOG = INFO``,则输出 ``ERROR``、``WARN``、``INFO`` 等级的信息。简单 demo 如下,输出等级为 INFO:
.. image:: color-demo.png
为了方便使用彩色输出,我们要求同学们实现彩色输出的宏或者函数,用以代替 print 完成输出内核信息的功能,它们有着和 prinf 十分相似的使用格式,要求支持可变参数解析,形如:
.. code-block:: rust
// 这段代码输出了 os 内存空间布局,这到这些信息对于编写 os 十分重要
 
info!(".text [{:#x}, {:#x})", stext as usize, etext as usize);
debug!(".rodata [{:#x}, {:#x})", srodata as usize, erodata as usize);
error!(".data [{:#x}, {:#x})", sdata as usize, edata as usize);
.. code-block:: c
info("load range : [%d, %d] start = %d\n", s, e, start);
在以后,我们还可以在 log 信息中增加线程、CPU等信息(只是一个推荐,不做要求),这些信息将极大的方便你的代码调试。
实验要求
-------------------------------
- 完成实验指导书中的内容,在裸机上实现 ``hello world`` 输出。
- 实现彩色输出宏
- 利用彩色输出宏输出 os 内存空间布局,即:输出 ``.text``、``.data``、``.rodata``、``.bss`` 各段位置,输出等级为 ``INFO``。
实验检查
-------------------------------
- 实验目录要求(Rust)
.. code-block::
├── os(内核实现)
│   ├── Cargo.toml(配置文件)
│   ├── Makefile (要求 make run LOG=xxx 可以正确执行,可以不实现对 LOG 这一属性的支持,设置默认输出等级为 INFO)
│   └── src(所有内核的源代码放在 os/src 目录下)
│   ├── main.rs(内核主函数)
│   ├── ...
├── README.md(其他必要的说明)
├── ...
- 实验目录要求(C)
.. code-block::
├── os(内核实现)
│   ├── Makefile (要求 make run LOG=xxx 可以正确执行,可以不实现对 LOG 这一属性的支持,设置默认输出等级为 INFO)
│   └── ...
├── README.md(其他必要的说明)
├── ...
- 检查
可以正确 ``make run`` 执行,可以看到正确的内存布局输出,根据实现不同数值可能有差异,但应该位于 ``linker.ld`` 中指示 ``BASE_ADDRESS`` 后一段内存,输出之后关机。
tips
-------------------------------
- 对于 Rust, 可以使用 crate ``log``,推荐参考 `rCore <https://github.com/rcore-os/rCore/blob/master/kernel/src/logging.rs>`_
- 对于 C,可以实现不同的函数(注意不推荐多层可变参数解析,有时会出现不稳定情况),也可以参考 `linux printk <https://github.com/torvalds/linux/blob/master/include/linux/printk.h#L312-L385>`_ 使用宏实现代码重用。
- 两种语言都可以使用 ``extern`` 关键字获得在其他文件中定义的符号。
\ No newline at end of file
......@@ -12,4 +12,6 @@
3-1-mini-rt-usrland
3-2-mini-rt-baremetal
4understand-prog
5exercise
训练
=====================================================
.. toctree::
:hidden:
:maxdepth: 4
- 本节难度: **低**
简单安全检查
-------------------------------
lab2 中,我们实现了第一个系统调用 ``sys_write``,这使得我们可以在用户态输出信息。但是 os 在提供服务的同时,还有保护 os 本身以及其他用户程序不受错误或者恶意程序破坏的功能。
由于还没有实现虚拟内存,我们可以在用户程序中指定一个属于其他程序字符串,并将它输出,这显然是不合理的,因此我们要对 sys_write 做检查:
- sys_write 仅能输出位于程序本身内存空间内的数据,否则报错。
实验要求
-------------------------------
- 完成实验指导书中的内容,能运行用户态程序并执行 sys_write 系统调用。
- 通过 `Rust测例 <https://github.com/DeathWish5/rCore_tutorial_tests>`_ 或者 `C测例 <https://github.com/DeathWish5/riscvos-c-tests>`_ 中 chapter2 对应的所有测例,测例详情见对应仓库。
实验检查
-------------------------------
- 实验目录要求(Rust)
.. code-block::
├── os(内核实现)
│   ├── Cargo.toml(配置文件)
│   ├── Makefile (要求 make run 可以正确执行,尽量不输出调试信息)
│   ├── src(所有内核的源代码放在 os/src 目录下)
│   ├── main.rs(内核主函数)
│   ├── ...
├── build.rs (在这里实现用户程序的打包)
├── README.md(其他必要的说明)
├── ...
参考示例目录结构。目标用户目录 ``../user/build/bin``。
- 实验目录要求(C)
目录要求不变。同样在 os 目录下 ``make run`` 之后可以正确加载用户程序并执行。
参考示例目录结构。目标用户目录 ``../user/target/bin``。
- 检查
可以正确 ``make run`` 执行,可以正确执行目标用户测例,并得到预期输出(详见测例注释)。
备注
-------------------------------
正确进入 U 态后,程序的特征还应有:使用 S 态特权指令,访问 S 态寄存器后会报错。目前由于 RustSBI 自身设计的问题,这些错误会直接导致 M 态崩溃,故而难以测试,同学们可以自行测试这些内容(`参考前三个测例 <https://github.com/DeathWish5/rCore_tutorial_tests/tree/master/user/src/bin>`_)。
......@@ -11,4 +11,5 @@
2application
3batch-system
4trap-handling
5exercise
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册