Day 1
写在开头
最近论文实验基本上结束了,也该开始准备学习找工作的技术了。个人不太想ALL IN 互联网,感觉互联网增长很难复刻上个十年了,决定还是C++为主,主要去找linux驱动/EDA/HPC类的工作吧,偏向硬件一点点。
准备好好学一下各类课程,就由操作系统开始吧,先学6.s081~~~~
6.s081
这个是Mit的操作系统的课,主要是教你如何实现一个小型的操作系统,同时带有一点点的RISV-C课程
为什么选择这个课呢?首先是这个课对基础要求没那么高,个人比较菜。其次这个课的所有lab都可以提交评分,而且资料是真的很全!好了屁话不多说,开始学~
lecture
主要讲了这门课主要的目标,构建一个基础的OS系统。
这门课要构建的系统是xv6,需要你在一个个lab中实现它的功能,一步步使它完善
Lab1
sleep
首先来分析一下这个sleep的内容:
- 构建一个sleep程序(user/sleep.c),要求传递给程序一个命令行参数(sleep时间),命令行参数为字符串,需要转化为整数形式。传递成功后,执行系统调用sleep;传递不成功,输出一条错误信息,最后main调用exit()退出程序。
- sleep需要加入到Makefile中的UPROGS,使用make qemu进行编译和跑分。
逐步分析下需求:
- 系统调用如何使用?kernel/sysproc.c
- 传递字符串和获取命令行参数?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
第二个题目是关于管道的,还是简单描述下题目。
- 创建一个程序,通过一对管道,进行通信
- 父进程发送一个byte给子进程
- 子进程print"< pid >:received ping",pid即程序id
- 子进程发送字节给父字节
- 父亲字节读取byte信息然后发送“: received pong"退出
分析一下问题:
- 如何获取pid?getpid
- 如何创建管道通信?pipe
- 如何创建父子进程?fork
- 读写?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
依旧是看看题目:
- pipe和fork设置管道,第一个进程输入数字2-35,每个素数创建一个进程,左读右写(0读1写),第一个进程可以停在第三十五个?
- 关闭进程不需要的文件描述符,一旦第一个进程达到35,则应该等待整个管道终止。
- 当写入端关闭时,read返回0(写入0)
- 管道里创建流程?
思路:
- 首先,需要判断这个数是不是素数,这需要一个函数
算了不想写了,该去写小论文了emmm,明天继续