2023开源操作系统夏令营-课后练习实验环境

2023开源操作系统夏令营-在线实验环境

项目内容
共26个实验
实验1 开源操作系统夏令营-在线实验环境
在这里尽情实验吧!
实验2 实验0-1
在你日常使用的操作系统环境中安装并配置好实验环境,填写你的关键代码并简要描述实现方法和遇到的关键问题。
实验3 实验1-1
实现一个linux应用程序A,显示当前目录下的文件名。(用C或Rust编程)
实验4 问答作业 1-1
请学习 gdb 调试工具的使用(这对后续调试很重要),并通过 gdb 简单跟踪从机器加电到跳转到 0x80200000 的简单过程。只需要描述重要的跳转即可,只需要描述在 qemu 上的情况。
tips:

事实上进入 rustsbi 之后就不需要使用 gdb 调试了。可以直接阅读代码。rustsbi起始代码 。
可以使用示例代码 Makefile 中的 make debug 指令。
一些可能用到的 gdb 指令:

x/10i 0x80000000 : 显示 0x80000000 处的10条汇编指令。
x/10i $pc : 显示即将执行的10条汇编指令。
x/10xw 0x80000000 : 显示 0x80000000 处的10条数据,格式为16进制32bit。
info register: 显示当前所有寄存器信息。
info r t0: 显示 t0 寄存器的值。
break funcname: 在目标函数第一条指令处设置断点。
break *0x80200000: 在 0x80200000 处设置断点。
continue: 执行直到碰到断点。
si: 单步执行一条汇编指令。

实验练习的提交报告要求:
简单总结本次实验你编程的内容。(控制在5行以内,不要贴代码)
由于彩色输出不好自动测试,请附正确运行后的截图。
完成问答问题。
(optional) 你对本次实验设计及难度/工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。

实验5 实验2-1
实现一个裸机应用程序A,能打印调用栈。
实验6 问答作业 2-1
1.正确进入 U 态后,程序的特征还应有:使用 S 态特权指令,访问 S 态寄存器后会报错。请自行测试这些内容 (运行 Rust 三个 bad 测例 ) ,描述程序出错行为,注明你使用的 sbi 及其版本。
2.请结合用例理解 trap.S 中两个函数 __alltraps 和 __restore 的作用,并回答如下几个问题:

2-1.   L40:刚进入 __restore 时,a0 代表了什么值。请指出 __restore 的两种使用情景。
2-2.   L46-L51:这几行汇编代码特殊处理了哪些寄存器?这些寄存器的的值对于进入用户态有何意义?请分别解释。

ld t0, 32*8(sp)
ld t1, 33*8(sp)
ld t2, 2*8(sp)
csrw sstatus, t0
csrw sepc, t1
csrw sscratch, t2

2-3.   L53-L59:为何跳过了 x2 和 x4?

ld x1, 1*8(sp)
ld x3, 3*8(sp)
.set n, 5
.rept 27
   LOAD_GP %n
   .set n, n+1
.endr

2-4.   L63:该指令之后,sp 和 sscratch 中的值分别有什么意义?

csrrw sp, sscratch, sp

2-5.   __restore:中发生状态切换在哪一条指令?为何该指令执行之后会进入用户态?
2-6.   L13:该指令之后,sp 和 sscratch 中的值分别有什么意义?

csrrw sp, sscratch, sp

2-7.    从 U 态进入 S 态是哪一条指令发生的?

3.对于任何中断,__alltraps 中都需要保存所有寄存器吗?你有没有想到一些加速 __alltraps 的方法?简单描述你的想法。

实验练习的提交报告要求:
简单总结与上次实验相比本次实验你增加的东西(控制在5行以内,不要贴代码)。
完成问答问题。
(optional) 你对本次实验设计及难度/工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。

实验7 实验3-1
扩展内核,能够显示操作系统切换任务的过程。
实验8 问答作业 3-1
1.正确进入 U 态后,程序的特征还应有:使用 S 态特权指令,访问 S 态寄存器后会报错。 请同学们可以自行测试这些内容 (运行 Rust 两个 bad 测例 (ch2b_bad_*.rs) ) , 描述程序出错行为,同时注意注明你使用的 sbi 及其版本。

2.请通过 gdb 跟踪或阅读源代码了解机器从加电到跳转到 0x80200000 的过程,并描述重要的跳转。回答内核是如何进入 S 态的?
事实上进入 rustsbi (0x80000000) 之后就不需要使用 gdb 调试了。可以直接阅读 代码 。
可以使用 Makefile 中的 make debug 指令。
一些可能用到的 gdb 指令:

x/10i 0x80000000 : 显示 0x80000000 处的10条汇编指令。
x/10i $pc : 显示即将执行的10条汇编指令。
x/10xw 0x80000000 : 显示 0x80000000 处的10条数据,格式为16进制32bit。
info register: 显示当前所有寄存器信息。
info r t0: 显示 t0 寄存器的值。
break funcname: 在目标函数第一条指令处设置断点。
break *0x80200000: 在 0x80200000 出设置断点。
continue: 执行直到碰到断点。
si: 单步执行一条汇编指令。

