avatar
文章
107
标签
40
分类
34

Home
Tags
Categories
Music
港乐Live Show
Eden Mo Blog
搜索
Home
Tags
Categories
Music
港乐Live Show

Eden Mo Blog

操作系统MIT 6.S081 xv6内核(八):Multithreading实验
发表于2024-07-19|操作系统Linux操作系统项目C|MIT6.S081
Uthread: switching between threads实验 实验目的 实现一个用户级的线程切换:测试程序user/uthread.c会创建三个线程,每个线程打印一个语句,大部分逻辑已经完成,只剩下context切换逻辑。抢占式中断因为经过陷入机制,因此流程是比较繁琐的。核心的切换是在内核中调用yield,yield调用sched,sched做了一些故障检查,就调用了swtch,从这里我们会进入线程调度器线程,保存14个用户进程的内核寄存器,并且返回到scheduler函数调用的swtch函数,去除原来进程信息、释放锁,此后调度器又将另一个线程装载,调用swtch,并且从当前新进程的sched调用的swtch返回。继续执行陷入处理 直至恢复执行; 在用户级线程切换设计测试代码中,则省去了很多繁琐的跳转步骤;首先thread_schedule模拟了一部分scheduler函数功能,将线程存储在all_thread数组中,最大线程数量为4;线程初始化时取第一个线程,现在只需要解决两个问题: 线程如何执行程序? 如何实现线程的切换? 具体实现 直接看代码 ...
操作系统MIT 6.S081 xv6内核(七):Copy-On-Write Fork实验
发表于2024-07-17|操作系统Linux操作系统项目C|MIT6.S081
Implement copy-on write实验 实验目的 本节实验不是最难的一个,但是逻辑细节比较多(所以坑也多),也让我花了不少时间去打印和调试。本节和上一节页懒分配类似,都是利用Page Fault特性向xv6增加一些扩展。主要目的是,每次系统启动父进程会通过fork函数创建子进程,系统为子进程分配与父进程大小相当的空间,例如shell进程占4个页帧(4*4096字节),子进程也会分配新的4个字节;然而子进程很快就会被exec占据并且去运行其他进程,大部分情况下这新分配的空间没有被使用就被丢弃了,既浪费了内存也消耗了启动性能。 因此本节核心思想是在调用fork复制父进程时,不要直接为子进程分配物理内存,而是通过页表将子进程的虚拟地址也指向父进程的物理内存(暂且称其为COW内存);为了保证这个物理内存的安全,在共享后必须将物理内存的写权限取消成为只读内存,当子进程确实需要空间时,对该物理内存进行写操作就会造成Page Fault;而又为了区分进程是对这种COW内存操作,还是真的误读了其他只读的页帧,我们需要引入新的标志位PTE_COW来区分两种只读页面。 为了处理这个 ...
操作系统MIT 6.S081 xv6内核(六):Lazy Page Allocation实验
发表于2024-07-14|操作系统Linux操作系统项目C|MIT6.S081
Eliminate allocation from sbrk()实验 没有实验,只谈现象 这是Fans教授在课上提到的现象,在基础理论一文的Lazy Allocation一节我也具体剖析过,看完不难理解:只增加了虚拟内存,uvmunmap释放了虚拟内存指向的不存在的物理内存。 Lazy allocation实验 实验目的 实现一个简单的Lazy allocation,要求进程使用sbrk进行内存分配时不要直接满足,引入懒分配策略等到进程使用到了再申请物理内存,如果设计是成功的,那么shell能够正常运行echo hi命令。 具体实现 这是一个简单的Lazy allocation实现,在基础理论已经实现并且做了剖析讨论,看过基础理论或者课程的可以直接跳到第三个实验。具体步骤是在kernel/sysproc.c中sbrk函数增加虚拟内存,取消物理内存分配 123 myproc()->sz=myproc()->sz+n;//new//if(growproc(n) < 0)// return -1; 这个改动会得到page fault,因此需要在k ...
VMware Ubuntu配置静态IP
发表于2024-07-09|Linux
以前习惯在VMware直接做命令,现在使用Vscode比较多。但是远程SSH的问题在于虚拟机会不定期更新内网IP,规律是:重启不一定更新、关机不一定更新,电脑关盖子睡眠一定更新。。。非常奇怪,导致每次都要重新打开工作区。 尝试配置静态IP,环境为: Ubuntu 18.04 VMware 16 NAT模式 总体而言基本没有遇到困难,但是发行版不同、文件、步骤都不一样,也容易踩坑,所以记录一下。 Win10打开“虚拟网络编辑器”,选中NAT桥接VMnet8,设置子网IP和子网掩码;子网IP第三个网段自行设置成以前常用的。 进入NAT设置,将网关设置成“192.168.xxx.1”,xxx和步骤1保持一致。 Win10打开设置——更改适配器选项; 在Ipv4协议属性中设置IP地址,子网掩码,默认网关和DNS;默认网关保持和刚刚设置的一致。 上面的IP只是基本的设置,还不是我们要设置的静态IP 进入虚拟机,如无意外/etc/netplan下会存在一个yaml网络配置文件,按照下文增加和修改配置,addresses是要使用的静态IP,d ...
操作系统MIT 6.S081 xv6内核(五):Traps实验
发表于2024-07-08|操作系统Linux操作系统项目C|MIT6.S081
RISC-V assembly实验 没有实验,回答问题 阅读call.asm中函数g、f和main的代码: 哪些寄存器保存函数的参数?例如,在main对printf的调用中,哪个寄存器保存13? 答:函数参数从a0到a7存储,13是第三个参数,所以是a2保存; main的汇编代码中对函数f的调用在哪里?对g的调用在哪里(提示:编译器可能会将函数内联) 答:提示已经给出答案,汇编代码的sp没有变动,也没有存入ra,说明没有进行函数调用,f8已经被函数内联优化并且提前算出答案11了,这一行调用就是打印12、13; printf函数位于哪个地址? 调用位置在 1230: 00000097 auipc ra,0x034: 5e6080e7 jalr 1510(ra) # 616 <printf> 答:存入pc0x30到ra,1510的16进制对应0x5e6,所以跳转地址是二者相加0x616; 在main中printf的jalr之后的寄存器ra中有什么值 ...
操作系统MIT 6.S081 xv6内核(四):Page Table实验
发表于2024-07-01|操作系统Linux操作系统项目C|MIT6.S081
Print a page table实验 实验目的 当您启动xv6时,它应该像这样打印输出来描述第一个进程刚刚完成exec(),init时的页表: 12345678910page table 0x0000000087f6e000..0: pte 0x0000000021fda801 pa 0x0000000087f6a000.. ..0: pte 0x0000000021fda401 pa 0x0000000087f69000.. .. ..0: pte 0x0000000021fdac1f pa 0x0000000087f6b000.. .. ..1: pte 0x0000000021fda00f pa 0x0000000087f68000.. .. ..2: pte 0x0000000021fd9c1f pa 0x0000000087f67000..255: pte 0x0000000021fdb401 pa 0x0000000087f6d000.. ..511: pte 0x0000000021fdb001 pa 0x0000000087f6c000.. .. ..510: ...
操作系统基础:内存管理
发表于2024-06-22|操作系统操作系统理论|内存管理理论
内存 CPU是高速设备,磁盘是一种低速设备,为了使数据读写不拖累CPU的计算速度,二者通过内存进行交互,内存速度高,但存储空间小于外存,用于存放CPU处理的数据。 首先要搞明白革命对象,存储器涵盖的种类是十分广泛的,有些存储器概念太久不接触也会混淆。 外存 外存就是最常见的存储器件,例如电脑硬盘等,用于大量存放数据,掉电也可以保存数据,只是相对内存而命名。 内存 内存就是暂存硬盘数据的存储器,硬件上是一种内存条的东西,硬盘的IO读写速度不能满足CPU要求,因此内存应运而生,一旦掉电,内存数据就会被清空。内存也称主存,一般是属于DRAM。 cache cache是比内存更加高速的缓存,对CPU而言,内存的速度仍然是欠缺的,因此高速的读写需要cache的帮助,cache存在于内存和CPU之间,也因为其对速度的追求,其大小一般很小,几十k到几十M。现代CPU一般采取多级缓存架构,越靠近CPU,容量越小,速度越快。cache一般使用的是SRAM。 RAM与ROM与Flash RAM是随机读取存储器,可以对存储器进行任意读写,但是掉电数据也会丢失;RAM被分成静态随机读取存储 ...
操作系统MIT 6.S081 xv6内核:基础理论
发表于2024-06-12|操作系统操作系统理论LinuxC|MIT6.S081
从常规操作系统原理和xv6系统原理两个方面入手,记录了一些重要的操作系统理论,有助于帮助加深lab的理解。 中断和异常 xv6的中断系统并不多,只有缺页中断、系统调用中断、设备中断以及其他故障中断,这里中断一节是针对操作系统的概述,而其余内容基本仅面对xv6及其源码。 中断的作用 CPU上的运行程序分为两种,一种是操作系统内核程序,另一种是应用程序,在合适情况下,操作系统会把CPU使用权交给应用程序,此时从内核态切换到用户态,通过执行一条特权指令:修改PSW标志位为用户态,意味着内核主动让出CPU使用权;而如果需要从用户态切换回内核态,唯一途径是通过中断实现,内核会重新夺回CPU使用权。 内中断和外中断 内中断(异常中断) 内中断:与当前执行的指令有关,中断信号来自CPU内部; 典型的内中断: 1. 用户态植入非法特权指令:特权指令是一种只允许内核态访问的指令(访问对应特权寄存器),如果在应用程序中出现特权指令,会触发中断,内核会重新获取CPU使用权,内核程序会继续处理这个中断。 非法参数:用户程序除数为0,触发中断,程序不会继续执行,内核重新获取控制权处理中 ...
操作系统MIT 6.S081 xv6内核(番外):GDB调试
发表于2024-06-07|操作系统Linux操作系统项目|MIT6.S081
GDB是一个强大的代码调试工具,很多时候printf能帮助我们打印错误,但是如果栈调用复杂,或者遇到奇奇怪怪的其他错误,就没有办法了。对于xv6的gdb调试,资料可谓是参差不齐,而且很多地方只描述了一半的方法,也让我花了一晚上的时间去找答案,调试是一个积累的过程,该文章会持续更新。 运行 终端运行: 1make qemu-gdb 新建终端运行: 1riscv64-unknown-elf-gdb kernel/kernel 此时会出现一个警告: 12warning: File "/home/linux/Desktop/MIT_xv6/xv6-labs-2020/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".To enable execution of this file add 大概意思是你的gdb初始化被某个路径阻断了,因此需要在家目录新建一个.gitinit ...
操作系统MIT 6.S081 xv6内核(三):System calls实验
发表于2024-06-07|操作系统Linux操作系统项目C|MIT6.S081
trace实验 trace目的 目的:完成一个trace功能 12345$ trace 32 grep hello README3: syscall read -> 10233: syscall read -> 9663: syscall read -> 703: syscall read -> 0 trace是一个追踪系统调用的功能,用于打印哪个进程号、调用什么系统调用函数、返回值是什么,trace 32 grep hello README的意思是在grep hello README(在README中搜索hello),系统需要读入README文件,32代表追踪系统读文件调用情况。为什么32代表是追踪读呢,因为编号被定义在kernel/syscall.h中,每种系统调用对应一种编号,例如: 1#define SYS_read 5 而1<<SYS_read(1左移五位)正好就是32,如果追踪多个调用,就是把对应位置的二进制置1得到十进制。 具体实现 根据提示可以轻易完成前面部分: - 在Makefile的UPROGS中添加$U/_ ...
1…567…11
avatar
Eden
不做前端所以博客不漂亮,纯免费授权码来自公众号:归零者星的日与夜
文章
107
标签
40
分类
34
Follow Me
公告
文章任何错误、疏漏、建议麻烦请联系博主qq邮箱2436444815@qq.com
最新文章
OpenCV C++记录(十一):Mat数据规范化、灰度直方图与均衡算法2025-05-15
OpenCV C++记录(十):形态学处理基础2025-05-12
OpenCV C++记录(九):二值化与图像模糊(滤波)算法2025-05-08
C++ Generic Programming:SFINAF与类型萃取2025-04-26
Modern C++ Design(第二章):Techniques2025-04-20
分类
  • C20
  • C++ Qt开发7
  • C/C++14
  • CPP14
    • C++ Generic Programming3
  • FPGA2
    • verilog2
  • Linux23
标签
3D目标检测 Linux 信号与系统 网络编程 Linux扩容 MIT6.S081 Vivado IP核 读写锁 OpenCV Modern C++ Design 数据结构与算法 引导程序 C++ Generic Programming MathType快捷键 Private Content Stanford CS144 格式化输出 内存管理理论 进程与线程 数据库 Protobuf C++ Qt C++ SFINAF and Type Traits json序列化 C++11 新特性 设计模式 C++基础 高等数学 Effective C++ 奇奇怪怪的实现 Markdown语法 CSAPP 计算机网络理论 线程池 Qt网络编程 vim使用 C++高阶 CMake Git基本使用 MCU开发
归档
  • 五月 20253
  • 四月 20254
  • 三月 20256
  • 二月 20255
  • 一月 20257
  • 十二月 20248
  • 十一月 20242
  • 十月 20245
网站资讯
文章数目 :
107
本站总字数 :
473.9k
本站访客数 :
本站总访问量 :
最后更新时间 :
©2023 - 2025 By Eden
框架 Nodejs|你忘掉理想 只能忙于生活吗
粤公网安备 44010602011738号|粤ICP备2023072610号
搜索
数据库加载中