MIT6.S081 Lab01

MIT-6.s081-OS lab syscall :user-level threads and alarm warm up (对riscv汇编的熟悉,其实使用gdb调试汇编是”最好“的学习方法) 回答一下几个问题: Which registers contain arguments to functions? For example, whichregister holds 13 in main's call to printf? 这个很简单,从call.asm就能看出来,是a2 printf("%d %d\n", f(8)+1, 13); 24: 4635 阅读详情

安装wsl历程

之前卸载wsl时,遗留了一个.wslconfig文件,导致一直装不上去

环境配置

装上wsl之后,按照官网一步步配置就好

运行make qemu 的时候,可能会遇到如下的报错

changxin@QiuShui:~/xv6-labs-2021$ make qemu riscv64-linux-gnu-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -DSOL_UTIL -DLAB_UTIL -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o user/sh.o user/sh.c user/sh.c: In function ‘runcmd’: user/sh.c:58:1: error: infinite recursion detected [-Werror=infinite-recursion] 58 | runcmd(struct cmd *cmd) | ^~~~~~ user/sh.c:89:5: note: recursive call 89 | runcmd(rcmd->cmd); | ^~~~~~~~~~~~~~~~~ user/sh.c:109:7: note: recursive call 109 | runcmd(pcmd->left); | ^~~~~~~~~~~~~~~~~~ user/sh.c:116:7: note: recursive call 116 | runcmd(pcmd->right); | ^~~~~~~~~~~~~~~~~~~ user/sh.c:95:7: note: recursive call 95 | runcmd(lcmd->left); | ^~~~~~~~~~~~~~~~~~ user/sh.c:97:5: note: recursive call 97 | runcmd(lcmd->right); | ^~~~~~~~~~~~~~~~~~~ user/sh.c:127:7: note: recursive call 127 | runcmd(bcmd->cmd); | ^~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors make: *** [<builtin>: user/sh.o] Error 1

这时候的解决方案如下:

  1. nano Makefile 打开文件,或者用vim Makefile
  2. 找到 CFLAGS = -Wall -Wno-infinite-recursion -O -fno-omit-frame-pointer -ggdb
  3. 将这一行改成 CFLAGS = -Wall -Wno-infinite-recursion -O -fno-omit-frame-pointer -ggdb
  4. nano: ctrl+o 然后回车,然后 ctrl + x
  5. vim: 输入:wq 回车

xv6文档阅读(第一章)

操作系统的工作

  1. 将计算机的资源在多个程序间共享
  2. 管理并抽象底层硬件
  3. 多路复用硬件
  4. 给程序间提供一种受控的交互方式

进程和内存

在wsl中运行文档中的用例

在这里插入图片描述

输出文件

在这里插入图片描述

注:exec 会替代原来的进程

似懂非懂

xv6 shell 用以上调用为用户执行程序。shell 的主要结构很简单,详见 `main` 的代码(8001)。主循环通过 `getcmd` 读取命令行的输入,然后它调用 `fork` 生成一个 shell 进程的副本。父 shell 调用 `wait`,而子进程执行用户命令。举例来说,用户在命令行输入“echo hello”,

-- 这里开始看不懂

`getcmd` 会以 `echo hello` 为参数调用 `runcmd`(7906), 由 `runcmd` 执行实际的命令。对于 `echo hello`, `runcmd` 将调用 `exec` 。如果 `exec` 成功被调用,子进程就会转而去执行 `echo` 程序里的指令。在某个时刻 `echo` 会调用 `exit`,这会使得其父进程从 `wait` 返回。你可能会疑惑为什么 `fork` 和 `exec` 为什么没有被合并成一个调用,我们之后将会发现,将创建进程——加载程序分为两个过程是一个非常机智的设计。

I/O 和文件描述符

  1. 文件描述符是一个整数,它代表了一个进程可以读写的被内核管理的对象
  2. 每个进程都有一张表,但每一个文件当前的偏移仍然是在父子进程之间共享的
    1. 文件描述符0读入(标准输入)
    2. 文件描述符1输出(标准输出)
    3. 文件描述符2输出错误(标准错误输出)
  3. 每一个指向文件的文件描述符都和一个偏移关联
    1. read(fd, buf, n)
    2. 当没有数据可读时,read 就会返回0,这就表示文件结束了。

cat的本质实现

char buf[512];
int n;

for(;;){
    n = read(0, buf, sizeof buf);
    if(n == 0)
        break;
    if(n < 0){
        fprintf(2, "read error\n");
        exit();
    }
    if(write(1, buf, n) != n){
        fprintf(2, "write error\n");
        exit();
    }
}
  1. 系统调用 close 会释放一个文件描述符
  2. 使得它未来可以被 open, pipe, dup 等调用重用
  3. 一个新分配的文件描述符永远都是当前进程的最小的未被使用的文件描述符

简化版的 shell 执行 cat<input.txt 的代码:

char *argv[2];
argv[0] = "cat";
### argv[1] = 0;
if(fork() == 0) {
    close(0);
    open("input.txt", O_RDONLY);
    exec("cat", argv);
}

个人解读:

argv[1] = 0; (让参数到这里结束)

