操作系统
操作系统
简介
在 B 站刷视频的时候发现自己大学的知识像没学一样,回头捡捡操作系统。
xv6 教学操作系统的安装
首先可以通过如下命令安装相关依赖并拉取项目进行编译
1 |
|
在编译完成后即可使用如下命令进入系统:
1 |
|
注:退出系统时则需要同时按住
Ctrl
+A
然后松开,接着按下X
即可退出虚拟机。
如果需要清除之前编译的内容则可以使用如下命令:
1 |
|
进程
一个 xv6 进程由两部分组成,一部分是用户内存空间(指令,数据,栈),另一部分是仅对内核可见的进程状态。
而在 Linux 中也类似,进程内存空间分成以下两个不同区域:
- 内核空间 (Kernel Space):这是操作系统(内核)的核心所在的内存受保护区域。内核负责管理硬件、调度任务以及为应用程序提供基本服务。内核空间是共享的,并且对于所有进程都是相同的。
- 用户空间 (User Space):这是您的应用程序及其数据所在的位置。出于安全原因,应用程序无法直接访问内核空间。每个进程都有其自己的隔离用户空间,确保一个进程不会干扰另一个进程的内存。
对与每个进程来说,它的用户空间其实是一个内存沙箱(sandbox)。虚拟地址会通过页表映射到物理内存。具体结构如下:
注:样例图片是基于 32 位系统进行表述的,64 位系统暂时没找到说明。
虚拟内存和页表(Page tables)
在 xv6 中为了保证系统安全所以需要对进程的空间进行隔离。对于每个应用程序来说获取到的内容都是地址空间。通过地址管理单元(Memory Management Unit)或者其他的技术,可以将每个进程的虚拟地址空间映射到物理内存地址。
页表是一种在一个物理内存上,创建不同的地址空间的常见方法。其是在硬件中通过处理器和内存管理单元(Memory Management Unit)实现的。
对于任何一条带有地址的指令,其中的地址应该认为是虚拟内存地址而不是物理地址。假设寄存器 a0 中是地址 0x1000,那么这是一个虚拟内存地址。虚拟内存地址会被转到内存管理单元(MMU,Memory Management Unit)内存管理单元会将虚拟地址翻译成物理地址。之后这个物理地址会被用来索引物理内存,并从物理内存加载,或者向物理内存存储数据。
为了能够完成虚拟内存地址到物理内存地址的翻译,MMU会有一个表单,表单中,一边是虚拟内存地址,另一边是物理内存地址。通常来说,内存地址对应关系的表单也保存在内存中。
页表会将内存分解为页(Page)和偏移量(offset),通过页参数定位区块,通过偏移量参数定位字节。页参数+偏移量参数的总长度代表了实际支持的内存大小,一一般来说每个页的大小是 4 KB ,故偏移量参数就可以确定是 12 位。在处理器架构上会针对虚拟地址进行不同的长度设计。当页的数量过多的时候内存也会有不少的空间被浪费,所以可以通过将页参数进行分块处理例如可以将 27 位长度的分成 L2 , L1 , L0 三级。L2,L1 可以当作索引进行处理,L2 存储了 L1 的地址空间 L1 存储了 L0 的存储空间。
因为存在多级页表所以在检索的时候会调用多次页表,为了加速检索逻辑,处理器会使用页表缓存(Translation Lookaside Buffer) 将检索过的数载入缓存中。为了实现缓存的更新逻辑会流出缓存清除的指令。