diff --git "a/source/_posts/2024-\347\247\213\345\206\254\345\255\243-rcore\351\230\266\346\256\265\344\272\214blog-\346\235\216\345\275\246\346\263\275.md" "b/source/_posts/2024-\347\247\213\345\206\254\345\255\243-rcore\351\230\266\346\256\265\344\272\214blog-\346\235\216\345\275\246\346\263\275.md" new file mode 100644 index 0000000000..09a6fb0e3b --- /dev/null +++ "b/source/_posts/2024-\347\247\213\345\206\254\345\255\243-rcore\351\230\266\346\256\265\344\272\214blog-\346\235\216\345\275\246\346\263\275.md" @@ -0,0 +1,31 @@ +--- +title: 2024 秋冬季 rcore阶段二blog 李彦泽 +date: 2024-11-08 19:33:49 +tags: +--- + +在阶段二让我对操作系统和rust有了更加深刻的理解 + +## 操作系统部分 + +其实我是有linux内核和驱动的开发经验的,所以对虚拟地址、物理地址、页表、等等知识都是有接触的,但是主要还是停留在书本或者内核提供的api,这五次作业,让我用rust这门最开始接触的语言来实现底层,也还是难度不小。 + +最开始的页表啊、映射啊、以及一些环境搭建还有git使用对我来说基本没有难度,但是到了第四个lab和第五个lab就开始难了。 + +文件系统:这个本身我对其就没有太清楚的了解过内部结构,只是会用,这次lab4的作业,强制我要去看源码实现,对超级区块,以及bitmap管理分配的索引,以及bitmap管理内容区块,再到系统层面通过OSInode来管理每个文件的inode,以及管理到物理磁盘上的inode,以及文件名啥的相互联系,让我从底层的磁盘到上层OS的管理链路有了比较清晰的认识,并且对rust的使用有了更加深刻的理解(没错,特指生命周期,和mut ref),因为这两个没少出现借用的问题。 + +死锁检测:这个部分也是耗时很长,其实我认为这部分的理解不难,因为我很早就接触了锁、信号量这些,我觉得这部分最难的在于调试。由于是并发编程,遇到的情况千奇百怪,以及难以定位。所以我写了很多的log,并且以非常人性化的输出来查看,虽然这部分耗时比较久,但是打好log对后续的开发是如虎添翼。也不会有陷入log中无法自拔的问题。并且通过实现了这个算法,算是开辟了新的知识点,以前从来没有想到还能死锁检测。 + +## 对同学的建议 + +总的来说难度不小,并且其实资料是比较有限的(对于无从下手的新手来说),所以如果卡关了还是要多去搜索资料,以及看源码(这个很重要),去看具体的实现,以及画流程图和结构体之间的关系图,以及标注重要的api(找到合适的api可以事半功倍) + +## 对项目建议 + +总的来说操作系统的重点都有涉及,知识面还是很充足的!! + +但是在编写过程中明显感觉到由于前向兼容导致测试用例的编译越到后期越慢,每次run光编译就会花费一分钟,其实可以优化makefile来单独编译某些测例来减少测试开发的时间。 + +以及最后两个lab难度上升有点大,并且文章 中是对功能的描述居多(很多对于实验有用的点会被淹没在其中)虽然在边做lab边反复查看资料时可以发现,但是对于没有接触过的同学可能很多api看过就没印象了,在后续做lab中也找不到,所以可以适当增加一下强调或者提示,来减少难度增加坡度。 + +最后还可以收集一下大家的调试方法,这样对于后续对debug无从下手的同学也有参考意义。 diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog.md" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog.md" new file mode 100644 index 0000000000..7aecd913a3 --- /dev/null +++ "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog.md" @@ -0,0 +1,192 @@ +--- +title: 李彦泽-阶段三blog +date: 2024-12-01 21:57:58 +tags: +--- + +# 宏内核 + +到宏内核的特点就是: +1. syscall +2. app和kernel分离 + 1. 特权级分离 + 2. 独立空间 + 3. 可以加载应用 + +用户空间降级方式:伪造返回现场到新任务, sret +过程: +1. 初始化用户栈 +2. 创建新任务 +3. 让出CPU + +--- + +### 几个重要的点 +#### 1. 任务扩展属性 +将调度属性和资源属性分离,从而复用调度组件 + +{% asset_img 1732863170214_d.png 李彦泽-阶段三blog %} + +--- +#### 2. 系统调用 +用的是linkme这个库 +`linkme` 是一个 Rust 的库,主要用于在编译期将数据链接到程序的特定部分(如全局变量),从而实现类似插件或模块化的功能。它可以动态扩展程序的功能,而无需显式修改原始代码。以下是对 `linkme` 的详细介绍,包括其用法和原理。 + +##### 核心功能 + +`linkme` 提供了一种机制,使多个 Rust 模块中的静态变量可以被聚合到一个全局列表中。常见的使用场景包括: + +1. **插件系统**:收集并注册动态功能。 +2. **初始化系统**:在程序启动时执行一系列初始化函数。 +3. **静态配置集合**:在不同的模块中定义配置项,并将它们汇总到一个位置。 +##### 使用方法 +###### 1. 添加依赖 +在 `Cargo.toml` 中添加: +``` +`[dependencies] linkme = "0.3"` +``` +###### 2. 定义集合 + +使用 `#[linkme::distributed_slice]` 定义一个全局的切片,用于收集静态变量。例如: + +```rust +use linkme::distributed_slice; +#[distributed_slice] +pub static MY_SLICE: [fn()] = [..];` +``` + +这里,`MY_SLICE` 是一个切片,它的类型是 `fn()`,表示可以存放多个函数指针。 + +###### 3. 添加元素 + +在其他模块中,使用 `#[distributed_slice]` 将元素插入到切片中: +```rust +use linkme::distributed_slice; + +#[distributed_slice(MY_SLICE)] +static FIRST_FUNCTION: fn() = || println!("First function"); + +#[distributed_slice(MY_SLICE)] +static SECOND_FUNCTION: fn() = || println!("Second function"); +``` + +###### 4. 使用切片 + +在程序中,你可以遍历切片的所有元素,并执行对应逻辑: +```rust +fn main() { + for func in MY_SLICE { + func(); + } +} +``` + +得到 +``` +First function +Second function +``` +##### 原理解析 + +`linkme` 的实现基于 Rust 的链接器特性和目标平台的支持。以下是其工作原理: +1. **分布式切片的定义**: + - `#[distributed_slice]` 宏定义了一个全局符号,分配了一段内存区域,专门用于存储相关的元素。 +2. **分段存储**: + - 每次使用 `#[distributed_slice]` 添加元素时,`linkme` 会将这些元素放置到编译产物的特定段(section)中。 +3. **链接器聚合**: + - 链接器在链接阶段会将所有模块中定义的元素合并到一个段中,使得这些元素在运行时可以统一访问。 + +### 课后题 + +1. 注册 PAGE_FAULT +2. 完善注册函数 + 1. 获得当前的task + 2. 得到aspace + 3. 调用其handle_page_fault方法填充 + +{% asset_img Pasted%20image%2020241129150239.png answer %} + + +## 第二节 + +内存管理方式: +{% asset_img 1732877291289_d.png img %} +其他的和rcore很像,最后会在backend中处理映射 +- alloc(支持lazy) +- linear (连续映射) + +lazy映射:先map出虚拟地址但是没有关联物理地址,在page fault后在处理函数中多次嵌套调用handle,最后在aspace中完成关联 + +### 课后题 + +mmap的实现和page fault的处理很像, + +1. 找到一个free的va(最开始这里卡了很久) +2. 读取文件内容,填充到buffer +3. map alloc出一个页 +4. 用buffer填充这个页 + +{% asset_img Pasted%20image%2020241129182524.png answer %} + +# hypervisor + +## 第一节 + +hypervisor和虚拟机的区别是:支撑其物理运行的体系结构和其虚拟运行的环境是否一样(**同构**). 所以hypervisor比虚拟机更加高效. + +我的理解,hypervisor也是一种类似于OS软件,如果是U的指令可以直接执行,如果需要特权级就在hypervisor中捕获处理. +hypervisor的扩展指令也是为了加速这个过程 + +资源管理: +1. vcpu(直接绑定到一个CPU) +2. vmem(提供自己的页表转换) +3. vdevice(virtual io/ 直接映射 / 模拟) +4. vutilities(中断/总线..) + +### 练习题 + +panic将系统shut,所以需要去掉panic改成(ax_println!),然后将sepc+4跳转到下一个指令,再设置一下a0,a1的值就可以了 + +![](attachment/Pasted%20image%2020241127182957.png) + +## 第二节 +![](attachment/1732793326547_d.png) + +主要学习了两段映射 +1. Guest缺页,guset os向hypervisor查找 +2. hypervisor也缺页,向实际物理机申请 + +第二的部分有两个模式 +1. 透传 +2. 模拟 + +透传:直接把宿主物理机(即qemu)的pflash透传给虚拟机。(快 捆绑设备) +模拟:模拟一个pflash,当读取的时候传递(慢 不依赖硬件) +![](attachment/1732793674957_d.png) + + +**切换** +![](attachment/1732793492927_d.png) +具体的汇编: +![](attachment/1732793589062_d.png) + +![](attachment/1732793630945_d.png) + + +### 练习题 +将pflash.img写入img的/sbin/下后,在 `h_2_0/src/main.rc` 中将其read出来,然后将第一页的内容填充到buf中,aspace.write进去就可 +![](attachment/Pasted%20image%2020241128181025.png) + + +## 第三节课 +实验课正在做 + +### 虚拟时钟 + +总的思路是:通过关键的寄存器hvip中的VSTIP(时钟中断)来向hypervisor响应虚拟机的设置时钟中断,然后当时钟中断来的时候退出vm,并重新设置时钟中断hvip,回到vm处理. + +### 宏内核的支持 + +主要是flash这种设备的处理,这个在前一个的实验中已经解决了. + +虚拟设备管理:通过mmio,注册device的地址,当发生page fault的时候判断一下,如果是在mem中则正常处理,如果是在device则去对应的设备处理. diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793326547_d.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793326547_d.png" new file mode 100644 index 0000000000..7ea8ffd44d Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793326547_d.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793492927_d.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793492927_d.png" new file mode 100644 index 0000000000..a3879ff178 Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793492927_d.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793589062_d.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793589062_d.png" new file mode 100644 index 0000000000..9405e8dc0e Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793589062_d.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793630945_d.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793630945_d.png" new file mode 100644 index 0000000000..951849137a Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793630945_d.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793674957_d.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793674957_d.png" new file mode 100644 index 0000000000..b8d92df88e Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732793674957_d.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732863170214_d.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732863170214_d.png" new file mode 100644 index 0000000000..5b1a2834a2 Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732863170214_d.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732877291289_d.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732877291289_d.png" new file mode 100644 index 0000000000..a80e834712 Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/1732877291289_d.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241127182957.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241127182957.png" new file mode 100644 index 0000000000..cf2b49d9f3 Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241127182957.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241128181025.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241128181025.png" new file mode 100644 index 0000000000..6bbfc3c562 Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241128181025.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241129150239.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241129150239.png" new file mode 100644 index 0000000000..7a0d5effa2 Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241129150239.png" differ diff --git "a/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241129182524.png" "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241129182524.png" new file mode 100644 index 0000000000..e2a0bef6f9 Binary files /dev/null and "b/source/_posts/\346\235\216\345\275\246\346\263\275-\351\230\266\346\256\265\344\270\211blog/Pasted image 20241129182524.png" differ