rust-based-os-comp2022
rust-based-os-comp2022 copied to clipboard
[2022开源操作系统训练营](https://learningos.github.io/rust-based-os-comp2022/)
直觉上task模块只需要提供当前task的信息就好了,然后处理都放在syscall中。可是由于TASK_MANAGER要exclusive access,对于不想要拷贝只想引用的task信息,比如当前task的memset,就没法返回引用,比如以下简化的代码就会有问题 ``` fn get_cur_memset() -> &memset { let inner = TASK_MANAGER.exclusive_access(); & inner.cur_task.memset } ``` 这就导致一堆syscall的东西必须放在task里面,感觉不太好 我的尝试: ``` fn get_cur_memset(inner: &'a appmanager_inner) -> &'a memset { ... } ```...
# chapter4练习 - Open-Source-OS-Training-Camp-2022 文档 [https://learningos.github.io/rust-based-os-comp2022/chapter4/7exercise.html](https://learningos.github.io/rust-based-os-comp2022/chapter4/7exercise.html)
### 疑问一:git clone 了lab0-0项目,并make setupclassroom_test1,貌似实验是不是就算是完成了?  ### 疑问二:根据[lab0-0实践初始化设置](https://learningos.github.io/rust-based-os-comp2022/chapter1/0intro.html#id4)按照每章节操作一遍,即为lab0-0的实验完成吗? #### 感觉lab貌似没有题目做,怕自己是不是别搞错了。
官方给的Dockerfile,其实已经比较完善了。但是,对于Ubuntu,个人觉得_Ubuntu官方的源_还是比较慢(如果不挂代理),如果网络不稳定,就很难完成环境部署,我在项目的根目录下创建了一个`docker/registryList`,用来存放自定义(就近)的镜像列表,然后在`update`前加入 ```sh ADD docker/registryList /etc/apt/ RUN sed -i.bak "1r /etc/apt/registryList" /etc/apt/sources.list ``` 这样,在`make build_docker`的时候,就可以在系统`update`前,加入比较快和稳定的源。
> 这个地方其实衍生与我在阅读这两个地方的时候(https://learningos.github.io/rust-based-os-comp2022/chapter1/4mini-rt-baremetal.html and https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter1/3first-instruction-in-kernel1.html) > 疑问点在于具体的操作内容(可能以下内容严重暴露了我知识体系的不足,请大佬们见谅) 1. 根据rCore手册中所表示的内容,我们应当传入一个内存镜像(牵涉到丢弃内核可执行文件中的元数据得到内核镜像的内容) > 这个地方我的理解就是我们会传入一堆二进制编码信息 2. ([调整内核的内存布局](https://rcore-os.github.io/rCore-Tutorial-Book-v3/chapter1/4first-instruction-in-kernel2.html#id4))章节表示*链接器所生成的默认内存布局不一定能符合我们的需要,在此需要通过Linker Script 来对于链接器的行为进行调整,使得最终生成的ELF文件(可执行文件)的布局符合我们的预期,在此修改Cargo的配置文件以使用我们的链接方案* 3. 以及[正确配置栈空间布局](https://learningos.github.io/rust-based-os-comp2022/chapter1/4mini-rt-baremetal.html#id5)部分的,通过内联汇编代码实现的,我们对于内存的一个划分要求 4.  **问题**:基于以上的几种材料,我们能否认为,在整个的操作流程中,我们是按照以下顺序进行的呢? 1. rustc (以一种我目前不了解的方式)将可能需要用到的文件组件*全部*转化成为汇编语言文件 2. 在main文件`_start`之前通过`asm!`实现的汇编代码调用`core::arch::global_asm!(include_str!("entry.asm"));`实现对于栈内存的分配 3. 根据图片4类似的方法,cargo实现了链接操作,具体操作就相当于将各个文件的各个段按照链接文件中与asm中目标文件的符号表中的全局符号进行分配? 4. 最终链接成为一个ELF文件,经过`rust-objcopy`剔除其中的元数据,得到内存镜像(二进制文件?) 5. 然后再整个加载到`0x80200000`,也就是Rustsbi硬件初始化完成之后的位置中...
生命周期中的HRTB,概括地说,应该用于哪些场景呢? 我知道在如下的场景中: ``` fn foo &'a i32, { let x = 0; f(&x); //error: `x` does not live long enough } ``` 应该使用HRTB: ``` fn foo(f: T) where for &'a...
 请问这是什么问题?
git 命令提交之后点击实验仓库repo:  如果这里是绿色的对号则提交的实验已通过,表明完成此项实验