close(0); (释放0这里的文件描述符)
open(“input.txt”, O_RDONLY); (0这里的文件描述符分配给了“input.txt”)
exec(“cat”, argv); (加载新的程序,去到上面上面的代码执行“cat”)

fork 和 exec 是单独的两种系统调用。这种区分使得 shell 可以在子进程执行指定程序之前对子进程进行修改。

fork 每一个文件当前的偏移仍然是在父子进程之间共享的

if(fork() == 0) {
    write(1, "hello ", 6);
    exit();
} else {
    wait();
    write(1, "world\n", 6);
}

会输出 hello world

dup 复制一个已有的文件描述符,返回一个指向同一个输入/输出对象的新描述符。这两个描述符共享一个文件偏移,正如被 fork 复制的文件描述符一样。这里有另一种打印 “hello world” 的办法:

fd = dup(1);
write(1, "hello", 6);
write(fd, "world\n", 6);

管道

文件系统

实验内容

mit6.s081_配置及lab1 没有选择在mac本地写,还是想着在mac上装个虚拟机用linux,于是下载了vmware fushion以及ubuntu server 22.04,服务器版的没有图形化界面也不太想下了,用terminus ssh连上之后安装官网ubuntu的方法配置,但也遇到了qemu版本过高的问题,没办法只能回退版本,跟着知乎大佬重新安装了5.0.1的版本。除了qemu的版本问题,还有一些其他小问题,不过都能解决。环境配置就跟着官网走就好。more。 阅读详情

相关推荐

centos7 python3.12.1 报错 No module named _ssl,坑我几个小时

网上的教程很多,但几乎是无效的,跟着我这教程,可以完美解决。

Amio_的博客 1万+

Mit6.S081 Lab01 实验环境搭建

Mit6.S081 Lab01 实验环境搭建 官方安装文档:6.S081 / Fall 2020 (mit.edu) 如果 $ riscv64-unknown-elf-gcc --version报错"No command",根据Terminal给出的指示安装东西 注意以后给虚拟机分配20g以上的虚拟硬盘(Linux Ubuntu就占了近10g) 善用搜索引擎 win键加鼠标可以拖动界面 Qemu type推出方法: 按住Crtl+a,松开,按X Happy Lab! ...

m0_51350192的博客 419

esp32s3 spi camera gc6133调试

gc6133 spi只有master模式,同时需要esp32提供主时钟,需要有主时钟然后才能通过i2c进行初始化.测试了几种方式,记录如下。

hclydao的专栏 1564

# MIT6.s081/6.828 lectrue 01:Introduction and examples 以及 lab1 心得

课程目标理解操作系统的设计与实现,设计是一种高层次的结构,实现是代码的样子;这一点和蒋炎岩的课程理念一致,如何设计?如何实现?会花费大量时间讲解在 XV6 上(一个类 UNIX 操作系统)获得动手经验关于OS 的目标管理底层硬件应用程序的并行应用程序的隔离应用程序的数据共享多用户之间的访问控制(Access Control System)/安全性(Security)/权限系统Permission System帮助应用程序获得高性能(Performance)。

weixin_39654437的博客 420

Python+pytest+requests 自动化测试框架

环境准备 本次选用的是Python+Pytest+requests来搭建自动化框架,需要有 Python 环境(3.x 版本),安装pytest和requests,不会安装的自行去网上搜教程。 关于 Pytest 的基本使用,这里不作讲解,不清楚的可以看我之前的文章。 简单 Demo 我们先创建一个项目,取名api-test,然后在下面创建一个test_api.py的文件 # test_api.py import pytest import requests def test_01():

weixin_42686892的博客 1万+

MATLAB小白也能搞定!BCT脑网络分析工具箱安装与入门指南

本文为零基础用户提供了一份详尽的BCT脑网络分析工具箱安装与入门指南。从MATLAB环境配置、BCT工具箱下载与路径添加,到连接矩阵构建、节点度与聚类系数等基础指标计算,手把手带领神经科学研究者跨越编程门槛,快速掌握脑影像数据分析的核心流程。

threejs5artist的博客 1092

f分布表a=0.01_【MIT6.S081-2020Fall】Lab: Multithreading

本文使用 Zhihu On VSCode 创作并发布Github仓库链接本实验将使您熟悉多线程。 您将在用户级线程包中实现线程之间的切换,使用多个线程来加速程序并实现屏障。注意:若使用虚拟机,要CPU个数设置为多于1个。Uthread: switching between threads (moderate)在本练习中,您将为用户级线程系统设计上下文切换机制,然后实现它。 首先,您的xv6有两个文...

weixin_42396058的博客 602

用 sapgenpse 把 SAPCRYPTOLIB 的 SNC 真正配通

摘要: 在SAP系统中配置SNC(Secure Network Communications)时,sapgenpse工具是关键,尤其在旧版本或组件缺乏图形化维护工具时。核心步骤包括安装SAP Cryptographic Library、创建PSE(Personal Security Environment)、生成运行凭据,并确保证书交换顺序正确。常见问题如RFC连接失败或握手错误,往往源于PSE创建或凭据配置不当。需特别注意SECUDIR目录设置、PSE身份管理(单一或独立PSE方案)、以及服务账号凭据的权

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 66

