-
Notifications
You must be signed in to change notification settings - Fork 437
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
ZIYAN137
authored and
ZIYAN137
committed
Nov 30, 2024
1 parent
d678ab9
commit d4ac212
Showing
1 changed file
with
84 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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\<const PAGE_SIZE: usize\>添加了 | ||
start, end, b_pos, p_pos, count等属性 | ||
|
||
查看 https://github.com/arceos-org/allocator 所提供的trait,为EarlyAllocator\<const PAGE_SIZE: usize\>实现了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先放放 |