自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(242)
  • 收藏
  • 关注

原创 lab11 net

以上就是基本的交互框架,但是因为设备驱动是内核,是纯软件,而网卡设备是硬件,所以双方的交互就有点麻烦。这里通过了一个很神奇的操作,就是寄存器映射,将硬件的寄存器给映射到了内核的地址空间中,我们访问内核的某个地址,就是在访问硬件的寄存器,这一下子就打通了内核和硬件之间的桥梁。至此,准备工作就做完了,我们现在就需要增加内核代码,使其能够和网卡配合,完成数据报的发送和接受。这个lab很有意思,它的hints基本就是给了你所有的伪代码,你一个一个去实现就行了。中,就将寄存器映射的起始地址赋值给了。

2023-08-30 16:20:13 106

原创 lab10 mmap

我们应该按照hints提示的,创造一个VMA的结构体,并且在进程的proc的结构体中存储一个VMA的数组。lab对munmap的情况做了简化,只会从头开始unmap,因此在将数据写回磁盘时,直接调用filewrite函数,它在内部会自动调用file的偏移。修改exit函数,使其能够在进程用过mmap的情况下,将没有被munmap都处理掉,至此mmap_test可能可以通过了。,它们在查找页表的时候,如果发现pte无效,会panic,这里直接忽略,因为可能是mmap还没有分配物理地址的区域。

2023-08-30 09:53:33 76

原创 lab9 fs

这个函数的意思是,目前寻找的文件的inode是ip,现在要去addrs数组的index项指向的那个多级地址块上的第bn个block的地址,如果第bn块处没有地址,那么就创建一个。而如果我们没设置,说明实际上要访问的是target,在这种情况下,我们只需要在open函数分配fd和file之前,将ip指针切换成target的ip地址即可,因此,找一个适当的位置截胡即可。然后,修改bitmap函数,首先可以看一下bitmap如何处理直接地址和一级地址,学习一下基本的思路,我们这里基本就是嵌套一下一级地址的情况。

2023-08-29 12:48:00 81

原创 lab8 lock

但是这里采用的方式比较偷懒,也比较巧,即没有存储的一开始就放在key=0的表槽链表,引用计数为0的,直接不处理,反正它们都可能在。这是因为如果我在borrow里如果找到了一个可以借的freelist,那么我还是会获取两个锁,这也是有可能造成问题的,因为我们没有限制获取锁的顺序。首先,锁肯定是要去保护一些东西的,之前的bcache的那个大锁,是因为保护的东西太多了,所有buf都是被它保护着,这就导致很慢了,因为可能不同的cpu没有冲突,但依然要等很久。对于某个key对应的表槽的那个锁,它只需要管理。

2023-08-27 19:14:52 103

原创 lab7 thread

在这个练习中,你将为一个用户级别线程系统设计上下文切换机制,并实现它。

2023-08-25 17:29:17 78

原创 lab6 cow

cow的目标就是延迟分配,并且直到必须要复制的时候才会分配物理内存如果能够通过cowtest和usertest,则通过这个lab。

2023-08-24 21:43:47 78

原创 lab5 lazy

而栈指针往下,除了一个guardpage是没有映射之外,其他的page都应该是有映射的,即pte的有效位为0。函数,这个函数就是将父进程的页表原模原样的拷贝给子进程,但是有的虚拟页面连父节点自己都没有映射,子节点哪来的映射,因此碰到找不到pte或者pte有问题的情况,直接continue就行了。第4个的问题在于,如果是系统调用,那它会先在usertrap中进入syscall的处理流程,不会进入我们新添加的流程,所以会有问题。第1个是参数为负数,特判一下就行,如果是负数,就按原来的方式处理。

2023-08-22 18:22:05 67

原创 lab4 traps

系统调用的过程很复杂,设计的也很巧妙。并且由于内核态和用户态的虚拟地址空间不一样,导致了一些麻烦的操作。不过在各种状态的切换中,进程的trapframe包含了这个进程所有的信息,拥有一个进程某个时刻的trapframe,就可以在任意时候将这个进程恢复到这个状态,这也是这个lab考察的内容在这个lab中我们不需要自己去做各种东西的切换,只需要提供一个正确的trapframe即可系统调用会经历那四个阶段,时钟中断导致的进程切换和恢复最起码也会经历最后的两个阶段。

