动态链接
实现动态连接十分简单,只需要在加载elf文件时判断是否存在interpret段,如果存在就加载对应的动态连接器, 将动态连接器内容映射进内存并将程序入口设置为动态连接器的入口。接下来动态连接器会完成剩下的连接工作。
实现动态连接十分简单,只需要在加载elf文件时判断是否存在interpret段,如果存在就加载对应的动态连接器, 将动态连接器内容映射进内存并将程序入口设置为动态连接器的入口。接下来动态连接器会完成剩下的连接工作。
在 Rust 中,字符串是一个胖指针,包括具有所有权的 String
以及 &'a str
,并且为 utf-8 编码
而在 C 中,字符串只是一个单纯的指针,以有符号的 i8
为单元,以 \0
作为结尾,长度不包括结尾 ‘\0’
在使用 Rust 编写 initrpoc 和 系统调用的时候,由于测例所要求的的接口所使用的的字符串相关参数均为 C 标准,所以我们需要将 Rust 和 C 之间的字符串进行转换
在目前的实现中信号总共有63种,1-31为非实时信号,34-63是实时信号。32和33为未定义信号。 信号是每个进程独有的,除此之外每个进程还有信号掩码。
由于大部分测试需要使用 busybox,为了避免多次解析 elf、从零创建地址空间等问题,我们采用了类似于加载initproc的方法。
在我们的内核中,我们使用 TASKMANAGER 管理分别处于就绪态,阻塞态的进程,包括因为调用 nanosleep 而休眠的进程。
相较于初赛,完善了 clone 系统调用。初赛时由于要求测试样例要求比较低,在实现 clone 系统调用时并未完全利用用户传递的参数。我们根据 Linux manual page 中的要求,完善了内核的 fork 以及 TaskControlBlock 结构。
随着开发的进行,我们需要的适配和封装的数据结构越来越多,其中大部分与我们的内核本体关系并没有那么紧密,
所以我们将这部分结构,如用于的引导程序、FAT32、Linux 相关数据结构放在了项目根目录中的 crates
里
Rust 本身是支持多个 crates
构成的一个 workspace
,这些 crates
直接可以相互引用,但是由于我们使用
了 .cargo/config.toml
来配置 rustc,所以 workspace
并不能为我们所有 (因为目前 workspace
不支持在 workspace
中读取 .cargo/config.toml
)