0%

2024年开源操作系统训练营第一第二阶段学习总结-卓堂越

2024年开源操作系统训练营第一阶段学习总结-卓堂越

首先,我要衷心感谢所有给予我帮助助教导师。每次我有困惑的时候他们的专业知识和耐心指导帮我解决一系列棘手的问题。通过这个平台可以很好的交到对这方面感兴趣的朋友,在群里跟朋友们讨论让我可以更好地理解和应用 Rust 语法。此外,也离不开Rust 社区分享的宝贵的学习资料。同时课堂上分享的The Rust Reference 不失为一本经典巨作给我前期的语法学习提供很有力的帮助。
在开始开发操作系统之前,先熟悉 Rust 语言的基础知识,包括语法、类型系统、所有权和生命周期等概念为首要目标。选择Rust是因为他的安全性和性能使其成为编写操作系统的理想选择。在正式做练习之前花了很多时间在环境配置上面,之前学过的harmony os 都是他们给的镜像直接导入,第一次在上面搭建问了很多导师问题,他们都耐心的回答我,让我在这方面更有兴趣。比如在当推送本地更改时,如果远程仓库已经有了更新,可能会出现合并冲突,需要手动解决这些冲突。通过这些学习能更好的完成后面几个阶段的学习。
和其他语言对比在生命周期这个方面Rust 强制使用生命周期来检查引用的有效性,以避免悬空引用和数据竞争。生命周期注解使得 Rust 的借用系统变得更加严格和安全。C++ 中也有生命周期的概念,但它通常通过使用智能指针、RAII(资源获取即初始化)等技术。相比rust在这方面更不容易出错。而且在所有权上面Rust 引入了所有权和借用的概念,这是与 C++ 最明显的区别之一。在 Rust 中,每个值都有一个所有者,并且在任何时候只能有一个可变借用或任意数量的不可变借用。这确保了在编译时不会出现数据竞争。在以前学过的 C++ 中,没有类似的所有权和借用系统,开发人员需要手动管理内存和资源,这可能导致内存泄漏、悬空指针和其他常见的错误

1
2
3
4
5
6
7
8
9
10
11
12
fn main() {
let result;
{
let x = 5;
result = compute(&x);
}
println!("Result: {}", result);
}

fn compute<'a>(value: &'a i32) -> &'a i32 {
value
}

有一个 main 函数,它调用了一个 compute 函数来计算一个整数的引用,并将结果赋值给 result 变量。然后我们尝试在 main 函数中打印 result 的值。然而,compute 函数返回了一个指向局部变量 x 的引用,而 x 的生命周期只在包含它的代码块内有效。由于 x 在 compute 函数返回后就会被销毁,所以返回的引用将指向无效的内存,导致悬垂引用错误。后期我发现需要通过修改函数签名来指定一个更长的生命周期,或者避免返回对局部变量的引用

1
2
3
4
5
6
7
8
9
10
11
12
fn main() {
let result;
{
let x = 5;
result = compute(x);
}
println!("Result: {}", result);
}

fn compute(value: i32) -> i32 {
value
}

通过上面代码的修改这样就避免了使用引用并返回了整数值本身,从而避免了悬垂引用错误。

第二部分学习总结

实验是按照rCore-Tutorial-Book-v3来完成的
环境搭建我是用了VMware 安装虚拟机在文档提供的直接使用

lab1

这个任务主要是为了获取任务信息,通过引入新的系统调用 sys_task_info,操作系统增强了对任务的监控和管理能力。现在,系统管理员可以根据任务 ID 查询到任务的详细信息,包括当前任务的状态、已经执行的系统调用及其调用次数,以及任务的总运行时长。这个功能使得系统能够更加细致地了解任务的运行情况,有助于优化系统资源的分配,提高系统的整体性能和稳定性。同时,对于开发人员来说,这也提供了一个更好的调试工具,可以更方便地跟踪和分析任务的行为,帮助定位和解决潜在的问题。

lab2

sys_get_time 函数的重写,我们重新设计了获取系统时间的逻辑,使其能够适应新的系统架构。这样,我们成功恢复了获取系统时间的功能,确保系统在引入新特性的同时不影响原有功能的正常运行。sys_mmap 和 sys_munmap 系统调用的实现,则为系统增加了动态内存管理的功能。通过 sys_mmap 系统调用,我们可以在虚存中映射一段指定长度的物理内存,为进程提供所需的内存空间。而 sys_munmap 则提供了取消内存映射的功能,帮助释放不再需要的内存空间,有效管理系统资源。

lab3

实现了一个完全 DIY 的系统调用 sys_spawn,用以创建一个新进程。与传统的 fork 和 execve 组合不同,sys_spawn 系统调用直接创建一个新的子进程,并使其执行指定的目标程序。这种方式更加直接,省去了复制父进程地址空间的步骤,从而提高了效率。在实现 sys_spawn 系统调用的过程中,我们需要处理一些可能的错误情况,比如无效的文件名或者系统资源不足导致的错误。通过正确处理这些错误,我们可以保证系统的稳定性和可靠性。通过这次实践作业,我们深入理解了进程创建的原理和实现方式,加深了对操作系统内核的理解。同时,也提高了我们对系统调用的理解和实现能力。

lab4

在本次实践中,我们要用到三个系统调用:sys_linkat、sys_unlinkat 和 sys_stat,分别用于创建硬链接、取消链接以及查询文件状态。通过这些系统调用,我们可以实现文件系统中文件的硬链接操作,并获取文件的状态信息,从而提高文件管理的便利性和灵活性。

lab5

本次实验旨在实现一个新的系统调用 sys_eventfd2,用于在 Linux 系统中创建 eventfd,其功能是创建一个带有计数器的文件描述符,用于进程间事件通知。通过参数解析和错误处理,我们成功实现了该系统调用,并能够根据传入的参数创建相应的 eventfd,从而为进程间通信提供了一种有效的机制。

这次实验为我们提供了一个很好的机会,加深了对操作系统的理解,并提高了我们的系统编程能力。