操作系统
sssaltyfish
这个作者很懒,什么都没留下…
展开
-
MIT-JOS系列2:bool loader过程
系统的启动过程(一):bool loader过程 物理内存分布 PC开机后的默认物理内存分布如图: 早期PC是基于16位的8086处理器,因此只支持1MB物理内存,地址从0x00000000~0x000FFFFF 物理内存前640K被标记为Low Memory,这一区域是早期PC唯一可以访问的RAM 0x000A0000~0x000FFFFF的384K区域被硬件保留用于特殊用途: 这一部...原创 2019-04-04 17:01:05 · 759 阅读 · 0 评论 -
MIT-JOS系列:问题汇总
页目录表基址(保存在CR3)为物理地址,但GDT表基址(保存在GDTR)为线性地址,为什么? A:在开启了分页后,除了cr3,所有地址都要经过MMU自动进行虚拟地址到物理地址的转换,这个是无法绕过的。在进入kernel初期,GDTR放着的还是boot时载入的gdt表的地址(这时候是物理),随后载入简易页表开启保护和分页模式,此后GDTR存放的地址都视为虚拟地址。由于kernel初期的简易页表同...原创 2019-04-18 15:39:15 · 693 阅读 · 0 评论 -
MIT-JOS系列10:多任务处理(三)
Part C:抢占式多任务处理和进程间通信(IPC) 注:根据MIT-JOS的lab指导手册,以下不明确区分“环境”和“进程” 重要提醒:每次实现完系统调用,记得补充kern/syscall.c的syscall()!!! 在lab4的最后一部分,我们将修改内核以支持抢占不合作环境拥有的资源并允许进程间通信 时钟中断和抢占 如果尝试运行user/spin,这个程序会fork创建一个子进程,子进程一旦...原创 2019-04-18 14:30:01 · 619 阅读 · 0 评论 -
MIT-JOS系列9:多任务处理(二)
Part B:fork的写时拷贝(Copy-on-Write Fork) 注:根据MIT-JOS的lab指导手册,以下不明确区分“环境”和“进程” 重要提醒:每次实现完系统调用,记得补充kern/syscall.c的syscall()!!! 如上一篇文章提及到的,Unix提供系统调用fork()作为创建进程的原语,它将父进程的地址空间拷贝到子进程。 xv6 Unix的fork()实现是:为子进程分...原创 2019-04-18 14:27:56 · 562 阅读 · 0 评论 -
MIT-JOS系列7:用户环境(三)
Part B:缺页异常,断点异常和系统调用 到目前位置我们以及你实现了内核基本的异常处理,现在要在此基础上利用异常处理进行系统调用。 处理缺页异常 缺页异常(page fault,中断向量14)是我们在本实验和往后会大量使用的一个重要例子。当缺页异常发生时,处理器将导致故障的线性地址(虚拟地址)存放在特殊寄存器cr2中。在trap.c中,提供了一个用于缺页异常的函数page_fault_handl...原创 2019-04-14 15:04:37 · 410 阅读 · 0 评论 -
MIT-JOS系列6:用户环境(二)
Part A:用户环境和异常处理 用户环境创建 见上一篇:MIT-JOS系列5:用户环境(一) 处理中断和异常 基础知识 受保护的控制转移 异常(exceptions)和中断(interrupts)都是受保护的控制转移(protected control transfers),它们将处理器模式从用户态切换到内核态,不给用户模式干扰到其他环境或内核功能的机会。在Intel的术语里,中断一般是指由处理...原创 2019-04-14 14:51:30 · 617 阅读 · 0 评论 -
MIT-JOS系列8:多任务处理(一)
Part A:多处理器支持和协作式多任务处理 注:根据MIT-JOS的lab指导手册,以下不明确区分“环境”和“进程” 在这部分实验中,我们将扩展JOS使之能在多处理器系统上运行,并实现一些新的系统调用以允许用户环境新建新的环境。我们还将通过协作轮询调度(cooperative round-robin scheduling)实现内核在当前环境放弃对CPU的占用(或退出)时切换到另一个环境。在之后的...原创 2019-04-16 10:45:59 · 1441 阅读 · 1 评论 -
MIT-JOS系列1:实模式和保护模式下的段寻址方式
实模式下的段寻址 以8086为例 8086 段寄存器16位(段地址/基地址),寄存器16位(偏移地址),地址总线20位(寻址1M:2^20) 实际物理地址 = (段寄存器 << 4) + 偏移地址 访问到的是实地址。 段内最大64K(2^16),但一个段可以小于64K: 在编程时可以根据需要,将若干个地址连续的内存单元看做一个段,用段地址×16定位段的起始地址(基地址),用偏移地址定...原创 2019-04-03 15:10:04 · 1275 阅读 · 0 评论 -
MIT-JOS系列3:启动内核
使用虚拟内存 为什么要使用虚拟内存?可以参考这篇博客:虚拟内存与物理内存的联系与区别 简单的说可以总结为: 使比实际物理内存更大的程序能够运行 使每个进程拥有独立的虚拟地址空间,相互之间不能修改数据 访问虚拟地址时,如果虚拟地址所对应的物理地址不在物理内存中,则产生缺页中断,此时才真正分配物理地址,同时更新进程的页表 虚拟地址如何寻址?可以参考我之前博客中的保护模式寻址:MIT-JOS系列1:...原创 2019-04-08 19:18:37 · 738 阅读 · 0 评论 -
MIT-JOS系列5:用户环境(一)
Part A:用户环境和异常处理 用户环境创建 本节中我们将实现一些内核的基本工具来支持受保护的用户进程的运行。我们将增加JOS内核的功能,为它增加一些数据结构来追踪用户进程的一些信息;创建一个单一用户的环境,并在其中加载运行一个程序。我们也会使JOS内核处理用户进程做出的任何系统调用和它导致的任何异常 内核利用ENV数据结构来记录每一个环境的信息。目前我们只创建单一的用户环境,以后再在此基础上设...原创 2019-04-11 14:20:24 · 1482 阅读 · 1 评论 -
MIT-JOS系列4:内存管理
在MIT-JOS lab1的实验中我们了解了bootloader和kernel载入的过程,并在kernel中完成了最初的虚拟内存映射、栈设置和硬件相关的一系列初始化。在Lab2中,我们将在JOS操作系统中实现分页内存管理,其包括: 物理页面管理(对机器拥有的物理内存的管理,包括建立对应的数据结构、处理分配和回收动作等) 虚拟内存管理(将内核和用户软件使用的虚拟地址映射到物理地址) 在lab2开...原创 2019-04-10 10:04:12 · 1630 阅读 · 0 评论 -
MIT-JOS系列:用户态访问页表项详解
在MIT-JOS lab4的实验中,为了能够在用户态自定义处理页面错误,我们必须要知道操作的页面的属性(是否当前用户具有读写权限、是否copy on write页面),这就需要查询指向当前物理页面的页表项和目录表项获取它的属性 在之前的实验中,我们已经通过e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_P | PTE_U;修改UV...原创 2019-04-18 16:33:41 · 1118 阅读 · 1 评论