MIT6.S081笔记——写写OS

深陷脊背的腐烂禁

深陷脊背的腐烂禁

人生浪费指南三流写手/吃肉肉

2 人赞同了该文章

MIT 6.S081

lab tool

环境要求主要是3个项目:

一个是riscv64的toolchain,另一个就是虚拟机qemu,剩下的就是一个源码库,装好这三个就可以开始写代码了

关于环境一些坑

首先就是toolchain,这个项目仅仅源代码就有3个多G,按照国内访问git的速度几乎不可能下载完,(这个项目是一个套娃项目,其中里面的子module对应着github上的别的项目,其中qemu的部分还不是在github的服务器上,需要请求另一个美国的服务器,即使翻墙走代理速度也是慢的离谱)
解决方法:
1.翻墙走代理,对git进行配置,该项目是套娃项目所以在clone时要进行–recursive.
2.使用网上的百度云,没会员也是慢的离谱,https://zhayujie.com/mit6828-env.html 中有博主分享的百度云链接,加上会员很丝滑
配置好之后编译大约个把小时

Lab: Xv6 and Unix utilities

Boot xv6

这部分主要介绍的就是如何编译,如何使用qemu运行程序,通过Makefile文件在UPROGS加上自己的文件进行编译用户程序,使用make grade进行打分

sleep

这部分代码倒是不难,可以直接对sleep进行系统调用

pipe

这里使用管道对父子进程进行ipc,逻辑上也不难

primes

这个模块很有意思,要求实现一个并发的素数筛,网页给了一个csp的论文进行参考
其中素数筛得基本思路也就是多开线程每个线程筛一个质因子,然后把没有被筛掉的数字向子进程write然后通过进程的不断fork达到一个素数筛的目的
一个错误我卡了很久,就是没有检测read函数的返回值,我认为既然read函数是阻塞io既然没读到就会持续地阻塞下去,实际上不是
并发素数筛的核心逻辑

