BUAA-OS-Theory-Chapter3-1
第三章 内存管理 - Part1存储器的管理
存储层次:寄存器-cache-主存-外存
存储管理的基本目标:地址独立(程序地址与物理地址无关)、地址保护(程序之间不能访问)
存储管理的核心问题:分配和回收
地址变换:可执行文件生成中的链接技术、程序加载时的重定位技术,进程运行时硬件和软件的地址变换技术和机构。
存储共享与保护:代码数据共享对地址空间的访问权限
存储器扩充:存储器的逻辑组织和物理组织
地址空间与存储空间
地址空间(虚拟地址):程序编译后限定于地址空间内,是逻辑地址的集合
存储空间(物理地址):主存存储单元相关,是物理地址的集合
单程序的内存管理
此情况下内存中只有操作系统和一个用户程序
操作系统只占用固定空间
用户程序永远从同一个地方开始运行,地址在运行前可以进行计算
方法:
静态地址翻译:在程序运行前计算出所用的物理地址(可以由程序加载器实现),且无需地址翻译,运行速度快
缺点:
比物理内存大的程序无法加载、运行
不区分常用数据导致资源浪费
多程序的内存管理 - 分区式内存管理
把内存分为相等或不等的分区,操作系统占用一个分区,每个程序占用一个 ...
BUAA-OS-Theory-Chapter2
第2章 系统引导计算机启动前必须使得硬件处在最安全、通用、功能最弱的状态,并在启动过程中对硬件进行设置,逐步提升硬件处理能力
必须使用启动程序对计算机进行启动
启动程序必须运行在启动好的计算机上
OS启动是一个逐步释放系统灵活性的过程
启动的流程:BIOS → MBR → BootLoader → OS
BootLoader
引导加载程序,是系统加电后运行的第一段代码,在操作系统内核启动前运行
Booter:初始化并运行系统硬件
Loader:将操作系统代码加载到内存中,并跳转运行
嵌入式系统经常用U-boot作为OS装载程序,X86常使用LILO和GRUB
计算机的启动过程(MIPS)
MIPS架构使用的U-boot分为stage1和stage2两个阶段,通常stage1使用汇编语言实现,stage2使用C语言实现
stage1实现简单的功能,初始化设备
stage2在stage1的基础上可以实现更复杂的功能
MIPS的基本地址空间
在32位系统下,程序地址空间(共4GB)被划分为四个区域,不同区域具有不同的属性:
按物理地址自下而上地,具有自己的特征:
...
BUAA-OS-Theory-Chapter1
第1章 引论一些小点
操作系统的工作
程序的执行
完成与硬件有关的工作
完成于应用无关的工作
计算机系统的效率与安全问题
什么是操作系统
操作系统是一组管理计算机硬件资源的软件集合,它向计算机程序提供共性的服务。
提供了用户与硬件间的接口
控制、管理计算机硬软件资源
组值计算机系统工作流程,改善系统性能
操作系统的特征与功能特征:并发、共享、虚拟、异步
功能:
处理机管理
存储器管理
设备管理
文件管理
作业控制
BUAA-OS-2023-Lab5-2-Exam
完结撒花,感谢陪伴(?)
Exam - 打开相对路径文件题目背景在 Lab5 的课下内容中,我们实现了通过绝对路径,也即相对于磁盘根目录而言的路径,打开文件,为其获取 struct Open 与 struct File 的函数—— open。
int open(const char *path, int mode);
现在,为了拓展打开文件的方式,我们计划额外实现一个通过指定目录 + 相对路径打开指定文件的函数:openat。
int openat(int dirfd, const char *path, int mode);
在这里,我们保证:
目录代表的文件已经在文件管理系统中(占据 Open)与当前进程中(占据 Fd)被打开,即可以通过其 fdnum 对应的 struct Fd 获取信息
调用 open、openat 的所有目录/文件均存在,且 openat 只会打开普通文件(非目录)
调用 openat 打开的路径均为相对路径,即不会以 / 开头
题目要求我们可以按照通过新建 fsipc 的种类以实现目标功能。那对于实现新 fsipc_* 的全过程,有必要进行总结
...
BUAA-OS-2023-Lab5-Report
BUAA-OS-2023-Lab5-ReportThinking 5.1
如果通过kseg0 读写设备,那么对于设备的写入会缓存到Cache 中。这是一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和IDE 磁盘)的操作会有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
如果使用 kseg0 段读写设备,那么对于外设而言,在系统读取外设时就会不可避免地先在 Cache 中查找设备对应的地址,如果查询到就会返回缓存的值。但如果在上一次缓存过后,设备的值已经发生了改变,这时我们从 Cache 中读取到的就是过时的错误信息。
对于写入也是同理,我们会优先写入到 Cache 中对应的地址处,那么下一次写就会覆盖上一次写的结果,导致外设并不能及时、正确地读取到我们写入的值。
对于不同的外设种类而言,这个现象会有些微差异。串口设备由于其即时性与高使用频率,会更容易出现这样的错误,对于磁盘而言则不太容易。
Thinking 5.2
查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下 ...
BUAA-OS-Probe-Lab5-Part3
用户态定义与接口在之前的分析中,我们已经完成了文件管理进程中的函数实现。现在我们来分析用户态中用户直接可用的函数接口与数据结构定义
我们还是从距离文件系统最近的函数与文件开始:user/lib/fsipc.c 和 user/include/fsreq.h
首先明确用户进程和文件管理进程使用 IPC 通信进行交互。在文件管理进程的运行的核心、分发函数 serve 中,我们通过 ipc_recv 从用户进程获取到了一片虚拟地址 REQVA,并且针对不同的信息,将 REQVA 转换成了不同的数据结构,进行处理。这些数据结构就定义在 fsreq.h 文件中。
#define FSREQ_OPEN 1#define FSREQ_MAP 2#define FSREQ_SET_SIZE 3#define FSREQ_CLOSE 4#define FSREQ_DIRTY 5#define FSREQ_REMOVE 6#define FSREQ_SYNC 7struct Fsreq_open { char req_path[MAXPATHLEN]; u_int req_omode;} ...
BUAA-OS-Probe-Lab5-Part2
当实现完 Part1 中的函数后,磁盘就通过 fsformat 程序成功地生成了。在继续之前,建议大家看一看指导书的这个图,这个文章的顺序大概是:文件系统服务进程→交互区→用户进程
接下来我们正式进入内核,处理后续工作。
块缓存
块缓存指的是借助虚拟内存来实现磁盘块缓存的设计。
在 MOS 系统中,文件管理“系统”,是以一个进程的形式存在的,它通过从磁盘中读写数据,并与其他用户进程交互来实现文件的管理,这些被使用到的文件就会先被缓存在文件服务进程的进程空间中。类似于批发商从生产商处取货,存储在自己的仓库里,使用时再拿出来给下级的经销商(x)
我们规定,文件管理进程使用大小为 DISKMAX 字节的空间作为磁盘块的缓存区,并且缓存区的存取单位为磁盘块。每个磁盘块都应该在内存中有单独相对应的位置进行缓存,这样就限制了我们内核支持的最大磁盘大小。
#define DISKMAP 0x10000000#define DISKMAX 0x40000000
为了在磁盘块和内存之间进行交换,我们需要准备一系列辅助和工作函数,而这系列的共 35 个函数都被放置在 fs/fs.c 文件中。(fil ...
BUAA-OS-Probe-Lab5-Part1
Lab5 文件系统到 Lab4 为止,我们已经基本处理了操作系统中内存和进程的管理,现在已经能够执行基础的功能了。然而实际上我们并不能把所有数据都存放在内存中,这时我们就需要引入文件系统这一概念,把数据交由磁盘进行存储。
Lab5 中主要涉及到以下内容:
硬件外设与读写驱动
磁盘结构与驱动
文件系统服务进程操作
硬件外设与读写驱动本次实验中,我们要实现的驱动都使用 MMIO 技术进行编写,也就是直接向内存中某个空间写入以达成对外设的访问。具体到我们的 MOS 实验中,需要访问的外设共有三个:控制台、硬盘、时钟。在这一部分,我们需要实现的就是供这些外设使用的读写驱动(接口),为后面的文件系统的访问做准备。
* * ---------------------------------** | device | start addr | length |* * -----------+------------+--------** | console | 0x10000000 | 0x20 | (dev_cons.h)* | IDE disk | 0x13000000 ...
BUAA-OO-UNIT3-Summary
面向对象设计与构造第三单元总结
分析本单元的测试过程
谈谈你对黑箱测试、白箱测试的理解
对单元测试、功能测试、集成测试、压力测试、回归测试的理解
是否使用了测试工具
数据构造有何策略
梳理本单元的架构设计,分析自己的图模型构建和维护策略
分析作业中出现的性能问题及其修复情况,谈谈自己对规格与实现分离的理解
本单元中同学们实现了OK测试方法,请同学们思考OK测试对于检验代码实现与规格的一致性的作用,有何改进何建议
本单元学习体会
作业要求
单元第一次作业,需要完成的任务为实现简单社交关系的模拟和查询,学习目标为 入门级JML规格理解与代码实现。
单元第二次作业,需要完成的目标是进一步实现社交关系模拟系统中的群组和消息功能,学习目标为进一步掌握JML规格的理解与实现。
单元第三次作业,需要完成的目标是进一步实现社交关系系统中不同消息类型以及相关操作,学习目标是理解JML规格在面向对象设计与构造中的重要意义,并掌握利用JML规格提高代码质量的能力
这个单元主要根据课程组提供的类、方法及其相关的 JML 指导,由我们自行书写的这些要求的实现。本单元指导书内容较少,主要的信息来源是我 ...
BUAA-OS-2023-Lab5-1-Exam
本次上机还算中规中矩,能够完全理解题意后,写起来还是很顺手的。(实际上,根本读题的信息都读不全)
Exam - 时间查询与计算题目背景在 Lab5 与 Lab2 中,我们分别实现了不同种类外设的读写操作,现在我们需要实现一个能够获取当前物理时间的函数,和一个要求进程必须等待指定时间后才能运行的函数。现在我们介绍如何获取实时间。
GXemul 中除了磁盘 disk 还存在另一类外设——实时时钟 rtc (Real-Time Clock),其中记录了 Unix 时间戳,即从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数。为了进一步精确 Unix 时间戳, rtc 中还记录了一个微秒字段。
当我们需要读取 rtc 中存放的时钟的值时,需要先触发时钟更新,才能获取到正确的数据,未更新时首次读取默认是 0(别问我怎么知道的)
在 GXemul 的手册中我们能查阅到 rtc 的起始地址为 0x15000000,且不同偏移量下的读写效果如下:
偏移
效果
数据位宽
0x0000
读/写:触发时钟更新
4 bytes
0x0010
读:从格 ...