2023-08-21 18:05:15 86

原创 lab3 pgtbl

在这个lab中,你将探索页表,并且修改它们以简化从用户空间拷贝数据到内核空间的函数在开始之前,需要完成kern/vm.c。

2023-08-18 11:47:41 89

原创 lab2 system calls

在kalloc.c文件中,可以发现空闲页面被存放在kmem的freelist中,这个freelist是一个链表,每一个结点代表一个大小为PGSIZE的空闲页面,我们可以通过next指针找到下一个结点。sysinfo函数的参数是一个struct sysinfo类型的指针,它是一个传出参数,也就是copyout函数的第二个参数。在proc.c文件中,看起来代码很多,但是可以发现,所有的进程都是存放在proc数组的,这个数组的元素类型是就是struct proc,因此可以直接访问这个进程的state,代码如下。

2023-08-15 19:43:11 188

原创 lab1 utilities

【代码】lab1 utilities。

2023-08-12 14:24:47 154

原创 lab7 proxylab

使用代理完成客户端和服务器的连接(HTTP操作,socket通信)接受客户端的连接,读并分析请求将请求发送给服务器读取服务器的回应,并将回应发送给对应的客户端实现多线程的功能增加cache功能。

2023-08-08 20:38:22 132

原创 lab6 malloclab

前情提要。

2023-08-06 09:58:51 91

原创 lab5 shlab(shell lab)

shell通常用来指命令行,我们可以通过这个命令行去启动各种程序那么,这个命令行是如何启动这些程序的呢?shell将自己作为父进程shell创建一个子进程去启动各种程序那么,shell其实也就是一个进程,也不过是一个比较特殊的程序,那它这个程序是什么样的呢?不断地循环,并打印一个提示符,我们这个lab的提示符就是这样tsh>然后通过fgets获得我们的输入,我们的输入通常就是程序的路径(名字)以及这个程序的参数通过我们的输入去启动程序。这里就有两种程序了,一种是前台程序,一种是后台程序。

2023-08-03 15:47:50 88

原创 lab4 cachelab

这个模拟cache的功能非常简单,因为不需要我们真正的去读写数据,只需要模拟进出cache的情况就可以了。因此,我们每个cache行,只需要像下面这样定义即可。int valid;int tag;

2023-08-01 21:05:19 164

原创 lab3 attacklab

首先,通过这个指令生成前三个阶段要用到的ctarget的反汇编代码其次,假设我们的输入文件是touch1.txt,那么运行这个指令就可以去验证是否是正确的整理一下phase1个意思hex2raw接下来,需要找到touch1的地址,在我的这个文件里,touch1函数的起始地址是0x4017c0因此构造的输入应该是下面这样,前40个字节随便填,后面八个字节需要是地址,整体应该和下面一样。其实最后八个字节到底按什么顺序写还是挺有讲究的。

2023-07-30 16:45:46 115

原创 lab2 bomblab

我刚开始做phase4的时候,陷入了func4这个函数里,完全搞不清楚它在干啥。这也有了一个教训,看汇编代码的时候,不要陷进去汇编的细节,要能够提取它的作用,用C语言的形式去想一下,或者想一想它具体在完成什么动作。这个phase的大意是通过sccanf读取我们输入的6个数字,如果能够满足是1 2 4 8 16 32的话,那就可以通过。要求我们两个数字,其中第一个数字要小于等于14,第二个数字必须为0。但是有个问题就是,我们输入的应该是正序还是倒序的?结合着汇编代码去看,应该不难理解这个phase的意思。

2023-07-29 17:32:23 141

原创 lab1 datalab

修改bits.c,使其满足btest的测试,代码规范测试。

2023-07-27 21:17:16 137

原创 408算法题备考第一天

既然右边和下面都比自己大,从左上角和右下角出发都会有两个方向走。而从左下角或者右上角走就可以往一个方向走。

2022-08-19 18:09:32 320 1

原创 test!

实验四、测量数据误差统计处理实验报告姓名:曹栋学号:1947404025班级:车辆工程实验目的掌握多次等精度测量数据统计方法与步骤以及相关的编程实验内容实验代码# 导入math库,要使用sqrt函数from math import sqrt# 得到这一轮的平均数,误差数组,标准偏差# 其中Ave代表平均数,Num为源数据数组,Sigma为标准偏差def Solution(Num): Ave = sum(Num) / len(Num) # 即xi-平均数

