diff --git "a/source/_posts/2024\347\247\213\345\206\254\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\344\270\211\351\230\266\346\256\265\345\255\246\344\271\240\346\200\273\347\273\223\346\212\245\345\221\212-\351\242\234\347\206\231\347\202\206.md" "b/source/_posts/2024\347\247\213\345\206\254\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\344\270\211\351\230\266\346\256\265\345\255\246\344\271\240\346\200\273\347\273\223\346\212\245\345\221\212-\351\242\234\347\206\231\347\202\206.md" new file mode 100644 index 0000000000..d7a9eff8c6 --- /dev/null +++ "b/source/_posts/2024\347\247\213\345\206\254\345\255\243\345\274\200\346\272\220\346\223\215\344\275\234\347\263\273\347\273\237\350\256\255\347\273\203\350\220\245\344\270\211\351\230\266\346\256\265\345\255\246\344\271\240\346\200\273\347\273\223\346\212\245\345\221\212-\351\242\234\347\206\231\347\202\206.md" @@ -0,0 +1,84 @@ +--- +title: 2024秋冬季开源操作系统训练营三阶段学习总结报告-颜熙炆 +date: 2024-11-30 13:15:00 +categories: + - report +tags: + - author: ZIYAN137 +--- + +# 组件化操作系统 + +## 为什么需要组件化操作系统 + 操作系统的组件化,可以面向不同的应用场景构建不同的操作系统。组件化内核项目相当于“工厂”,组件相当于“零件”。我们只需要按需组装即可。 + +## 组件化操作系统相较于传统构建方式的优势 + +### 1. 使开发和维护更加简单 + 因为操作系统的功能被良好地封装到各个组件组件中,只需要提供和调用接口即可。并且组件之间耦合度更低,维护起来更为方便 +### 2. 便于协作 + 由于操作系统的功能被良好地封装到各个组件组件中,不同的团队只需要专注于自己所负责的组件,最后再集成即可,便于协作式地开发 + +# Unikernel + +## Unikernel的特点 +1. 应用与内核处于同一特权级(均为内核态),共享地址空间。Unikernel既是内核又是应用,二者合为一体 +2. 优点: 应用与内核之间没有隔离和切换,简单高效 +3. 缺点: 同样因为没有隔离和切换,所以安全性较低 + +## 课后练习1: 支持带颜色的打印输出 + +使用ANSI颜色控制即可 + +## 课后练习2:支持HashMap类型 + +直接从crate上引入hashbrown(本来不是很想重复造轮子,于是想着先引入,以后有空了再自己搓,但是截止至本篇blog写下后都还没去搓) + +## 课后练习3: 为内存分配器实现新的内存算法bump + +根据所提供的注释,我们为EarlyAllocator\添加了 +start, end, b_pos, p_pos, count等属性 + +查看 https://github.com/arceos-org/allocator 所提供的trait,为EarlyAllocator\实现了BaseAllocator, ByteAllocator 和 PageAllocator等trait即可 + +## 课后练习4: 增加对rename和mv的支持 + +参数的基础检查在此不赘述 + +rename直接调用API fs::rename 就行了。 + +mv的话。我们判断第二个参数dst是否是一个目录。如果是的话, +根据UNIX哲学,我们直接把文件src读进buf,然后在对应的路径下写下去,删除原来的文件就行了(简单粗暴)。 + +# 宏内核 + +## 宏内核的特点 + +相对于Unikernel,宏内核的特点: +1. 增加一个权限较低的用户特权级来运行应用。 +2. 为应用创建独立的用户地址空间,与内核隔离。 +3. 内核运行时可以随时加载应用Image投入运行。 +4. 应用与内核界限分明。 + + +## 课后练习5: 处理缺页异常 + +得到当前task的ext,将其aspace上锁后,调用aspace的handle_page_fault即可。 + +## 课后练习6: 为宏内核支持sys_mmap系统调用,实现对文件的映射 + +从当前task的aspace中调用find_free_area, 得到长度为length的addr_src, 然后进行4k对齐,同时,对length进行对齐得到size。 + +prot和flags 通过调用 MmapProt::from_bits_truncate(prot), MmapFlags::from_bits_truncate(flags)得到, +需要的mappingFlags就from(prot)即可。 + +调用aspace的map_alloc方法。 + +之后我们处理一下MmapFlags::MAP_ANONYMOUS。如果我们的flags中含有这个flag,那么我们就直接返回 + +如果没有MmapFlags::MAP_ANONYMOUS。则通过get_file_like得到我们所需的文件,并将其读取进入buf,然后写入aspace。 + +(由于之前配环境的时候没将所需的编译器export到bash中,所以build payload的时候出了点问题: 错误消息表明 riscv64-linux-musl-gcc 编译器未找到。) + +# Hypervisor +// TODO: 由于学业繁忙,第三阶段的最后一周的课都没跟,Hypervisor先放放