【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用

实验目标:

尝试在nachos中运行用户程序,并熟悉将要完成的系统调用。
在完成实验后应该有如下了解
• 用户程序是如何启动的
• 用户程序是如何通过系统调用与os内核交互的
• 系统调用是如何实现的

准备工作:

一、Mips的安装。
Nachos中使用mips模拟cpu的功能。原因是,如果使用真实的cpu硬件,其中页表切换等操作是由硬件直接完成的,而非可视化的代码。所以,为了学习操作系统的原理,nachos使用了mips来模拟cpu的指令集,由此可以模拟硬件底层原理。
使用nachos运行用户程序时必须先安装mips。安装方法如下。
1、从老师给的nachos相关软件和文档中提取出gcc-2.8.1-mips.tar.gz
2、此时不能进行解压,需要将其复制到/usr/local/文件夹下,使用命令将其解压。注意,/usr/local是系统目录,只能使用sudo命令来以管理员身份进行写操作。具体操作为,在gcc-2.8.1-mips.tar.gz压缩文件所在目录打开shell,命令如下所示:

sudo cp gcc-2.8.1-mips.tar.gz /usr/local
cd /usr/local/
sudo tar xvzf gcc-2.8.1-mips.tar.gz

【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第1张图片
注意,以上命令是nachos在makefile中定义/usr/local/mips为根据nachos的版本,makefile不同,有可能出现mips的安装目录不为/usr/local/mips的情况。此时要对mips的安装位置做出改变,具体目录可以在test文件夹下使用make,如果电脑中mips没有被安装,或安装的位置不对,此时的错误信息中会包含正确的位置,将gcc-2.8.1-mips.tar.gz解压到正确位置即可。若正常,此时应可以正常编译通过,或提示权限错误,此时参照步骤3
3、若提示权限错误,则进入到nachos中/code/bin/arch/unknown-i386-linux/bin打开shell,
输入命令
sudo chmod –R 777 *
再次编译test,此时正常通过。

实验内容:

1、在nachos/test文件夹下编辑halt.c,
将其主函数改为

#include "syscall.h"
int
main()
{
    int i,j,k;
    k = 3;
    i = 2;
    j = i-1;
    k = i - j + k;
    Halt();
    /* not reached */
}

【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第2张图片
保存退出,重新编译。

注:可以用命令

/usr/local/mips/bin/decstation-ultrix-gcc -I../userprog -I../threads -S halt.c

生成halt.s,以便查看汇编代码。

【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第3张图片

汇编语言中,通过这段代码来生成 stack frame 。

【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第4张图片

通过这段代码实现的刚才添加的程序。

(水平有限,暂时看不懂汇编代码,如有错误请指正)

2、进入nachos/userprog目录,make clean一下,再make,重新编译。
3、编译成功后,输入命令

./nachos -x ../test/halt.noff

执行程序halt.c。
【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第5张图片
可以使用

./nachos -d m -x ../test/halt.noff

命令查看每一步的汇编代码。

4.在nachos/userprog/addrspace.h文件中,为AddrSpace类添加方法头void Print();保存。
【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第6张图片
5.在nachos/userprog/addrspace.cc文件末尾添加如下代码
【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第7张图片

void AddrSpace::Print() {
    printf("page table dump: %d pages in total\n", numPages);
    printf("============================================\n");
    printf("\tVirtPage, \tPhysPage\n");
    for (int i=0; i < numPages; i++) {
        printf("\t%d, \t\t%d\n", pageTable[i].virtualPage, pageTable[i].physicalPage);
    }
    printf("============================================\n\n");
}

在构造方法末尾添加Print();一句。

  1. 在userprog文件夹中打开shell,运行命令
make
./nachos -x ../test/halt.noff

【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第8张图片
可见,分配了11页(帧)内存。

7.在nachos中,分配的内存空间大小可变。验证这一点,我们在halt.c中声明一个静态数组。
8.在halt.c文件中,添加全局变量static int a[40];
9.重新编译,运行
【nachos】山东大学操作系统课设实验nachos系统(4)用户程序与系统调用_第9张图片
可以看出,此时内存大小变大了。

你可能感兴趣的:(nachos)