2022-04-10 10:30:58 1687

原创 蓝桥杯 第六十四天 终极复习

目录数位dp之k好数图论dijkstraBellman_FordSPFA求最短路判断负环floyd求最短路prim算法kruskal算法染色法判断二分图匈牙利算法搜索DFS排列数n皇后问题树的重心BFS走迷宫八数码数论素数扩展欧几里得算法更相损减法动态规划01背包问题完全背包问题多重背包分组背包问题数字三角形最长上升子序列最长公共子序列最短编辑距离石子合并整数划分蒙德里安的梦想最短哈密尔顿路径没有上司的舞会滑雪数位dp之k好数盲猜会考数位dp,紧急复习一下def dfs(): global

2022-04-08 20:12:46 403 1

原创 dVPvHsqIaV

```pythonprint(111)```

2022-04-08 14:48:41 181

原创 蓝桥杯 第六十三天 DP

目录正则问题正确糖果括号配对鸣人的影分身术DPDFS破防想摆烂了,越学越菜,我太垃圾了正则问题这里有个很奇特的bug,我实在看不出来哪里的问题,但是它可以过百分之六十的样例##错误def dfs(): cur=0 global i while i<n: if a[i]=='x': cur+=1 i+=1 elif a[i]=='(': i+=1

2022-04-07 21:26:46 321

原创 蓝桥杯 第六十二天 数论