MIT6.S081 - Lab1 实验笔记

Lab1 的这几个实验都不是很难,还没深入到内核的实现机制,主要是让我们熟悉xv6的环境,常用的系统调用,理解进程创建和通信文件系统操作等。接下来的 Lab2 会涉及到内存管理和内核态的切换,应该会更有意思,那么我们,下次再见。

1912

MATLAB - 浮动基座机器人的逆运动学

本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体,也适用于躯干和腿部可在空间自由移动的行走机器人。请注意,刚体树对象表示具有固定基体的刚体树。这意味着刚体树的基体在世界中具有固定的位置和方向。您可以在基体上附加一个 “浮动 ”类型的刚体关节,为具有浮动基体的机器人建模,以用于动态模拟等某些应用。

机器人控制与仿真应用 2440

一文快速教你如何下载国自然模版

5. 成功进入“相关文件查看”页面后,点击左侧的“项目申请文件“,如果你此次申请的是“面上项目”,选择对应的下拉框,找到对应的模版下载即可。6. 🫑们发现,在当前页面点击“青年科学基金项目”,左侧出现的是“原国家杰出青年科学基金项目”。7. 进入下一页后,点击“青年科学基金项目”,便可以在右侧找到🫑们要找的模版啦。2. 成功登陆后,点击1处的“首页”,在首页界面,再点击2处的“项目批准”。8. 点击上图3处的“文件详情”,就可以找到可以下载的模版啦(如下图)。3. 从“项目批准”进入后,点击“管理”。

薰珞婷紫小亭子的博客 2399

「实验记录」MIT 6.S081 Lab11 networking

MIT 6.S081 Lab11 networking

士全的优快云,用心连载,欢迎关注 1093

AI赋能合同审查:构建租赁合同智能审核系统的全流程解析

在商业地产、设备租赁等场景中,合同审核效率直接影响业务流转速度。传统人工审核存在三大痛点:审核周期长(平均2-3个工作日)、合规风险高(条款遗漏率约15%)、人力成本居高不下。智能审核系统可将审核时间压缩至秒级,风险识别准确率提升至98%以上。

理论都是虚的,代码才是王道。 1356

MIT6.S081-lab7前置

这部分包含了设备中断和锁的内容。

Rinai的博客 1184

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【MTI 6.S081 Lab】traps

【MTI 6.S081 Lab】traps 本实验探讨了如何使用陷阱实现系统调用。您将首先使用堆栈进行热身练习,然后实现用户级陷阱处理的示例。

qq_42474104的博客 657

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mit6.s081 lab1 Xv6 and Unix utilities

chapter 1

tailuzhecom的博客 483

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

2020 MIT6.s081 os Lab: system calls

2020 MIT6.s081 os Lab: system calls

sun%moon 602

(done) MIT6.S081 2023 学习笔记 (Day4: LAB3 page tables)

LAB 网页:https://pdos.csail.mit.edu/6.S081/2023/labs/pgtbl.html。

shimly123456的博客 601

MIT 6.S081 pgtbl 实验篇(lab3):Print a page table (easy)

Lab 3: page tables

2603_95068735的博客 400

MIT6.S081Lab5:xv6 lazy page allocation

这个实验总的来说我觉得还是比lab3简单一点,最需要注意的就是最后一个中关于系统调用涉及到lazy allocation不会触发页面错误需要手动编写代码来分配页面。

qq_46514141的博客 1472

全网最最实用--基于Mac ARM 芯片实现操作系统MIT 6.S081-lab1

操作系统学习和实践

m0_56243424的博客 1830

mit6.s081 Lab2: system calls

时隔一段时间,终于结束期末周,开始实验二。

m0_61815263的博客 154

MIT6.S081 Lab11:Networking

e1000_recv()函数必须扫描rx ring并且将新的packet的mbuf递交到网络栈(调用net_rx())。然后需要分配一个新mbuf并且将它的信息记录在描述数组(rx_ring)项中,因此当E1000到达rx ring中的该点时,它将会找到一个未填充的buffer,用来DMA 一个新的packet。1.对于发送函数,当网络栈需要发送packet,它调用e1000_transmit(),使用mbuf(该函数的参数)中持有的待发送的packet。

weixin_52297124的博客 238

OS-xv6-lab1

本质上是内核的一块缓存,通常用作把一个进程的输出连接到另一个进程的输入。管道是单向的,要么读要么写,不可以又读又写——创建两个管道。当进程退出时,管道随之释放,保持同步。pipe(p2);exit(0);​​exit(0);

AM_SuS的博客 947

xv6 - lab0 - 课程介绍

MIT 6.S081 课程介绍,围绕 xv6 操作系统设计的一系列课程,十分经典。

本末实验室 739

应届生秋招嵌入式学习路线至臻总结版(10k-30k)

嵌入式其实是一个下限和上限都很高的行业,低的可能月入。

m0_74297417的博客 1836
上一篇: MIT 6. S081 LEC1
下一篇: TS学习笔记
memorycx
博客等级 码龄2年 430粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值