实验练习的提交报告要求:
简单总结与上次实验相比本次实验你增加的东西(控制在5行以内,不要贴代码)。
完成问答问题。
(optional) 你对本次实验设计及难度/工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。

实验9 实验4-1
使用sbrk,mmap,munmap,mprotect内存相关系统调用的linux应用程序。
实验10 实验5-1
实现一个使用nice,fork,exec,spawn等与进程管理相关的系统调用的linux应用程序。
实验11 实验5-2
扩展操作系统内核,能够显示操作系统切换进程的过程。
实验12 实验5-3
请阅读下列代码,分析程序的输出 A 的数量:( 已知 && 的优先级比 || 高)
int main() {
    fork() && fork() && fork() || fork() && fork() || fork() && fork();
    printf("A");
    return 0;
}
如果给出一个 && || 的序列,如何设计一个程序来得到答案?

实验13 实验5-4
在本章操作系统中实现本章提出的某一种调度算法(RR调度除外)。
实验14 实验5-5
扩展操作系统内核,支持多核处理器。
实验15 实验5-6
扩展操作系统内核,支持在内核态响应并处理中断。
实验16 问答作业 5-1
1.fork + exec 的一个比较大的问题是 fork 之后的内存页/文件等资源完全没有使用就废弃了,针对这一点,有什么改进策略?
2.【选做,不占分】其实使用了题(1)的策略之后,fork + exec 所带来的无效资源的问题已经基本被解决了,但是今年来 fork 还是在被不断的批判,那么到底是什么正在”杀死”fork?可以参考 论文 。
3.请阅读下列代码,并分析程序的输出,假定不发生运行错误,不考虑行缓冲:
int main(){
    int val = 2;

    printf("%d", 0);
    int pid = fork();
    if (pid == 0) {
        val++;
        printf("%d", val);
    } else {
        val--;
        printf("%d", val);
        wait(NULL);
    }
    val++;
    printf("%d", val);
    return 0;
}
如果 fork() 之后主程序先运行,则结果如何?如果 fork() 之后 child 先运行,则结果如何?

4.请阅读下列代码,分析程序的输出 A 的数量:( 已知 && 的优先级比 || 高)
int main() {
    fork() && fork() && fork() || fork() && fork() || fork() && fork();
    printf("A");
    return 0;
}
[选做,不占分] 更进一步,如果给出一个 && || 的序列,如何设计一个程序来得到答案?

实验练习的提交报告要求:
简单总结本次实验与上个实验相比你增加的东西。(控制在5行以内,不要贴代码)
完成问答问题
(optional) 你对本次实验设计及难度的看法。

实验17 实验6-1
扩展easy-fs文件系统功能,扩大单个文件的大小,支持三重间接inode。
实验18 实验6-2
扩展内核功能,支持stat系统调用,能显示文件的inode元数据信息。
实验19 实验6-3
扩展内核功能,支持mmap系统调用,支持对文件的映射,实现基于内存读写方式的文件读写功能。
实验20 实验6-4
扩展easy-fs文件系统功能,支持二级目录结构。可扩展:支持N级目录结构。
实验21 实验6-5
扩展easy-fs文件系统功能,通过日志机制支持crash一致性。
实验22 实验7-1
分别编写基于UNIX System V IPC的管道、共享内存、信号量和消息队列的Linux应用程序,实现进程间的数据交换。
实验23 问答作业 7-1
1.举出使用 pipe 的一个实际应用的例子。
2.共享内存的测例中有如下片段(伪代码):
int main()
{
    uint64 *A = (void *)0x10000000;
    uint64 *B = (void *)(0x10000000 + 0x1000);
    uint64 len = 0x1000;
    make_shmem(A, B, len); // 将 [A, A + len) [B, B + len) 这两段虚存映射到同一段物理内存
    *A = 0xabab;
    __sync_synchronize();  // 这是什么?
    if(*B != 0xabab) {
        return ERROR;
    }
    printf("OK!");
    return 0;
}
请查阅相关资料,回答 __sync_synchronize 这行代码的作用,如果去掉它可能会导致什么错误?为什么?

实验练习的提交报告要求:
简单总结本次实验与上个实验相比你增加的东西。(控制在5行以内,不要贴代码)
完成问答问题
(optional) 你对本次实验设计及难度的看法。

实验24 实验8-1
在Linux环境下,请用信号量实现哲学家就餐的多线程应用程序。
实验25 实验9-1
在Linux的字符(命令行)模式下,编写贪吃蛇小游戏应用程序。
实验26 问答作业 9-1
通过阅读和运行试验等分析,你认为在目前的操作系统中,如果运行在用户态,可以响应哪些中断?如果运行在内核态,可以响应哪些中断?请简要描述分析经过。
对于串口驱动程序,在RustSBI中有具体的实现,请问它与本章讲的串口驱动有何异同之处?
对于目前操作系统中的 virtio-blk 设备驱动程序,存在哪些可以改进的地方来提升性能?

实验练习的提交报告要求
简单总结本次实验你编程的内容。(控制在5行以内,不要贴代码)
完成问答问题。
(optional) 你对本次实验设计及难度/工作量的看法,以及有哪些需要改进的地方,欢迎畅所欲言。

开源操作系统夏令营-在线实验环境

共26个实验

参加本项目
第零章 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章