太菜了目录太菜了等差数列X的因子链五指山 (扩展欧几里得算法)最大比例等差数列def gcd(x,y): if y>x: x,y=y,x if y==0: return x else: return gcd(y,x%y)n=int(input())a=list(map(int,input().split()))a.sort()b=[]for i in range(1,n): b.append(a[i]-a[

2022-04-06 21:48:18 254

原创 蓝桥杯 第六十三天 贪心

股票买卖II贪心n=int(input())a=list(map(int,input().split()))b=[]for i in range(n-1): b.append(a[i+1]-a[i])ans=0for i in b: if i>0: ans+=iprint(ans)##动态规划n=int(input())a=[0]+list(map(int,input().split()))dp=[[0 for i in range(2)]fo

2022-04-06 18:31:46 195

原创 蓝桥杯 第六十二天 双指针 BFS 图论

目录日志统计献给阿尔吉侬的花束红与黑交换瓶子完全二叉树的权值地牢大师全球变暖大臣的旅费日志统计n,d,k=map(int,input().split())N=100005a=[0 for i in range(N)]adj=[[]for i in range(N)]maxv,minv=-1<<31,1<<31for i in range(n): x,y=map(int,input().split()) adj[x].append(y) minv=

2022-04-05 21:15:26 538

原创 蓝桥杯 第六十二天 模拟枚举排序

连号区间数n=int(input())a=list(map(int,input().split()))ans=0for i in range(n): maxv,minv=-1<<31,1<<31 for j in range(i,n): maxv=max(maxv,a[j]) minv=min(minv,a[j]) if maxv-minv==j-i: ans+=1print(ans)

2022-04-05 18:40:37 169

原创 蓝桥杯 第六十一天 DFS之剪枝

就一篇,没有目录,搜索剪枝难度还是挺高的小猫爬山一定不能大量搜索重复的情况def dfs(u,k): # 第u个小猫,第k辆车 global ans if k>=ans: return if u==n: ans=k return for i in range(k): if sums[i]+a[u]<=m: sums[i]+=a[u] d

2022-04-04 21:45:14 402

原创 蓝桥杯 第六十一天 数学与简单DP

买不到的数目朴素写法a,b=map(int,input().split())vis=[False for i in range(1020000)]vis[a]=Truevis[b]=Truecur=0for i in range(min(a,b),1000000): if vis[i]: if not vis[i+a]: vis[i+a]=True if not vis[i+b]: vis[i+b]=Tru

2022-04-04 19:32:01 383

原创 蓝桥杯 第六十天 DFS

目录1112迷宫红与黑马走日单词接龙分成互质组1112迷宫t=int(input())dx=[1,-1,0,0]dy=[0,0,1,-1]def isvalid(x,y): if x<0 or x>=n: return False if y<0 or y>=n: return False if adj[x][y]=='#': return False return Truedef dfs(x,

2022-04-03 21:26:36 96

原创 蓝桥杯 第六十天 二分与前缀和

1.数的范围def binaryleft(x): l,r=0,n-1 while l<r: mid=(l+r)//2 if a[mid]>=x: r=mid else: l=mid+1 if a[l]==x: print(l,end=" ") else: print(-1,end=" ") returndef binaryri

2022-04-03 18:37:50 506

原创 蓝桥杯 第五十九天

电路维修 (双端BFS)这一题是双端BFS的应用,感觉y总直接掏这个出来讲,有点难了这一题的难点首先不在双端队列,而是在对输入的理解,我们得把输入当做格子里的内容,而把定点当做我们进行遍历的依据,起点为(0,0),终点为(n,m)当我们从起点开始宽搜时,我们只能往四个角的方向前进,而决定我们前进的代价当然就是有没有电线正好对角,如果有,那就是0,否则就是1。所以真正恶心人的就在这里的判断上了,我们得找出来要前进的方向那个格子里的电线是什么状态,这里要用点ix,iy数组当解决了以上问题,才真正

2022-04-02 20:34:25 308

原创 蓝桥杯 第五十九天 递推与递归(复习)

递归实现指数型枚举def dfs(cur,path): if cur==n+1: for i in path: print(i,end=" ") print() return dfs(cur+1, path) dfs(cur+1,path+[cur]) returnn=int(input())dfs(1,[])递归实现排列型枚举def dfs(path): if len(path)==

2022-04-02 18:34:31 196

原创 蓝桥杯 第五十八天 BFS 多源最短路&最小步数

目录戳气球矩阵距离 (多源BFS)魔板戳气球上交今年机试的第二题,一道区间dp可是我还是不会做啊, 啊啊啊啊啊 ,稍微有点变形,日了狗了,蓝桥杯省赛之后我要把力扣的dp刷穿class Solution: def maxCoins(self, nums: List[int]) -> int: nums=[1]+nums+[1] n=len(nums) dp=[[0 for i in range(n)]for j in range(n)]

2022-04-01 21:48:30 230

原创 蓝桥杯 第五十八天 模板复习

拓扑排序def f(): from collections import deque q=deque([]) for i in range(1,n+1): if a[i]==0: q.append(i) while q: top=q.popleft() print(top,end=" ") for i in adj[top]: a[i]-=1

2022-04-01 18:24:12 332

原创 蓝桥杯 第五十七天 模板复习

并查集合并集合 (模板)def find(x): if x!=fa[x]: fa[x]=find(fa[x]) return fa[x]n,m=map(int,input().split())N=107fa=[i for i in range(N)]for i in range(m): a=input() op=a[0] p1=int(a[2]) p2=int(a[4]) if op=='M': fa1=fi

2022-04-01 11:39:27 98

原创 蓝桥杯 第五十七天 BFS之Flood Fill

目录走迷宫八数码池塘计数城堡问题山峰和山谷迷宫问题武士风度的牛抓住那头牛走迷宫def isvalid(x,y): if x<0 or x>=n: return False if y<0 or y>=m: return False if adj[x][y]==1: return False return Truedef bfs(): from collections import deque

2022-03-31 21:36:42 155

原创 蓝桥杯 第五十六天 模板复习

单调栈n=int(input())a=list(map(int,input().split()))s=[]for i in a: if not s: print(-1,end=" ") else: while s and s[-1]>=i: s.pop() if not s: print(-1,end=" ") else: print(s[-1

2022-03-31 12:18:15 112

原创 蓝桥杯 第五十六天 数位dp

目录度的数量数字游戏度的数量这一题主要是题意比较搞人,第一个break不太好理解def dp(x): if x==0: return 0 nums=[] while x>0: nums.append(x%b) x//=b ans=0 last=0 for i in range(len(nums)-1,-1,-1): x=nums[i] if x!=0:

2022-03-30 21:22:47 2483

原创 蓝桥杯 第五十五天 树形dp

目录没有上司的舞会 (经典树形dp)树的重心 (带边权)树的中心数字转换二叉苹果树 (有依赖的背包问题的树形dp)没有上司的舞会 (经典树形dp)def dfs(fa): choose,notchoose=a[fa],0 for i in adj[fa]: child=dfs(i) choose+=child[1] notchoose+=max(child) return [choose,notchoose]n=int(inpu

2022-03-29 21:49:19 167

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除