MIT 6.S081学习笔记
计划花25天时间学完6.S081课程,从2月20日-3月20日。
课程主页Link
xv6 book
GDB User Manual
Lecture 1: Introduction and Examples
课程主题:设计和实现操作系统
OS的三大功能:多路复用、隔离和交互。
Lab: Xv6 and Unix utilities
Boot xv6
根据指令操作
sleep
使用system call实现。
pingpong
使用pipe实现。
primes
使用pipe+递归实现。
find
使用递归实现。
xargs
xargs没有成功完成,对C语言的特性和pipe、exec等命令了解得太少了。
这里要吐槽一下,第一个lab难度有点大,差点把人给整劝退了:(
Lecture 2: C and gdb
在qemu中使用gdb调试程序,参考Fall2020/6.S081 实验笔记(〇) Lab0: Preparation2
Lecture 3: OS Organization and System Calls
Lab: system calls
System call tracing
难点在于从用户态向内核态转换时,需要将trace后的参数存入寄存器,并修改其他系统调用函数使其输出相关信息,不过也挺有意思的,增加了对xv6的理解。思路如下:
1.修改proc.h中proc结构,新增trace_num和trace_flag变量;
2.在sysproc.c中新增sys_trace函数;
3.修改fork;
4.修改syscall;
Sysinfo
难点在于copyout的使用,差点把qemu整崩溃了。
在调试过程中出现了panic: acquire的错误,原因在于统一UNUSED进程时没有释放对应进程的锁导致出错;出现了FAIL: sysinfo succeeded with bad argument错误,问题在于没有对copyout错误的情况作出处理。
Lecture 4: Page Tables
PPN:Physical Page Number
PTE:Page Table Entry
三级页表是由CPU中的硬件部分MMU实现的
Lecture 5: RISC-V Calling Convention and Stack Frames
gdb常用命令演示,stack结构,stack frame——函数调用所产生的信息;
C中struct有各种不同的字段,这些字段在内存中依次存储,类似于数组,不过元素的类型可能有所不同;
Lab pgtbl: Page tables
Speed up system calls
在内存中使用一个新的page来存储用户进程的进程号,并设置用户态进程只能read该page,这样用户态进程在获取进程号的时候不用切换到内核态,实现了系统调用的加速。
Print a page table
根据标志位的不同来判断当前页表是否为第三级页表。
Detecting which pages have been accessed
debug程序的两种方式,第一种使用printf输出关键参数,第二种使用gdb进行调试,但目前gdb用得还不太熟练。
debugtui enable指令,开启Text User Interface;
Lecture 6: Isolation & System Call Entry/Exit
Trap code:即使从用户态进入内核态后,也不能向任意地址write/read数据,得根据page table来。
附录——XV6源码中各个函数的作用
1.为给定的进程创建user page table并返回页表基地址 kenel/proc.c/proc_pagetale;
2.在给定的页表上映射一对虚拟地址和物理地址 kenel/vm.c/mappages;
3.当alloc参数为0时,kenel/vm.c/walk返回的是第三级page table上对应的PTE;
4.kenel/vm.c/uvmunmap,当do_free为0时,将第三级page table上对应的PTE设置为invalid,即取消虚拟地址和物理地址的映射关系;do_free为1,在取消映射关系的同时还需要把对应的物理内存free;
5.kenel/vm.c/uvmfree,将用户页表上的所有映射清除,并free对应的物理内存;并free第一、二级page table;
6.kernel/vm.c/mappages,在pagetable中建立所提供虚拟地址va和物理地址pa之间的映射;
7.kernel/vm.c/freewalk,递归的将所有页表free,默认第三级页表的映射关系已经解除(从这个函数可以看出前两级页表PTE和第三级PTE不同的是,前两级中flag只用valid有效,其他标志位均为0?)。
附录——寄存器
satp——每个CPU都有一个,用来存储页表根地址。
附录——一些疑问
1.Lab pgtbl中新增page为什么不直接在page table中添加,而是像TRAMPOLINE那样呢?
2.TRAMPOLINE page的作用是什么?为什么每个新建的进程都有该page?
A:trampoline page前半部分汇编代码负责进入trap之前保存相应寄存器,加载内核page;后半部分汇编代码负责恢复之前保存的寄存器,返回用户空间,恢复用户指令流的执行。当使用ecall指令从用户态转换到内核态的时候,ecall并不会切换page table,也就是说现在使用的仍然是用户页表,所以需要将trampoline和trapframe页映射到每个用户进程上。实际上,ecall只完成以下三个任务:
1.将模式从用户态切换到内核态;
2.将pc的值保存至sepc寄存器;
3.跳转到stvec指向的地址,即trampoline开始的地方。
3.同上,trapframe page?
Q:相当于容器,用于在trap发生时保存用户的寄存器和内核对应的信息,内核页表、栈等。
4.将一个虚拟地址转换为物理地址的过程,为什么是先右移10位再左移12位?为什么不左移10位?
5.lab pgtb中提到检测哪些page被访问了,可以用于垃圾回收机制,具体是怎样实现的呢?这里的问题在于,当read/write某个page后,PTE中对应的flag被永远的设置为1,怎么用于垃圾回收呢?
相关文章:
MIT 6.S081学习笔记
计划花25天时间学完6.S081课程,从2月20日-3月20日。课程主页Link xv6 book GDB User Manual Lecture 1: Introduction and Examples课程主题:设计和实现操作系统 OS的三大功能:多路复用、隔离和交互。 Lab: Xv6 and Unix utiliti…...
《网络安全入门到精通》 - 2.1 - Windows基础 - DOS命令Windows防火墙Windows共享文件
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「订阅专栏」:此文章已录入专栏《网络安全入门到精通》 Windows基础一、DOS命令1、目录文件操作dir 列出目录文件cd 切换目录md 创建目录rd 删除目录move 移动文件或目…...
八、Vben框架动态生成可编辑Table
开发过程中产品经理提出了一些奇怪的需求,让人很摸不着头脑,一问就是客户的需求就是这样,那么我们开发只能想各种办法啦。 最近就提出了两个需求, 第一个是需要在日期选择的时候根据时间选择的不同让底下table中增加两个时间中间的…...
浅谈ERP数据的重要性
影响一个ERP项目的因素有很多,数据无疑是其中很重要的一项,正所谓“正确的诊断源于准确的信息,准确的信息基于可靠的采集”,当我们抓住数据这个根基,大处着眼,小处着手的时候,我们距离ERP成功的日子就不会太…...
【RabbitMQ笔记06】消息队列RabbitMQ七种模式之Topics主题模式
这篇文章,主要介绍消息队列RabbitMQ七种模式之Topics主题模式。 目录 一、消息队列 1.1、主题模式(Topics) 1.2、案例代码 (1)引入依赖 (2)编写生产者 (3)编写消费…...
ChatGPT似乎有的时候并不能搞懂Java的动态分派,你懂了吗?
目录 碎碎念 ChatGPT 中出现的问题 那么正确答案应该是什么呢? 分派的相关知识点总结: 分派是什么? 静态分派与动态分派: Java语言是静态多分派,动态单分派的; 静态分派:静态重载多分派…...
【C++初阶】vector的模拟实现
大家好我是沐曦希💕 文章目录一、前言二、无参构造&析构三、基础接口1.empty和clear2.size和capacity3.[]和iterator四、reserve和resize五、尾插尾删六、其他构造1.迭代器区间构造2.拷贝构造七、memcpy问题八、完整代码一、前言 在模拟实现容器时候࿰…...
微信小程序、小游戏的流量主一般可以赚多少钱?
本篇文章主要科普小程序、小游戏流量主一般赚钱的实际情况,通过在下长期运营的经验汇总而成。 日期:2023年2月26日 作者:任聪聪 小程序、小程序满1000用户后即可开通流量主,但实际上很多人并没有传说中的那种日赚几千的流量收入的…...
jni-Demo-基于linux(c++ java)
跑一个jni 的最简单的Demo需要提前准备 VsCode 编译器、win10下,vscode中集成linux操作系统、c编译器(gcc、g),java编译器(jdk1.8)参考:https://mangocool.com/1653030123842.htmlJniDemo类&…...
指针的进阶——(1)
本次讲解重点: 1、字符指针 2、数组指针 3、指针数组 4、数组传参和指针传参 5、函数指针 关于指针这个知识点的主题,我们在前面已经初级阶段已经对指针有了大致的理解和应用了。我们知道了指针的概念: 1、指针就是地址,但口…...
电商平台的促销活动如何抵御大流量的ddos攻击
每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意 DDoS 攻击,无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量 DDoS 攻击,且对延迟敏感,因此只需要在活动期间按需使用 DDoS 防…...
代码随想录-48-104. 二叉树的最大深度
目录前言题目1.层序迭代思路2. 本题思路分析:3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 …...
【Vue3源码】第六章 computed的实现
【Vue3源码】第六章 computed的实现 上一章节我们实现了 ref 及其它配套的isRef、unRef 和 proxyRefs API。这一章开始实现computed计算属性。 认识computed 接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。…...
Java基础之注解
3.注解 3.1概述【理解】 概述 对我们的程序进行标注和解释 注解和注释的区别 注释: 给程序员看的注解: 给编译器看的 使用注解进行配置配置的优势 代码更加简洁,方便 3.2自定义注解【理解】 格式 public interface 注解名称 { public 属性类型 属性名() default 默认值…...
三、线性表
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 自学JAVA数据结构笔记,跟学视频为:黑马程序员Java数据结构与java算法全套教程…...
C++统计方形
统计方形 内存限制:256 MB 时间限制:1 S 题目描述 有一个n*m方格的棋盘,求其方格包含多少正方形、长方形(此处长方形不包含正方形) 输入格式 输入存在多组测试数据。每组测试数据输入两个整数n,m,数字不超…...
Tina_Linux配网开发指南
OpenRemoved_Tina_Linux_配网_开发指南 1 概述 1.1 编写目的 介绍Allwinner 平台上基于wifimanager-v2.0 的WiFi 配网方式,包括softap(WiFi ap 模式热点配网),soundwave(声波配网),BLE(蓝牙低功耗配网)。 1.2 适用范围 • allwinner 软件平台tina v5.0 版本及以…...
高频面试题|RabbitMQ如何防止消息的重复消费?
一. 前言最近有很多小伙伴开始找工作,在面试时,面试官经常会问我们这样一个题目:RabbitMQ如何防止重复消费?有很多小伙伴这个时候都在想,消息怎么还会重复消费呢???.......所以他们在面试后就跑来问壹哥,针对这个比…...
黑盒测试用例设计方法-边界值分析法
目录 一、边界值定义 二、边界值的考虑 三、边界值的优化 四、边界值的设计用例的步骤 五、案例 六、边界值的类型 一、边界值定义 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下…...
项目风险管理中不可忽视的5个关键点
1、风险意识非常重要 项目经理必须要有风险意识,并不是项目计划做好就万事大吉,而是需要对项目风险进行预判,时刻保持风险意识,及时发现和处理项目风险。 项目风险管理关键:风险意识 2、建立组织风险资产库 寻…...
机器学习求解流体方程被高估?Nature重磅揭秘真相(含金量极高),看完这篇少走3年弯路!
一、ML解流体方程的虚火:看似亮眼的成果藏着隐忧 用机器学习加速求解流体相关偏微分方程(PDE)是当前计算物理领域的热门方向,这类研究普遍将传统数值解法作为基线对比,动辄宣称ML模型速度提升几十上百倍。但这些成果的…...
SiameseUIE在金融文档处理中的应用:实体识别与事件抽取实战案例
SiameseUIE在金融文档处理中的应用:实体识别与事件抽取实战案例 1. 引言:金融文档处理的挑战与机遇 金融行业每天产生海量的文档数据,从财报公告到风险报告,从合同协议到新闻资讯。这些文档中蕴含着大量有价值的信息,…...
从 Key User 扩展到可运输交付:彻底吃透 SAP Fiori 中的 Adaptation Transport Organizer
在很多团队里,业务顾问第一次接触 SAP Fiori 扩展工具时,都会有一个很直观的问题:为什么我在 Custom Fields and Logic、运行时适配,或者其他 Key User 扩展场景里做了增强,却看不到熟悉的 package 和 transport request 录入步骤?答案就在 Adaptation Transport Organiz…...
Python 异步下载任务调度机制
Python异步下载任务调度机制:高效处理网络IO的利器 在当今数据驱动的时代,高效下载网络资源成为许多应用的核心需求。Python凭借其强大的异步编程能力,通过asyncio、aiohttp等库构建的异步下载任务调度机制,能够显著提升网络IO密…...
fft npainting lama镜像:新手友好的图片修复工具,开箱即用
fft npainting lama镜像:新手友好的图片修复工具,开箱即用 1. 为什么选择这个图像修复工具? 在日常工作和生活中,我们经常会遇到需要修复图片的场景: 珍贵的家庭老照片出现了划痕或污渍精心拍摄的风景照被不必要的水…...
Compose | UI组件(十五) | Navigation-Args - 类型安全导航参数实践
1. 类型安全导航参数的重要性 在Jetpack Compose中使用Navigation组件时,参数传递是最常见的需求之一。传统的字符串键值对方式虽然简单,但在实际开发中经常遇到各种问题。比如参数类型不匹配、参数缺失导致的空指针异常、参数名称拼写错误等运行时错误。…...
Debian 12 安装 Java 21 的两种方法对比:Oracle JDK vs OpenJDK(附详细步骤)
Debian 12 安装 Java 21 完全指南:Oracle JDK 与 OpenJDK 深度对比 在当今的开发环境中,Java依然是最重要的编程语言之一。无论是企业级应用开发、大数据处理还是Android应用开发,Java都扮演着关键角色。对于使用Debian 12系统的开发者来说&a…...
医学图像配准新突破:Prob-VoxelMorph如何用微分同胚性避免形变重叠?
医学图像配准新突破:Prob-VoxelMorph如何用微分同胚性避免形变重叠? 在医学影像分析领域,图像配准技术一直是支撑精准诊断和治疗规划的核心支柱。想象一下,当医生需要比较患者不同时间点的脑部扫描结果时,或是将功能MR…...
LumiPixel Canvas Quest集成Vue.js:打造在线人像创作工坊
LumiPixel Canvas Quest集成Vue.js:打造在线人像创作工坊 1. 从创意到实现:在线人像创作平台的价值 想象一下这样的场景:一位独立摄影师需要为不同客户快速生成风格化人像作品,传统修图流程需要数小时手动调整。而现在ÿ…...
杰理之立体声利用数字音量节点实现左右声道平衡【篇】
利用数字音量通过dB转换,去设置LR声道的数据大小,实现LR声道数据幅值不同达到声道平衡的目的,适配用户人耳情况...