while(1)
{//child threadparent_fd[0]=child_fd[0];close(child_fd[1]);pipe(child_fd);buffer_num=0;if(read(parent_fd[0],&buffer_num,sizeof(buffer_num))==0){exit();}//printf("sta=%d %d\n",sta,parent_fd[0]);thread_num=buffer_num;//int pid=getpid();printf("prime %d\n",thread_num);if(fork())//parent thread{close(child_fd[0]);while(read(parent_fd[0],&buffer_num,sizeof(buffer_num))==4){if(buffer_num%thread_num){//pid=getpid();//printf("write buffer_num=%d thread_num=%d,pid=%d\n",buffer_num,thread_num,pid);write(child_fd[1],&buffer_num,sizeof(buffer_num));}}exit();}

pipe

关于pipe的一段代码

int p[2]; 
char *argv[2];
argv[0] = "wc"; 
argv[1] = 0;
pipe(p); 
if(fork() == 0) {close(0);dup(p[0]); close(p[0]); close(p[1]); exec("/bin/wc", argv);
} else 
{ write(p[1], "hello world\n", 12); close(p[0]); close(p[1]);
}

这是一段很有意思的代码
这段代码通过pipe,close和dup成功把wc的标准输入绑定到了另一个程序的管道中
阻塞read直到不可能到达新数据的一个原因是在执行wc之前,让子进程关闭管道的写入端非常重要。因为如果wc的一个文件描述符指向了管道的写入端,wc将永远不会看到文件末尾。

find

ls 的递归版使用dfs搜索所有的文件夹
其中目录是一种特殊的文件
注意不能递归./ ../否则会无限递归

xargs

这个程序可以执行shell命令 并且把这个程序的标准输入当作argv传入执行的shell
可以用来使用管道把别的程序的输出用管道成为另一个程序的参数
注意好处理字符串 使用fork配合exec即可实现

xv6 shell

features

1.可以调用一些用户态的程序
2.允许cd切换目录
3.对调用的程序传参
4.使用|进行输出输入和管道的绑定
5.使用<>进行io重定向
6.使用&后台运行
7.使用;分割指令从做到右依次执行

shell只是一个用户程序,而不是内核的一部分,shell没有什么特别之处反倒说明了系统调用接口的力量。

完成以上的features就符合了shell的基本需求,正要写一个shell,参考xv6的shell源码,下面从整体上来记录一下xv如何实现shell

parser

还记之前ccf的第一是实现一个计算器似乎要完成加减乘除,当时好像就过了样例点.现在回想起来实现其实就是语法树这一套
由于|();等调用会产生相当多复杂的命令和处理方式,实质上的处理时的各种递归调用其实就是一个语法树,这个树由5种基本命令构成

#define EXEC  1
#define REDIR 2
#define PIPE  3
#define LIST  4
#define BACK  5
struct cmd {int type;
};
struct execcmd {int type;char *argv[MAXARGS];char *eargv[MAXARGS];
};
struct redircmd {int type;struct cmd *cmd;char *file;char *efile;int mode;int fd;
};
struct pipecmd {int type;struct cmd *left;struct cmd *right;
};
struct listcmd {int type;struct cmd *left;struct cmd *right;
};
struct backcmd {int type;struct cmd *cmd;
};

以上代码在c语言中完成了继承和多态的性质,配合这两个性质,所有的函数都使用统一的cmd接口,其中cmd可以看作是一个抽象类,这个shell的源码的是学习类模板设计模式极好的范例,整段代码的复用性极高
pipecmd和listcmd有左右两个子节点,通过这种抽象就可以把整个一个命令抽象为一棵语法树
其中解析AST的过程先解析析pipe 在解析list 最后就可以把所有的作为基本命令进行解析
其中从解析器到执行的的传参,使用字符串指针,也就是在parse buffer的时候将所有的参数以指针进行储存,然后把所有的参数结尾替换为\0

执行器

runcmd(parsecmd(buf));

在parse之后会返回一个语法树,其中核心的功能就是runcmd通过递归的遍历整棵树进行从左到右的执行

// Execute cmd.  Never returns.
void
runcmd(struct cmd *cmd)
{int p[2];struct backcmd *bcmd;struct execcmd *ecmd;struct listcmd *lcmd;struct pipecmd *pcmd;struct redircmd *rcmd;if(cmd == 0)exit();switch(cmd->type){default:panic("runcmd");case EXEC:ecmd = (struct execcmd*)cmd;if(ecmd->argv[0] == 0)exit();exec(ecmd->argv[0], ecmd->argv);printf(2, "exec %s failed\n", ecmd->argv[0]);break;case REDIR:rcmd = (struct redircmd*)cmd;close(rcmd->fd);if(open(rcmd->file, rcmd->mode) < 0){printf(2, "open %s failed\n", rcmd->file);exit();}runcmd(rcmd->cmd);break;case LIST:lcmd = (struct listcmd*)cmd;if(fork1() == 0)runcmd(lcmd->left);wait();runcmd(lcmd->right);break;case PIPE:pcmd = (struct pipecmd*)cmd;if(pipe(p) < 0)panic("pipe");if(fork1() == 0){close(1);dup(p[1]);close(p[0]);close(p[1]);runcmd(pcmd->left);}if(fork1() == 0){close(0);dup(p[0]);close(p[0]);close(p[1]);runcmd(pcmd->right);}close(p[0]);close(p[1]);wait();wait();break;case BACK:bcmd = (struct backcmd*)cmd;if(fork1() == 0)runcmd(bcmd->cmd);break;}exit();
}

其中对于管道的处理就是fork两个儿子程序,向下递归,并且通过dup和pipe函数把输入输出重定向

我的nsh

解析器

由于本lab规定不能使用malloc进行动态内存分配,所以数据结构采取了统一的节点

struct cmd
{int type;int left; //left nodeint right; //right nodechar * arg[MAX_ARG];char * earg[MAX_ARG];char *in_s;char *end_in_s;char *out_s;char *end_out_s;
}mycmd[20];

节点有两种类型第一种是普通execmd 第二种是pipeexe作为一个节点包含着两个子节点
采用分治的方法对pipecmd进行分治,通过递归继续对整体的语法树构造
对单独的节点execmd构造就是把所有的参数全部都放存进字符串指针数组,这样方便对exec传递参数,注意要把>后的字符串和<后的字符串分别存进ins和outs

这是解析器的核心代码

int parsecmd(char *s,char *es)
{char *pos;if(find(s,es,'|')){pos=find(s,es,'|');cnt++;int tmp=cnt;mycmd[tmp].type=2;pos--;mycmd[tmp].left=parsecmd(s,pos);pos++;pos++;mycmd[tmp].right=parsecmd(pos,es);return cnt;}else{return parseexecmd(s,es);}
}
int parseexecmd(char *s,char *es)
{int argc=0;char *first,*end;cnt++;mycmd[cnt].type=1;while(s<es){#ifdef DEBUGfprintf(2,"%d %d\n",s,es);#endifchar ch=firstch(&s,es);//if(ch=='\0') return cnt;if(ch=='<'){getword(&s,es,&first,&end);mycmd[cnt].in_s=first;mycmd[cnt].end_in_s=end;continue;}if(ch=='>'){getword(&s,es,&first,&end);mycmd[cnt].out_s=first;mycmd[cnt].end_out_s=end;continue;}getword(&s,es,&first,&end);#ifdef DEBUGfprintf(2,"%d %d\n",s,es);#endifmycmd[cnt].arg[argc]=first;mycmd[cnt].earg[argc]=end;#ifdef DEBUGfprintf(2,"first:%d end:%d\n",first,end);#endifargc++;}return cnt;
}

执行器

执行器主要就是对于构造好的语法树进行按照顺序的执行和重定向,其中简单的重定向命令就可以直接open,close,dup出文件描述符进行直接重定向
pipe的重定向要分治的进行首先fork出left的进程,对左线程重定向到管道,wait执行之后再执行右子进程的重定向
下面就是执行器的核心代码

void runcmd(int num)
{if(mycmd[num].type==1){if(fork()==0){if(mycmd[num].in_s)//redir stdin{#ifdef DEBUGfprintf(2,"stdin redir\n");#endifclose(0);int fd=open(mycmd[num].in_s,O_RDONLY);dup(fd);}if(mycmd[num].out_s){#ifdef DEBUGfprintf(2,"stdout redir\n");#endifclose(1);int fd=open(mycmd[num].out_s,O_WRONLY|O_CREATE);dup(fd);}#ifdef DEBUGfprintf(2,"none redir\n");fprintf(2,"exe:%s\n",mycmd[num].arg[0]);#endifif(exec(mycmd[num].arg[0],mycmd[num].arg)==-1){fprintf(2,"Danm , exe failed\n");}}wait(0);}else{int fd[2];pipe(fd);if(fork()==0){#ifdef DEBUGfprintf(2,"left:%d\n",mycmd[num].left);#endifclose(1);close(fd[0]);dup(fd[1]);runcmd(mycmd[num].left);exit(0);}wait(0);if(fork()==0){#ifdef DEBUGfprintf(2,"right:%d\n",mycmd[num].right);#endifclose(0);close(fd[1]);dup(fd[0]);runcmd(mycmd[num].right);exit(0);}close(fd[0]);close(fd[1]);wait(0);}
}

使用gdb在qemu调试xv6

主要方法是使用gdb远程调试通过tcp端口进行发送指令

在第一个窗口键入

make qemu-gdb

第二个窗口键入

riscv64-unknown-elf-gdb -q -iex "set auto-load safe-path /6282/xv6-riscv-fall19/"

调用riscv-chain中的gdb

从wirte看如何从函数调用接口进入内核态

关于cpu的特权模式作用:

  • 访问驱动
  • 配置虚拟地址
  • 读写敏感寄存器

内核在特权模式下运行
普通程序在用户模式下运行

调用过程

the overall trajectorywrite()trampoline / uservecusertrap() in trap.csyscall() in syscall.csys_write() in sysfile.cusertrapret()trampoline / userretwrite()

RISC-V

一些敏感寄存器

stvec -- ecall jumps here in kernel; address of trampoline
sepc -- ecall saves user pc here
scause -- ecall sets to 8 to indicate a system call
sscratch -- address of trapframe
satp -- current page table

函数调用

a0..a7 -- arguments
ra -- return address
a0 -- return value

保存现场

进入内核时用户态的寄存器会被完全覆盖
寄存器保存在trapframe中
其中寄存器sscratch会指向trapframe的地址
sscratch只有由内核设置

MIT6S081_Lab_buddy alloc

之前研究了几天内存机制,觉得有些吃力,就看了看网课和黑书,再加之被飞蚊症折磨,所以这篇博客可以说是迟到很久了

这章主要是要写一个堆上的动态空间配置器,比较抽象,首先就是xv6中的file类的接口,把文件描述符定义成了静态的变量.通过直接把变量写死的方式分配NFILE个大小个数据结构,然后通过全局变量进行记录分配了多少个文件描述符(十分有算法竞赛的code smell)

第一个任务点:对kernel/file.c

这个就非常简单了,直接把结构体修改掉,然后再open的时候直接调用buddy_malloc接口分配内存
(注意:再close是要把内存回收,我开始忘记了回收,但是alloctest也过了,说明这个测试并不检查内存泄漏)

第二个任务点:修改优化buddyy_alloc

之前读过一些stl的alloc代码,但是跟这个并不像
这个短短的代码,并不是很好理解,首先要先了解一下buddy_alloc的内存分配机制也就是维护一个类似满二叉树的结构,每个的下一层是上一层节点的两倍,同时所维护的内存是上一层节点的一半.
kernel/buddy.c和kernel/list配合着读,可知堆上的内存分配是
sz_info->alloc->slip->自由内存->unavilible
题目给出了一个优化内存的方法那就是把alloc缩减为原来的一半,原来记录的是每一段是否被分配,现在记录bi和buddy的状态是否一致.
其实再malloc时我们并不需要检查标志,只有再回收内存时,我们才考虑吧检查标志,看是否需要合并内存块到上一层.

把alloc缩短之后,我们就要配合着把malloc和free中的isset 和 switch函数重写

主要的难点其实在初始化空间时,init时我们要把所有的空闲内存挂在freelist上,这时我们已经没有了alloc标志位,所以我们只能手动判断,每个内存块的地址空间是否在是为未分配的空间

MIT 6S081_lazylib

本实验要完成的是内存管理的lazy sbrk模块,程序可以通过调用sbrk向操作系统申请内存,但是在很多情况下申请完并不是马上就可以用到,所以操作系统可以对sbrk进行lazy操作,即先对进程空间进行增加,但是并不实际分配物理页面,然后在真正用到lazy时在去在中断中判断是否是已经申请内存的空间,如果是可以对当前访问的页面进行分配内存页面.

下面谈一下编写的代码

  1. sbrk函数,要在调用sbrk时并不真正的分配内存,而是只增加myproc()->sz的大小,然后在真正进行读写时才进行内存分配
  2. vmprint 利用三级页表进行递归的查询
  3. usertrap捕捉缺页异常,判断缺页是否时未进行分配的,如果是,分配页,并对它进行映射
  4. neltrap所以判断实在copyout和copyin的时候发生的异常,所以可以直接对他们调用的walkaddr进行修改
  5. vmcheckguard对栈底页面进行标记

MIT 6S081_cow_lab

这个实验其实本质上于上一个没有太大区别,主要任务就是完成copy on write的编写,也是在fork的时候并不真正的分配内存而是,直接把页面进行PTE_W的标志位取消,然后设计一个PTE_cow标志被重新映射的页面,然后在内存中的一块加入引用计数,记录每一块内存块被复用的次数,每次新增加映射时对ref进行增加,每次copy时对页面引用进行减少.

下面谈一下编写的代码

  1. kalloc中的代码要增加一个引用数组记录每个内存块的引用次数,xv6中最多有64个进程,所以引用可以直接开uint8的数组,对所有内存块进行记录,然后编写两个函数kborrow和kdrop来增加和减少引用.
  2. vmmemcopy在fork进程时会调用vmmemcopy的代码,因为要copy on write所以memcopy并不真正的分配内存而是直接对物理地址进行mappage一个新的vm,然后调用kborrow,对引用进行增加.
  3. 在系统触发缺页中断时候进行复制物理页,然后把虚拟内存进行重新映射,调用kdrop时会减少引用次数,在引用为0时free掉内存
  4. 同样在从内核态向用户态复制内存时也要进行检查是否是共用内存,如果是也要重新分配内存

tips

在使用gdb调试能显著提升debug的效率
continue 执行程序
break vm.c:12 增加断点
step 执行一步进入函数
next 执行一步不进入函数
bt 在触发中断时特别有用,查看函数调用栈

git
git log –oneline –graph 查看日志
git diff x x 查看更改
git status 查看当前状态
git stash 把当前修改压进缓存区栈
git checkout HEAD vm.c 恢复某一个文件

MIT6S081_Lab: user-level threads and alarm&Lock

user-level threads

这个lab是实现用户级线程切换和实现时钟中断函数
用户级别的线程切换其实就是简单版的系统级线程切换,不同的是系统级的进程需要加锁防止多核引发冲突,而用户级别的线程切换则完全不需要考虑这个问题

如何实现切换

首先看一看uthread的汇编代码,可以发现几乎所有的函数只用了a和s寄存器也就是callee寄存器,所以也就是保存这些进程的上下文只要保存好callee寄存器和栈顶寄存器(sp)还有返回寄存器(ra)就可以保存进程所有的上下文
我们看context的数据结构

struct context {uint64 ra;uint64 sp;// callee-saveduint64 s0;uint64 s1;uint64 s2;uint64 s3;uint64 s4;uint64 s5;uint64 s6;uint64 s7;uint64 s8;uint64 s9;uint64 s10;uint64 s11;
};
struct thread {char       stack[STACK_SIZE]; /* the thread's stack */int        state;             /* FREE, RUNNING, RUNNABLE */struct context context_pointer;
};

其中线程的数据结构是一个stack作为该线程的用户栈和一个state作为该线程的运行状态.在进行用户级别的进程切换时只需要切换这个数据结构即可.switch函数进行返回时,会返回到ra中的值作为当前的地址,所以在进行switch切换后所就会切换进入另一个函数.注意的是一开始的时候要提取函数指针,把函数指针放入该线程数据结构的ra寄存器

MIT6S081_Lab_Alarm

这个实验主要是要完成一个时钟中断函数的调用,在xv6中时钟的ticks由硬件发出每次会触发一个trap,trap_handle中编写函数对其进行处理,这个任务是让我们实现一个sigalarm(interval, handler)函数,每经过interval个时钟中断就调用handler函数一次,所以我们为需要在进程中多维护几个变量用于储存

void (*handle)();
uint64 interrupt_num;
uint64 interrupt_val;
uint64 running;
struct trapframe snapshot;

其中handle作为一个函数指针,执行被调用需要处理的函数,num我们维护的代表当前的中断数,val目标的中断数,一旦num达到了val的值我们就开始调用handle函数,running代表处理函数当前是否在运行,snap当然是保存当前的所有寄存器,在调用sigalarm函数时其实就是把以上的数据结构进行初始化,然后要增加一个sigreturn函数,sigreturn就是恢复栈帧,然后把当前的信号量减一个val

Lock

这个lab就是要求重新设计内存分配器和读写缓冲区来减少锁的竞争
首先看一看xv6中的两种锁
xv6中的锁其实很简单,只有两种锁,一个是自旋锁还有一个是就是睡眠锁
其中自旋锁的代码如下:

void
acquire(struct spin *lk)
{for(;;){if(lk->locked==0){lk->locked=1;break;}}
}

其中if中的语句需要用原子操作替换,自旋锁顾名思义就是自循环的锁,所以跟睡眠锁相比更加的耗费cpu的资源.
其中原子操作时使用特别的硬件是实现的.
注意要在使用锁时,特别的最好是按照顺序申请,如果都是用固定的申请顺序,这样可以很好的避免造成死锁.但是通常由于代码中大量的函数等嵌套关系,所以锁不一定可以按照固定的顺序进行申请.
POSIX线程允许一个程序的几个线程跑在不同的cpu上,但是如果其中一个线程进行了地址空间的更改,那么代价就比较大了
说完了锁,那么我们现在开始看Lab,首先Lab的第一个任务.

内存空间配置器

其中在这个test程序中程序大量的进行申请内存,导致锁的竞争很激烈,那我们首先来看一看空间配置器的代码
其实整个空闲空间被配置成为了一个大链表,我们想要申请内存就要在这个链表上区,所以一旦为这个大链表上了锁,其他core就不能在同时申请内存.
所以想要减少竞争其实很简单,为每一个cpu都分配一个链表,当申请内存时,先查看cpuid,然后用该cpu对应的链表进行分配就可以了.

磁盘缓存区

首先看一下bio代码,主要部分都是先初始缓存区,然后申请缓存区,读写缓存区,然后是释放缓存区,其中缓存区也是一个链表,在每次我们想找到磁盘对应的缓存区时都要把整个bceche都上锁,所以这么做的代价是很高昂的,通过功能来看也肯定并不能像上一个任务一样通过cpu来分.那我我们的解决办法就是通过hash来分块,由于每个buffer都会磁盘块的块号,所以可以通过块号进行hash,把巨大的竞争分散掉,选取一个质数13,所以我们就把1个链表分散进了13个链表,初始化的时候就先把所有的链表全都悬挂在0链表上,每当其他bucket没有新的区域了,就从别的链表上steal一个块,加进自己的链表.

MIT_6S081_mmapLab

features

mmap是unix系统中的一个函数,其作用就是把磁盘上的文件映射进入内存方便读写.

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
###实现
  • 首先一定是增加mmap函数和unmap函数的系统调用
  • lazy的分配内存页,在mmap并不分配具体的内存地址,在真正访问地址触发一个trap缺页中断,然后对地址进行分配,这样既可以增加mmap的速度,也可以使mmap映射一个比内存空间大的文件
  • 分配一个vma数据结构记录地址,长度,文件,许可位等等
  • 实现mmap,在调用时维护好一个新增的vma,同时为vma增加一个file ref防止文件被关闭,这时调用mmaptest会会因为触发缺页中断而被迫关闭
  • 增加缺页中断处理的函数,分配一个页并且从文件中读取4098字节,并且映射进入用户空间,使用readi读,要传一个offset函数,在读的时候要把inode上锁
  • 实现munmap,回收页,并且减少一个文件引用,如果mapshared那马就把内存写入文件中
  • PTE中的dirty bit可以检测页面是否被修改过,如果被修改过那么就往回写
  • 修改exit函数,如果调用了mmap就自动把页面回收
  • 修改fork函数让子进程也继承那个地址,不要忘记增加引用,子进程的vma也要写时复制

通过这个lab收获到了对虚拟内存的理解更为深入,更好的理解进程内存的分配

记录一下大体的实现,这个lab其实包括了lazy sbrk的内容也是在分配数据结构时并不真正分配内存页,而在真正要用到这段内存时触发缺页中断,从而节省内存,在设计方面通过调用sys_xx函数读取栈帧中的传参,然后再调用系统中的接口函数,接口函数完整真正的操作sys_xx只是负责简单的传参和返回,把所有的sys函数写进一个文件,然后再调用不同模块中的函数这种设计可维护性和可读性都更好
设计一个vma储存mmap所需要的数据,然后建立vmatable,这些都是放入内核内存中,然后每个进程维护5个vma指针,需要分配时,访问内核的内存
在进行mmap时要fileup增加文件引用,然后把各个数据赋值,然后为进程增加地址空间但是并不分配物理内存,在写入时,trap判断addr是否在某个vma中的地址
在进行munmap要判断是否是把当前整段vma全部撤销,如果是要fileclose,同时检测是否需要写回磁盘,如果并不是那么还是保存当前的数据结构,但是修改七点或者是终点.

MIT6S081_Lab_Networking

这个实验是为E1000编写一个网卡驱动,这个网卡是由qemu模拟的但是看起像是LAN中真实的网卡,事实上连LAN也是qemu实现的,在这个实验中xv6ip地址是10.0.2.15,仅有的另一台主机ip为10.0.2.2,当xv6使用E1000向10.0.2.2发送数据包时,它实际上会被发送到运行qemu的(真实的)计算机上的适当应用程序.我们将qemu的用户态网络栈.我们需要更新Makefile文件完成.qemu记录进出的包在packets.pcap中可以使用tcpdump查看16进制文件

tcpdump -XXnr packets.pcap

实验提供了分析自定义的工具包为ip,udp,arp.其中mbuf提供和管理包荷载,他将被整个lab使用.

阅读e1000的开发手册,这个手册包含了相关的的网卡控制器,qemu仿真82540EM,快速浏览第二章找找感觉,为了写驱动还要阅读第3和第14章,还有4.1,也需要使用13章的引用

我们的第一个任务是先完成收发模块,发送和接收数据包都由一个描述符队列管理,该描述符队列在内存中由xv6和E1000共享。这些队列提供了指向E1000到DMA(即传输)数据包数据的内存位置的指针。它们被实现为循环数组,这意味着当卡或驱动程序到达数组的末尾时,它将绕回开始。一个常见的缩写是指接收数据结构为RX,传输数据结构为TX。每当收到新的包时,E1000就会生成一个中断。您的接收代码必须扫描RX队列来处理每个到达的数据包,并通过调用net RX()将其mbuf发送到协议层。struct rx desc描述描述符格式。然后,您需要分配一个新的mbuf并将其编程到描述符中,以便当下一次负载最终到达数组中的相同位置时,E1000知道将其放置在何处。

当协议层调用e1000 transmission()时,数据包发送是由协议层请求的。传输代码必须将mbuf加入到TX队列中。这包括提取有效负载在内存中的位置及其长度,并将该信息编码到TX队列中的描述符中。struct tx desc描述描述符格式。您将需要确保mbufs最终被释放,但只有在传输完成之后才释放(NIC可以在描述符中编码一个通知位来表示这一点)。

除了读写描述符的循环数组之外,您还需要通过内存映射的I / O与E1000进行交互,以检测接收路径上何时有新的描述符可用,并通知E1000已经提供了新的描述符。 在传输路径上。 指向设备I / O的指针存储在regs中,并且可以将其作为控制寄存器数组进行访问。 您需要特别使用索引E1000_RDT和E1000_TDT。

先完成第一个任务

首先我们来看一下函数调用栈

调用顺序为(以写为例)e1000_transmit->net_tx_eth->net_tx_ip->net_tx_udp->sockwrite->file_write(从底层开始到顶层)

其中e1000_transmit是直接与网卡的接口,功能是把需要发送的缓冲区放入网卡的描述符结构中,这部分是需要查阅一定的网卡datasheet,没有太多的技术问题

第二个任务是完成操作系统的udp协议接口
其中包括sockclose,sockwrite,sockread,net_rx_udp
sockwrite就是将内存中的一段地址,通过copyin复制进内核内存中的缓冲区
然后调用net_tx_udp不断地向下调用
sockread则是从缓冲区读一段代码
net_rx_udp是把网卡不断接受的包进行分配,通过遍历的方法,把所有的包分配到不同的sock结构中去
sockclose无非是从sockets链表中找到要close的sockets,然后关闭
其中阻塞读写的实现是时候sleep一个变量,然后当这个变量被叫醒时,这个进程也会被唤醒

最后附上链接:caowenbo2000/xv6-riscv-fall19

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 2020年B证(安全员)模拟考试及B证(安全员)操作证考试

    题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2020年B证(安全员)模拟考试及B证(安全员)操作证考试&#xff0c;包含B证(安全员)模拟考试答案和解析及B证(安全员)操作证考试练习。由安全生产模拟考试一点通公众号结合国家B证(安全员)考试最新大纲及B证(安全员)考试…...

    2024/3/23 2:45:11
  2. 2020年危险化学品经营单位主要负责人报名考试及危险化学品经营单位主要负责人作业考试题库

    题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2020年危险化学品经营单位主要负责人报名考试及危险化学品经营单位主要负责人作业考试题库&#xff0c;包含危险化学品经营单位主要负责人报名考试答案和解析及危险化学品经营单位主要负责人作业考试题库练习。由安全…...

    2024/5/3 19:08:19
  3. Facebook ConvS2S:Convolutional Sequence to Sequence Learning

    文章目录介绍RNN Seq2Seq卷积架构位置嵌入&#xff08;Position Embeddings&#xff09;卷积块结构&#xff08;Convolutional Block Structure&#xff09;多步注意力&#xff08;Multi-step Attention&#xff09;标注化策略&#xff08;Normalization Strategy&#xff09;[…...

    2024/3/23 2:45:09
  4. 2020年美容师(中级)模拟考试及美容师(中级)考试软件

    题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2020年美容师&#xff08;中级&#xff09;模拟考试及美容师&#xff08;中级&#xff09;考试软件&#xff0c;包含美容师&#xff08;中级&#xff09;模拟考试答案和解析及美容师&#xff08;中级&#xff09;考试…...

    2024/3/23 2:45:07
  5. 2020年T电梯修理考试APP及T电梯修理模拟考试题库

    题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2020年T电梯修理考试APP及T电梯修理模拟考试题库&#xff0c;包含T电梯修理考试APP答案和解析及T电梯修理模拟考试题库练习。由安全生产模拟考试一点通公众号结合国家T电梯修理考试最新大纲及T电梯修理考试真题汇总&a…...

    2024/3/23 2:45:06
  6. 02_Mysql安装与使用

    Mysql安装与使用内容如下&#xff1a;Mysql程序结构Mysql数据库的安装下载地址安装步骤&#xff1a;Mysql数据库的卸载Mysql数据库服务的启动与登录Mysql数据库服务的启动Mysql数据库服务的登录Mysql图形化界面SQLyog 图形化工具——客户端Navicat Premium12和15图形化工具——…...

    2024/3/23 2:45:06
  7. 每一个电脑高手,都掌握的网络基础

    OSI参考模型 1~3低三层&#xff0c;底层协议&#xff0c;面向通信&#xff0c;实现通信子网的功能 5~7高三层&#xff0c;高层协议&#xff0c;面向信息处理的实现资源子网的功能 OSI参考模型从低到高是&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用…...

    2024/3/23 6:34:53
  8. 大数据分析笔记 (5.1) - 决策树 (Decision Tree)

    大数据分析笔记 - 决策树分类问题 (Classification)决策树 (Decision Tree)定义用例算法熵 (Entropy)条件熵 (Conditional entropy)信息增益(Information Gain)结束标准算法示例(ID3)评估决策树评估方法决策树中的过度拟合决策树属性分类问题 (Classification) 分类是一种在数…...

    2024/4/7 3:48:32
  9. coding第15天1.3

    C语言命名规范 之前自己总结不完善&#xff0c;下面给出完善的总结。对于常量命名&#xff0c;同样使用大写字母&#xff0c;对于typedef声明的类型同样首字母大写。对于函数与变量&#xff0c;规范如下&#xff1a; 参考链接 https://www.cnblogs.com/wfwenchao/p/5209197.h…...

    2024/3/23 6:34:52
  10. java线程协作附学习代码(生产者消费者模式)

    线程协作线程通信线程池线程池使用线程通信 #mermaid-svg-fv9lrZU1SXv16Tqu .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-fv9lrZU1SXv16Tqu .label text{fill:#333}#mermaid-svg-fv9lrZU1SXv1…...

    2024/3/23 6:34:52
  11. expect + 酱紫批量免密登录脚本

    expect 人工交互的功能变成自动交互 用法: 1)定义expect脚本执行的shell#!/usr/bin/expect -----类似于#!/bin/bash 2)set timeout 30设置超时时间30s 3)spawnspawn是执行expect之后后执行的内部命令开启一个会话 #功能:用来执行shell的交互命令例如:spawn ssh $user@$…...

    2024/3/23 6:34:50
  12. GO-5-go语言能做什么事情

    Go语言能做什么 一、我们为什么选择Go语言 选择Go语言的原因可能会有很多&#xff0c;关于Go语言的特性、优势等&#xff0c;我们在之前的文档中也已经介绍了很多了。但是最主要的原因&#xff0c;应该是基于以下两方面的考虑&#xff1a; 执行性能 缩短API的响应时长&#x…...

    2024/3/23 6:34:49
  13. Cesium实战专栏16.军事标绘编辑

    Cesium实战专栏16.军事标绘编辑 效果图思路关键代码效果图 思路 军事标绘编辑与点线面实体编辑思路一致,鼠标点击拾取到要编辑的对象,根据实体对象的坐标点生成编辑节点,移动编辑节点后更新实体对象的坐标。 关键代码 ```javascript // 军事标绘编辑类 import {point3dsT…...

    2024/3/23 6:34:46
  14. SSM环境搭建整合

    目录 1.搭建整合环境 1. 整合说明&#xff1a; 2. 整合的思路 3. 创建数据库和表结构 4. 创建maven的工程 5. 编写实体类&#xff0c;在ssm_domain项目中编写 6. 编写dao接口 7. 编写service接口和实现类 Spring框架代码的编写 . 搭建和测试Spring的开发环境 Spring整…...

    2024/3/23 6:34:46
  15. 世界首个用于财务分析行为预测的量子计算云服务诞生

    总部位于英国的AlgoDynamix[2]是金融市场行为预测领域的领导者&#xff0c;该公司于2013年成立&#xff0c;主打“Get smarter insights without looking at the past”&#xff08;洞察睿智前沿&#xff0c;无需借鉴历史&#xff09;。昨日&#xff0c;AlgoDynamix在其新闻发布…...

    2024/3/23 6:34:45
  16. 数据库系统工程师

    自己也是在大一下的时候&#xff0c;突然就“发了疯”似的喜欢上了数据库&#xff0c;所以就去考了计算机三级数据库技术、数据库系统工程师、计算机四级数据库工程师&#xff0c;下面是自己总结的一些“数据库系统工程师”考点&#xff0c;小伙伴们可以参考一下&#xff1a; 数…...

    2024/3/23 6:34:46
  17. Ubuntu下安装RealtekRTL8125网卡驱动

    emmm 前几天捣鼓软件&#xff0c;卸载时不小心把网卡驱动给整残缺了&#xff0c;没法连有线网&#xff0c;然后又重装了一次驱动&#xff0c;难受&#xff1b; 流程 使用ifconfig查看驱动是否正常&#xff1a; &#xff08;原先的驱动消失了&#xff09; 查看网卡驱动型号l…...

    2024/3/23 6:34:44
  18. Java学习笔记 第七天

    Java学习笔记 第七天第一章 面向对象1.1 面向对象概述1.1.1 面向过程和面向对象1.1.2 类和对象1.1.3 成员变量和成员方法1.2 类的定义格式1.3 对象的使用1.4 类与对象的练习1.5 对象内存图1.5.1 一个对象调用一个方法内存图1.5.2 两个对象调用同一个方法内存图1.5.3 一个引用&a…...

    2024/4/8 1:47:39
  19. 比特元团队将打造“协议层—技术层—应用层”区块链生态

    模块化设计&#xff0c;轻松部署你的链&#xff1a;比特元采用模块化设计&#xff0c;提供超过十种以上的模组化功能&#xff0c;开发者可自由组合应用&#xff0c;开发简易&#xff0c;仅需基础的编程能力&#xff0c;即可打造一条公链&#xff0c;无需耗费大量成本自己开发区…...

    2024/3/23 6:34:40
  20. 《Learning to Cartoonize Using White-box Cartoon Representations》阅读笔记

    Learning to Cartoonize Using White-box Cartoon Representations 阅读笔记前言一、文件目录二、需要安装的包三、运行数据集预训练正式训练训练结果总结前言 自己在阅读这篇文章的过程中发现github中并没有公开数据集&#xff0c;后来发现在issue中可以找到&#xff0c;但是…...

    2024/3/23 6:34:40

最新文章

  1. vue项目基于WebRTC实现一对一音视频通话

    效果 前端代码 <template><div class"flex items-center flex-col text-center p-12 h-screen"><div class"relative h-full mb-4 fBox"><video id"localVideo"></video><video id"remoteVideo">…...

    2024/5/8 13:21:00
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. Ubuntu磁盘扩容

    使用 df -h命令查看系统磁盘控件的使用情况&#xff1a; [samspobosrv:~]$ df -h Filesystem Size Used Avail Use% Mounted on udev 7.8G 0 7.8G 0% /dev tmpfs 1.6G 1.7M 1.…...

    2024/5/6 17:45:24
  4. 使用 Kafka 保证消息不丢失的策略及原理解析

    ✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 一、引言 二. 持久化存储 2.1持久化存储原理&#xff1a; 2.2使用示例&#xff1a; …...

    2024/5/5 8:26:54
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/7 19:05:20
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/7 22:31:36
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/8 1:37:40
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/7 14:19:30
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/8 1:37:39
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/7 16:57:02
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/7 14:58:59
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/7 1:54:46
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/7 21:15:55
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/8 1:37:35
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/7 16:05:05
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/7 16:04:58
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/8 1:37:32
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/7 16:05:05
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/8 1:37:31
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/8 1:37:31
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/8 12:44:41
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/8 9:51:44
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/8 1:37:29
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/7 17:09:45
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57