Day1

124 阅读3分钟

Day 1

写在开头

最近论文实验基本上结束了,也该开始准备学习找工作的技术了。个人不太想ALL IN 互联网,感觉互联网增长很难复刻上个十年了,决定还是C++为主,主要去找linux驱动/EDA/HPC类的工作吧,偏向硬件一点点。

准备好好学一下各类课程,就由操作系统开始吧,先学6.s081~~~~

6.s081

这个是Mit的操作系统的课,主要是教你如何实现一个小型的操作系统,同时带有一点点的RISV-C课程

为什么选择这个课呢?首先是这个课对基础要求没那么高,个人比较菜。其次这个课的所有lab都可以提交评分,而且资料是真的很全!好了屁话不多说,开始学~

lecture

主要讲了这门课主要的目标,构建一个基础的OS系统。

这门课要构建的系统是xv6,需要你在一个个lab中实现它的功能,一步步使它完善

Lab1

sleep

首先来分析一下这个sleep的内容:

  1. 构建一个sleep程序(user/sleep.c),要求传递给程序一个命令行参数(sleep时间),命令行参数为字符串,需要转化为整数形式。传递成功后,执行系统调用sleep;传递不成功,输出一条错误信息,最后main调用exit()退出程序。
  2. sleep需要加入到Makefile中的UPROGS,使用make qemu进行编译和跑分。

逐步分析下需求:

  1. 系统调用如何使用?kernel/sysproc.c
  2. 传递字符串和获取命令行参数?user/echo.c、user/grep.c、user/rm.c、user/ulib.c

下面开始写吧emmm

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
int main(int argc,char *argv[])
{
    int i;
    
    if(argc < 2){
    fprintf(2, "Error:need more argc...\n");
    exit(1);
    }

    for(i = 1; i < argc; i++){
        int time = atoi(argv[i]);
        if(time > 0){
            if(sleep(time) < 0){
                exit(0);
            }
        }
    }
    exit(0);
}


事实上我想复杂了,我还以为要用sys_sleep,直接调用user.h的sleep就行了,很简单没啥说的emmm.

pingpang

第二个题目是关于管道的,还是简单描述下题目。

  1. 创建一个程序,通过一对管道,进行通信
  2. 父进程发送一个byte给子进程
  3. 子进程print"< pid >:received ping",pid即程序id
  4. 子进程发送字节给父字节
  5. 父亲字节读取byte信息然后发送“: received pong"退出

分析一下问题:

  1. 如何获取pid?getpid
  2. 如何创建管道通信?pipe
  3. 如何创建父子进程?fork
  4. 读写?read/write

ok,开始写吧emmm

#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int main(int argc, char *argv[]){
    int pid;
    int child_pid,partent_pid;
    char p ='p';
    int fds[2];
    pipe(fds);

    pid = fork();//创建子进程
    if(pid == 0){
        //子进程读取并发送
        read(fds[0],&p,1);
        child_pid= getpid();
        printf("%d",child_pid);
        printf(": received ping\n");
    }else{
        //父进程发送
         write(fds[1],&p,1);
    }
    if(pid == 0){
        //子进程发送并退出
        write(fds[1],&p,1);
        exit(child_pid);
    }else{
        //父进程读取并输出
        read(fds[0],&p,1);
        partent_pid = getpid();
        printf("%d",partent_pid);
        printf(": received pong\n"); 
        exit(partent_pid);
    }    
}

这题花了一点点时间,,主要是对这些概念太不熟了,而且pingpong达成了pinpang,我反思呜呜呜,下一题下一题

primes

依旧是看看题目:

  1. pipe和fork设置管道,第一个进程输入数字2-35,每个素数创建一个进程,左读右写(0读1写),第一个进程可以停在第三十五个?
  2. 关闭进程不需要的文件描述符,一旦第一个进程达到35,则应该等待整个管道终止。
  3. 当写入端关闭时,read返回0(写入0)
  4. 管道里创建流程?

思路:

  1. 首先,需要判断这个数是不是素数,这需要一个函数

算了不想写了,该去写小论文了emmm,明天继续