merge master, minor update
This commit is contained in:
commit
2da79e21db
|
@ -85,7 +85,8 @@ C 开发环境配置
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
cd /usr/local
|
cd /usr/local
|
||||||
sudo wget https://more.musl.cc/9.2.1-20190831/x86_64-linux-musl/riscv64-linux-musl-cross.tgz
|
sudo wget https://cloud.tsinghua.edu.cn/f/b07bac9bcfa14f1dae66/?dl=1 && mv index.html\?dl\=1 riscv64-linux-musl-cross.tgz
|
||||||
|
|
||||||
tar xzvf riscv64-linux-musl-cross.tgz
|
tar xzvf riscv64-linux-musl-cross.tgz
|
||||||
|
|
||||||
将路径添加到PATH之中:
|
将路径添加到PATH之中:
|
||||||
|
|
|
@ -250,14 +250,13 @@ syscall 标准定义如下:
|
||||||
|
|
||||||
为了避免 S 特权级时钟中断被屏蔽,我们需要在执行第一个应用之前进行一些初始化设置:
|
为了避免 S 特权级时钟中断被屏蔽,我们需要在执行第一个应用之前进行一些初始化设置:
|
||||||
|
|
||||||
.. code-block:: rust
|
.. code-block:: c
|
||||||
:linenos:
|
:linenos:
|
||||||
:emphasize-lines: 9,10
|
:emphasize-lines: 9,10
|
||||||
|
|
||||||
// os/src/main.rs
|
// os/main.c
|
||||||
|
|
||||||
#[no_mangle]
|
void main{
|
||||||
pub fn rust_main() -> ! {
|
|
||||||
// ...
|
// ...
|
||||||
timer_init();
|
timer_init();
|
||||||
// ...
|
// ...
|
||||||
|
|
|
@ -127,6 +127,7 @@ lab3中我们引入了任务调度的概念,可以在不同任务之间切换
|
||||||
-------------------------------
|
-------------------------------
|
||||||
- pdf 格式,CI 网站提交,注明姓名学号。
|
- pdf 格式,CI 网站提交,注明姓名学号。
|
||||||
- 注意目录要求,报告命名 ``lab1.pdf``,位于 ``reports`` 目录下。命名错误视作没有提交。后续实验同理。
|
- 注意目录要求,报告命名 ``lab1.pdf``,位于 ``reports`` 目录下。命名错误视作没有提交。后续实验同理。
|
||||||
|
- 简单总结本次实验你新添加的代码。
|
||||||
- 完成问答问题。
|
- 完成问答问题。
|
||||||
|
|
||||||
+ ch1: ch1问答作业_ 。
|
+ ch1: ch1问答作业_ 。
|
||||||
|
|
|
@ -122,6 +122,7 @@ tips:
|
||||||
--------------------------------------------------------
|
--------------------------------------------------------
|
||||||
- pdf 格式,CI 网站提交,注明姓名学号。
|
- pdf 格式,CI 网站提交,注明姓名学号。
|
||||||
- 注意目录要求,报告命名 ``lab2.pdf``,位于 ``reports`` 目录下。命名错误视作没有提交。不需要删除 ``ch3.pdf``。后续实验同理。
|
- 注意目录要求,报告命名 ``lab2.pdf``,位于 ``reports`` 目录下。命名错误视作没有提交。不需要删除 ``ch3.pdf``。后续实验同理。
|
||||||
|
- 简单总结本次实验你新添加的代码。
|
||||||
- 完成 ch4 问答作业。
|
- 完成 ch4 问答作业。
|
||||||
- [可选,不占分]你对本次实验设计及难度的看法。
|
- [可选,不占分]你对本次实验设计及难度的看法。
|
||||||
|
|
|
@ -69,7 +69,7 @@ tips:
|
||||||
如果 fork() 之后一定主程序先运行结果如何?如果 fork() 之后一定 child 先运行结果如何?
|
如果 fork() 之后一定主程序先运行结果如何?如果 fork() 之后一定 child 先运行结果如何?
|
||||||
|
|
||||||
|
|
||||||
4. 请分析如下程序运行后最终输出 `A` 的数量(已知 ``||`` 的优先级比 ``&&`` 高):
|
4. 请分析如下程序运行后最终输出 `A` 的数量(已知 ``&&`` 的优先级比 ``||`` 高):
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
|
@ -88,4 +88,4 @@ tips:
|
||||||
|
|
||||||
- 注明姓名学号。
|
- 注明姓名学号。
|
||||||
- 完成 ch5 问答作业。
|
- 完成 ch5 问答作业。
|
||||||
- [可选,不占分]你对本次实验设计及难度的看法。
|
- [可选,不占分]你对本次实验设计及难度的看法。
|
||||||
|
|
|
@ -167,5 +167,6 @@ tips:
|
||||||
报告内容:
|
报告内容:
|
||||||
|
|
||||||
- 注明姓名学号。
|
- 注明姓名学号。
|
||||||
|
- 简单总结本次实验你新添加的代码。
|
||||||
- 完成 ch6 问答作业。
|
- 完成 ch6 问答作业。
|
||||||
- [可选,不占分]你对本次实验设计及难度的看法。
|
- [可选,不占分]你对本次实验设计及难度的看法。
|
|
@ -19,33 +19,7 @@ chapter7练习
|
||||||
|
|
||||||
你的电脑桌面是咋样的?是放满了图标吗?反正我的 windows 是这样的。显然很少人会真的把可执行文件放到桌面上,桌面图标其实都是一些快捷方式。或者用 unix 的术语来说:软链接。为了减少工作量,我们今天来实现软链接的兄弟: `硬链接 <https://en.wikipedia.org/wiki/Hard_link>`_ 。
|
你的电脑桌面是咋样的?是放满了图标吗?反正我的 windows 是这样的。显然很少人会真的把可执行文件放到桌面上,桌面图标其实都是一些快捷方式。或者用 unix 的术语来说:软链接。为了减少工作量,我们今天来实现软链接的兄弟: `硬链接 <https://en.wikipedia.org/wiki/Hard_link>`_ 。
|
||||||
|
|
||||||
硬链接要求两个不同的目录项指向同一个文件,在我们的文件系统中也就是两个不同名称目录项指向同一个磁盘块。本节要求实现三个系统调用 ``sys_linkat、sys_unlinkat、sys_stat`` 。注意在测例中 ``sys_open`` 的接口定义也发生了变化。
|
硬链接要求两个不同的目录项指向同一个文件,在我们的文件系统中也就是两个不同名称目录项指向同一个磁盘块。本节要求实现三个系统调用 ``sys_linkat、sys_unlinkat、sys_stat`` 。
|
||||||
|
|
||||||
**open**
|
|
||||||
|
|
||||||
- syscall ID: 56
|
|
||||||
- 功能:打开一个文件,并返回可以访问它的文件描述符。
|
|
||||||
- 接口: ``int open(int dirfd, char* path, unsigned int flags, unsigned int mode);``
|
|
||||||
- 参数:
|
|
||||||
- **dirfd** : 仅为了兼容性考虑,本次实验中始终为 AT_FDCWD (-100)。可以忽略。
|
|
||||||
- **path** 描述要打开的文件的文件名(简单起见,文件系统不需要支持目录,所有的文件都放在根目录 ``/`` 下)
|
|
||||||
- **flags** 描述打开文件的标志,具体含义(其他参数不考虑):
|
|
||||||
|
|
||||||
.. code-block:: c
|
|
||||||
|
|
||||||
#define O_RDONLY 0x000
|
|
||||||
#define O_WRONLY 0x001
|
|
||||||
#define O_RDWR 0x002 // 可读可写
|
|
||||||
#define O_CREATE 0x200
|
|
||||||
|
|
||||||
- **mode** 仅在创建文件时有用,表示创建文件的访问权限,为了简单,本次实验中中统一为 *O_RDWR* 。
|
|
||||||
- 说明:
|
|
||||||
- 有 create 标志但文件存在时,忽略 create 标志,直接打开文件。
|
|
||||||
- 返回值:如果出现了错误则返回 -1,否则返回可以访问给定文件的文件描述符。
|
|
||||||
- 可能的错误:
|
|
||||||
- 文件不存在且无 create 标志。
|
|
||||||
- 标志非法(低两位为 0x3)
|
|
||||||
- 打开文件数量达到上限。
|
|
||||||
|
|
||||||
**linkat**:
|
**linkat**:
|
||||||
|
|
||||||
|
@ -82,39 +56,29 @@ chapter7练习
|
||||||
|
|
||||||
* syscall ID: 80
|
* syscall ID: 80
|
||||||
* 功能:获取文件状态。
|
* 功能:获取文件状态。
|
||||||
* C接口: ``int fstat(int fd, struct Stat* st)``
|
* 接口: ``int fstat(int fd, struct Stat* st)``
|
||||||
* Rust 接口: ``fn fstat(fd: i32, st: *mut Stat) -> i32``
|
|
||||||
* 参数:
|
* 参数:
|
||||||
* fd: 文件描述符
|
* fd: 文件描述符
|
||||||
* st: 文件状态结构体
|
* st: 文件状态结构体
|
||||||
|
|
||||||
.. code-block:: rust
|
.. code-block:: c
|
||||||
|
|
||||||
#[repr(C)]
|
struct Stat {
|
||||||
#[derive(Debug)]
|
uint64 dev, // 文件所在磁盘驱动号,该实现写死为 0 即可。
|
||||||
pub struct Stat {
|
uint64 ino, // inode 文件所在 inode 编号
|
||||||
/// 文件所在磁盘驱动号,该实现写死为 0 即可。
|
uint32 mode, // 文件类型
|
||||||
pub dev: u64,
|
uint32 nlink, // 硬链接数量,初始为1
|
||||||
/// inode 文件所在 inode 编号
|
uint64 pad[7], // 无需考虑,为了兼容性设计
|
||||||
pub ino: u64,
|
|
||||||
/// 文件类型
|
|
||||||
pub mode: StatMode,
|
|
||||||
/// 硬链接数量,初始为1
|
|
||||||
pub nlink: u32,
|
|
||||||
/// 无需考虑,为了兼容性设计
|
|
||||||
pad: [u64; 7],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 文件类型只需要考虑:
|
||||||
|
#define DIR 0x040000 // directory
|
||||||
|
#define FILE 0x100000 // ordinary regular file
|
||||||
|
|
||||||
/// StatMode 定义:
|
* 返回值:如果出现了错误则返回 -1,否则返回 0。
|
||||||
bitflags! {
|
* 可能的错误
|
||||||
pub struct StatMode: u32 {
|
* fd 无效。
|
||||||
const NULL = 0;
|
* st 地址非法。
|
||||||
/// directory
|
|
||||||
const DIR = 0o040000;
|
|
||||||
/// ordinary regular file
|
|
||||||
const FILE = 0o100000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
正确实现后,你的 os 应该能够正确运行 ch7_file* 对应的测试用例,在 shell 中执行 ch7_usertest 来执行测试。
|
正确实现后,你的 os 应该能够正确运行 ch7_file* 对应的测试用例,在 shell 中执行 ch7_usertest 来执行测试。
|
||||||
|
|
||||||
|
@ -137,5 +101,6 @@ Tips
|
||||||
报告要求
|
报告要求
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
- 注明姓名学号。
|
- 注明姓名学号。
|
||||||
|
- 简单总结本次实验你新添加的代码。
|
||||||
* 完成 ch7 问答问题
|
* 完成 ch7 问答问题
|
||||||
* (optional) 你对本次实验设计及难度的看法。
|
* (optional) 你对本次实验设计及难度的看法。
|
Loading…
Reference in New Issue