实验目的

(1)、掌握计算机操作系统管理进程、处理机、存储器、文件系统的基本方法。

(2)、了解进程的创建、撤消和运行,进程并发执行;自行设计解决哲学家就餐问题的并发线程,了解线程(进程)调度方法;掌握内存空间的分配与回收的基本原理;通过模拟文件管理的工作过程,了解文件操作命令的实质。

(3)、了解现代计算机操作系统的工作原理,具有初步分析、设计操作系统的能力。

(4)、通过在计算机上编程实现操作系统中的各种管理功能,在系统程序设计能力方面得到提升。

实验要求

(1) 在xv6环境下开发应用程序

题目:仿照echo,写一个命令echo_reversal,实现以下功能:把输入的每个参数中的字符次序颠倒输出。

例如:$ echo_reversal Hello World!

则输出: olleH !dlroW

 (2) 回答以下问题:

Xv6中并发进程有几种状态,在源码中分别以什么常量代表,试解释每种状态的意义。

Xv6中PCB是以什么方式存放的,链表还是数组?系统最多允许同时运行多少个进程?

Xv6是否支持多核cpu? 如果支持的话,是通过哪个数据结构支持的?

系统启动的第一个进程,其入口函数在哪个文件第几行?它主要实现什么功能?(提示:阅读《xv6中文文档》第1章“第一个进程”)

实验内容

(1). 在xv6环境下开发应用程序

题目:仿照echo,写一个命令echo_reversal,实现以下功能:把输入的每个参数中的字符次序颠倒输出。

例如:$ echo_reversal Hello World!

则输出: olleH !dlroW

   

   我们先打开echo.c文件,查看里面的代码,代码如下:

   int main(int argc, char *argv[])
{
  int i, j;
  for (i = 1; i < argc; i++)
  {
    j = 0;
    while (j < strlen(argv[i]))
    {

      printf("%c", argv[i][j]);
      j++;
    }
    if (i + 1 < argc)
    {
      printf(" ");
    }
    else
    {
      printf("\n");
    }
  }
  exit(0);
}

我们首先先分析两个参数 argc 和 grgv

argv是二维数组,后面也printf 了argv里面的元素,因此,这个参数是用来存储字符串的

对于argc这个参数,我们可以在下面看到:

 

而且当i+1小于argc时会输出一个“ ”,否则输出“\n”,那么我们可以认为argv这个二维数组存储的时候会将输入的句子分割为单词,argc就是单词的数量。我们对此做以下验证,将argv[i] 全改为argv[0],如果猜想正确,那么应该只会输出句子的第一个单词,即将

改为:

 

输入make clean,再输入make qemu重新编译

得到如下,说明猜想正确,现恢复原状,编写echo_reversal的代码

以下部分时对每个单词的输出

 

我们只需要将j的开始置为单词的长度,当j>0时进入循环,先进行j—操作

再输出argv的值即可,如下:

 

输入make clean,然后make qemu,输入echo_reserval测试:

成功

(2). 回答以下问题:

Xv6中并发进程有几种状态,在源码中分别以什么常量代表,试解释每种状态的意义。

有六种状态,在源码中分别以UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE 表示。

状态的含义如下:

UNUSED:  进程未被创建时的状态,即进程控制块空闲时的状态。

EMBRYO:  当需要分配一个进程控制块,且找到一个处于UNUSED状态的进程控制块时,把此进程控制块状态设置为要使用的状态。

SLEEPING:即等待态,进程由于等待某资源等原因无法执行,进入睡眠状态。

RUNNABLE:即就绪态,进程获得了除CPU之外的所有资源,处于可运行状态。

RUNNING: 即执行态,进程获得CPU,正在运行的状态。

ZOMBIE:  进程结束的状态。

状态间的转换关系如下:

Xv6中PCB是以什么方式存放的,链表还是数组?系统最多允许同时运行多少个进程?

PCB即进程控制块,是进程管理的数据结构。

当前处于运行状态进程的PCB用指针数组来指出。

xv6的PCB就是proc.h中的proc结构体。

系统最多允许同时运行64个进程。

Xv6是否支持多核cpu? 如果支持的话,是通过哪个数据结构支持的?

xv6支持多核cpu。通过结构体数组来实现。

系统启动的第一个进程,其入口函数在哪个文件第几行?它主要实现什么功能?(提示:阅读《xv6中文文档》第1章“第一个进程”)

在main (kernel/main.c:11)函数初始化几个设备和子系统后,通过调用userinit (kernel/proc.c:233)创建第一个进程,第一个进程执行一个用 RISC-V 汇编编写的小程序 initcode.S(user/initcode.S:1),它通过调用 exec 系统调用重新进入内核。

实验小结

通过本次实验,了解了如何在xv6系统下编写自己的函数,并编译运行。阅读了xv6系统的代码,对xv6系统的工作原理有了基本的认识,了解了xv6是如何支持多核cpu,阅读了xv6中文文档,加深了对xv6系统的了解。

(by 归忆)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