操作系统实验小记

Reading time ~1 minute

这学期上操作系统,不得不说,这个实验绝对是上大学以来做过的最难的实验了。

MIT的Frans Kaashoek等在2006年参考PDP-11上的UNIX Version 6写了一个可在X86上跑的操作系统xv6(基于MIT License),用于学生学习操作系统。我们可以站在他们的肩膀上,基于xv6的设计,尝试着一步一步完成一个从“空空 如也”到“五脏俱全”的“麻雀”操作系统—ucore,此“麻雀”包含虚存管理、进程管理、处理器调度、同步互斥、进程间通信、文件系统等主要内核功能,总的内核代码量(C+asm)不会超过5K行。充分体现了“小而全”的指导思想。

说句实在话,本来没做之前想的是,一个课程实验能有多难,毕竟总得照顾到所有的学生吧,结果一开始做,就彻底无话可说了。

诺大一个程序,加之本来对于很多底层的编程就不熟悉,还有那以前向来不看的makefile,看起来真的是非一般的累,虽说实验配了大量的资料,但资料茫茫多,又还有点乱,真是不忍直视。

花了好长的时间,才算勉强开好了头,把实验1的前几问琢磨清楚了(找BIOS还真是废了好大劲),然后心血来潮,决定做点奇奇怪怪的事。

首先写了个hello.c:

#include <stdio.h>

int main(void) {
    printf("hello world!n");
    return 0;
}

然后静态编译:

gcc -o hello hello.c -static -m32 -g

接着,用hello替换掉lab1中编译生成的bin/kernel,最后重新make debug,本来指望看能不能成功输出hello world的,结果谁知道,一运行,竟然直接qemu直接花屏了,好不震惊。

最后,终于确定,是在bootmain中将hello程序的各个段载入内存的时候导致的花屏,然后突然想到原来看汇编的,有一块内存区域对应于console的频幕输出的,大概就只能是这块区域被覆盖了。

在使用VGA方式时,其文本方式和低分辨率图形方式占用了0xB8000-0xBFFFF的空间,然后程序的地址是0x8048000之后的空间,只是,由于bootmain中,对所有载入地址,做了个&0xffffff的操作,故变成了从0x48000开始。

然后查看程序段头:

  [ 6] .text             PROGBITS        08048300 000300 07f513 00  AX  0   0 16

发现text段是从0x08048300开始的0x07f513个字节,这样,计算后会发现,0xB8000正好对应于文件的0x70000的位置,还在.text段中,同时,通过对qemu进行debug,我们也会发现花屏后0xB8000出的数据值正好与文件0x70000处的数据完全相同,验证了我们的想法。

挂载网络文件夹后网络故障时文件操作命令卡死

挂载 NFS 或者 Samba 的时候,经常会由于网络故障导致挂载好的链接断掉。此时如果尝试进行 ls、cd、df 等各种命令,只要与此目录沾上边,就会卡住。如果使用了类似 oh-my-zsh 这种配置的,只要在网络目录中,弹出命令提示符前就会直接卡住。这个时候第一反应就是...… Continue reading

路由折腾记 第四弹

Published on September 02, 2017