From 443d852a787fe5d2de4942e8f30ec3c901749b56 Mon Sep 17 00:00:00 2001 From: ysyx_22051213-Zhang Yuchi Date: Sun, 1 Dec 2024 17:53:41 +0800 Subject: [PATCH 1/3] =?UTF-8?q?2024=E7=A7=8B=E5=86=AC=E5=AD=A3=E5=BC=80?= =?UTF-8?q?=E6=BA=90=E6=93=8D=E4=BD=9C=E7=B3=BB=E7=BB=9F=E8=AE=AD=E7=BB=83?= =?UTF-8?q?=E8=90=A5=E4=B8=89=E9=98=B6=E6=AE=B5=E5=AD=A6=E4=B9=A0=E6=80=BB?= =?UTF-8?q?=E7=BB=93=E6=8A=A5=E5=91=8A-=E5=BC=A0=E5=AE=87=E9=A9=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3-\345\274\240\345\256\207\351\251\260.md" | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 "source/_posts/2024\347\247\213\345\206\254\345\255\243\350\256\255\347\273\203\350\220\245\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" diff --git "a/source/_posts/2024\347\247\213\345\206\254\345\255\243\350\256\255\347\273\203\350\220\245\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" "b/source/_posts/2024\347\247\213\345\206\254\345\255\243\350\256\255\347\273\203\350\220\245\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" new file mode 100644 index 00000000000..b1d1c650460 --- /dev/null +++ "b/source/_posts/2024\347\247\213\345\206\254\345\255\243\350\256\255\347\273\203\350\220\245\347\254\254\344\270\211\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" @@ -0,0 +1,133 @@ +--- +title: 2024秋冬季训练营第三阶段总结-张宇驰 +date: 2024-12-01 10:17:57 +tags: +--- + +# 组件化内核的意义与概念 + +**基于组件**构造内核的方法,去构造**不同场景**的**各种模式**内核。组件之间单向依赖。 + +与传统设计思路的差异: + +1. 面向场景和应用需求构建内核 +2. 以统一视角看待各种模式、不同规模的内核 + +组件化内核相对传统构建方式的优势: + +1. 提高内核开发效率 +2. 降低内核维护难度 +3. 开展基于组件的功能复用和开发协作 + +内核模式:1)App和Kernel均处于S Mode.2)相互可见.3)编译形成一个Image.4)是App也是Kernel +可以通过组件增量的方式,实现扩展到宏内核与Hypervisor模式。 + +# Unikernel + +## 学习心得 + +Unikernel令我最惊讶的就是模块化的OS构建方式并通过组件增量的方式组成不同内核模式的OS. + +## 特点 + +1. 应用与内核处于同一特权级(均为内核态),共享地址空间。Unikernel既是内核又是应用,二者合为一体 +2. 优点: 应用与内核之间没有隔离和切换,简单高效 +3. 缺点: 同样因为没有隔离和切换,所以安全性较低 + +Unikernel框架与构成框架的核心组件是怎么来的?经历的阶段如下: + +(1) 直接开发一个裸机应用来满足输出Hello的简单需求 +(2) 需求增加,发现可按照通用性和Arch相关实现分层复用 +(3) 引入组件化,降低耦合性、提升复用性定制性灵活性。 + +## 应用的开发 + +面向应用:基于features选择必要组件的最小集合。 + +1. 学习了如何加载和执行外部应用程序 +2. 实现了内核与应用程序的通信机制 +3. 掌握了地址空间分离和切换的技术要点 + +## 课后练习 + +### 练习一 + +在打印宏的定义处,使用ANSI控制颜色即可,我使用的是:`\x1B[34m`和`\x1B[0m` + +### 练习二 + +我做了两版,一版就是直接引入hashbrown,这是最简单的方法,不过对于alloc和hashbrown中的有一个方法存在的冲突,我没有做处理,默认是让alloc的方法覆盖了hashbrown的。另一个版本是CV了std的实现,然后一点一点的修理,但是我还是觉得第一个更优雅一点。 + +### 练习三 + +我在EarlyAllocator中添加了start, end, b_pos, p_pos, count属性。然后将每一个Trait需要实现的函数实现出来。我发现PageAllocator中的部分函数并没有被使用,有些函数是直接打了unimplement()!的,但是一样能通过测试。 + +### 练习四 + +参数的检查可以直接参考官方函数的实现。 +rename直接调用API fs::rename就可以。mv通过判断第二个参数dst是否是一个目录,如果是的话,吧文件src读入buf,然后在对应的路径写,最后删除原来的文件。 + +# Monolithic + +## 学习心得 + +宏内核在如今的市场上还是占有大量的比率,而Linux也为我们证明了,宏内核加上一些合理的缓解措施,并不意味着会比其他模式差。所以,学习宏内核是很多有意义的。 + +## 特点 + +基于组件化方法构建宏内核模式。 + +1. Unikernel到宏内核: + 以构建最小化的宏内核为目标,说明: + 宏内核特点、与Unikernel的差异分析、框架和组件构成、具体实现示例。 +2. 地址空间管理和支持Linux应用: + 1)用户地址空间映射、缺页加载机制; + 2)支持运行最简单的Linux的原始应用 + +Unikernel模式的应用和内核: +(1)处于同一特权级 - 内核特权级 +(2) 共享同一地址空间 - 相互可见 +(3) 编译形成一个Image,一体运行 +(4) Unikernel既是应用又是内核,二者合体 + +## 课后练习 + +### 练习五 + +使用register_trap_handler来标记对PAGE_FAULT的处理,然后实现处理函数:`handle_page_fualt()` +处理的实现是通过axtask的接口去实现的,得到task的ext,将aspace上锁后,调用handle_page_fualt同名函数,最后直接打印了对应的输出,然后返回一个正确处理。如果同名函数没有正确执行,那么就直接返回false. + +### 练习六 + +从当前的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,直接返回就好 + +如果没有MmapFlags::MAP_ANONYMOUS。则通过get_file_like得到我们所需的文件,并将其读取进入buf,然后写入aspace。 + +# Hypervisor + +## 学习心得 + +HyperVisor,即所谓的虚拟机管理程序,从代码实现来看,和宏内核思想差不多,都是一个高特权级的“内核”为低特权级的“应用”创建独属于它的“虚拟空间”,为它准备对应的资源,然后切换特权级去执行该“应用”。当“应用”发生“中断”的时候,就trap回“内核”处理。GuestOS,就像是一个特殊的应用。 + +## 特点 + +HyperVisor,即所谓的虚拟机管理程序,从代码实现来看,和宏内核思想差不多,都是一个高特权级的“内核”为低特权级的“应用”创建独属于它的“虚拟空间”,为它准备对应的资源,然后切换特权级去执行该“应用”。当“应用”发生“中断”的时候,就trap回“内核”处理。GuestOS,就像是一个特殊的应用。 + +基于一台物理计算机建立一些OS的就是虚拟机,我们这里用的是I形虚拟机,也就是不存在宿主机,直接在硬件平台运行的。 +虚拟机的特点包括:同质、高校、资源受控。为了实现虚拟化,支持了以下层次的对象VM、vCPU、vMem、vDevice、vUtilities。 + +## 课后题 + +### 练习七 + +这里处理Trap的时候,需要更改掉panic,然后在这道题中,要求A0、A1为0x1234和0x6688,只需要在处理这些Trap的时候,将对应的寄存器进行修改就可以 + +--- + +笔记: From ded5c2819fe4d6ade57983ad9f7a69450d2a578b Mon Sep 17 00:00:00 2001 From: ysyx_22051213-Zhang Yuchi Date: Sat, 21 Dec 2024 11:16:56 +0800 Subject: [PATCH 2/3] =?UTF-8?q?2024=E7=A7=8B=E5=86=AC=E5=BC=80=E6=BA=90?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=B3=BB=E7=BB=9F=E8=AE=AD=E7=BB=83=E8=90=A5?= =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E9=98=B6=E6=AE=B5=E6=80=BB=E7=BB=93-?= =?UTF-8?q?=E5=BC=A0=E5=AE=87=E9=A9=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 28 ------------------- ...3-\345\274\240\345\256\207\351\251\260.md" | 28 +++++++++++++++++++ 2 files changed, 28 insertions(+), 28 deletions(-) delete mode 100644 package.json create mode 100644 "source/_posts/2024\347\247\213\345\206\254\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\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" diff --git a/package.json b/package.json deleted file mode 100644 index 894859abe9c..00000000000 --- a/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "hexo-site", - "version": "0.0.0", - "private": true, - "scripts": { - "build": "hexo generate", - "clean": "hexo clean", - "deploy": "hexo deploy", - "server": "hexo server" - }, - "hexo": { - "version": "7.0.0" - }, - "dependencies": { - "hexo": "^4.2.1", - "hexo-asset-image": "^1.0.0", - "hexo-cli": "^3.1.0", - "hexo-deployer-git": "^2.1.0", - "hexo-generator-archive": "^1.0.0", - "hexo-generator-category": "^1.0.0", - "hexo-generator-index": "^1.0.0", - "hexo-generator-tag": "^1.0.0", - "hexo-renderer-ejs": "^1.0.0", - "hexo-renderer-marked": "^2.0.0", - "hexo-renderer-stylus": "^1.1.0", - "hexo-server": "^1.0.0" - } -} diff --git "a/source/_posts/2024\347\247\213\345\206\254\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\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" "b/source/_posts/2024\347\247\213\345\206\254\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\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" new file mode 100644 index 00000000000..174eddee5df --- /dev/null +++ "b/source/_posts/2024\347\247\213\345\206\254\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\347\254\254\345\233\233\351\230\266\346\256\265\346\200\273\347\273\223-\345\274\240\345\256\207\351\251\260.md" @@ -0,0 +1,28 @@ +--- +title: 2024秋冬开源操作系统训练营第四阶段总结-张宇驰 +date: 2024-12-21 03:58:24 +tags: + - author: + - repo: +--- + +# 2024秋冬开源操作系统训练营第四阶段总结-张宇驰 + +## 学习内容 + +这个阶段,我选择了unikernel方向一的任务,为arceos实现linux的app移植,其中我进行了如下方向的探索: + +1. 跟安同学讨论了基于对Ecall进行截断的思路,并自己尝试截断Ecall并导向自己提供的函数,在最小幅度的情况下实现。最后也是其他东西都有了,但是没有做明白怎么截断。 +2. 同样是在群里,和安同学讨论在SBI中进行转发的设想,不过后来没琢磨明白怎么处理这些新的调用号而困惑,最后也仅仅停留在理论层面上。 +3. 最终的选择:自己实现Mocklibc,验证了用自己的函数替换musl中的系统调用的思路,也就是获得abitable,然后在对应的地方直接进行跳转。交流会的时候看到了另一个同学针对动态链接的实现思路,尝试修改代码后发现支持动态链接还是好做的,但是由于时间原因在交这份报告之前还没有跑起来。 + +## 学习收获 + +这个任务对我来说属实难度比较大,总结一下有两点没有做好: + +1. 时间管理。在学校安排中,我们进行了为期两周的实习,其实空余时间挺多的,但是自己没有利用起来(也跟中间还有个考试有关),然后往后做的时间少而且累。 +2. 探索能力。在面对二、三周的复杂项目时,我没有很好的确定到自己的方向,在一定程度上延误了时间。(不过就是探索了很多有意思的东西了) + +## 下一步计划 + +往后顺着PPT上的东西继续探索吧,我不是特别在意一定要在训练营之中去做什么事儿。出于对这个项目的兴趣,我打算保持跟这里的交流,往后继续探索,验证一下自己的想法。然后看看寒假有没有机会去实习,吧这个项目完善完善,而且家里也没人,假期回家的意义也不大。 From 8495ff56c3b8c7e838fb30b5c50c965b43b869f1 Mon Sep 17 00:00:00 2001 From: ysyx_22051213-Zhang Yuchi Date: Sat, 21 Dec 2024 14:15:03 +0800 Subject: [PATCH 3/3] =?UTF-8?q?2024=E7=A7=8B=E5=86=AC=E5=BC=80=E6=BA=90?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=B3=BB=E7=BB=9F=E8=AE=AD=E7=BB=83=E8=90=A5?= =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E9=98=B6=E6=AE=B5=E6=80=BB=E7=BB=93-?= =?UTF-8?q?=E5=BC=A0=E5=AE=87=E9=A9=B0=EF=BC=88fix=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 00000000000..894859abe9c --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server" + }, + "hexo": { + "version": "7.0.0" + }, + "dependencies": { + "hexo": "^4.2.1", + "hexo-asset-image": "^1.0.0", + "hexo-cli": "^3.1.0", + "hexo-deployer-git": "^2.1.0", + "hexo-generator-archive": "^1.0.0", + "hexo-generator-category": "^1.0.0", + "hexo-generator-index": "^1.0.0", + "hexo-generator-tag": "^1.0.0", + "hexo-renderer-ejs": "^1.0.0", + "hexo-renderer-marked": "^2.0.0", + "hexo-renderer-stylus": "^1.1.0", + "hexo-server": "^1.0.0" + } +}