操作系统
文章平均质量分 95
止此耳耳耳
这个作者很懒,什么都没留下…
展开
-
MIT-OSlab2:进程与线程
文章目录part1:预备知识1、进程管理的数据结构——进程控制块(Process Control Block, PCB)2. 进程表ptable3、用户态和内核态:4、进程的状态5、xv6的独特内核切换6、进程的虚拟地址布局:7、内核页表kpgdir8、x86的分页映射Part2:第一个进程的创建1、main函数1)kvmalloc2)xxinit3)userinit:初始化第一个用户进程:【al...原创 2019-10-27 14:30:25 · 1330 阅读 · 0 评论 -
MIT-OS实验-lab1
Lab 1 Part 1:PC bootstrap Make qemu-nox-gdb; Make gdb; 这条指令就是整个PC启动后,执行BIOS的第一条指令。 (图源https://www.jianshu.com/p/ae49b5813595) 第一代PC处理器是16位字长的Intel 8088处理器,这类处理器只能访问1MB的地址空间,即0x00000000-0x000FFFFF。但...原创 2019-10-09 11:09:36 · 2228 阅读 · 0 评论 -
Linux 0.11下信号量的实现和应用(李治军操作系统实验6)
生产者-消费者问题 从一个实际的问题:生产者与消费者出发,谈一谈为什么要有信号量?信号量用来做什么? 为什么要有信号量? 对于生产者来说,当缓冲区满,也就是空闲缓冲区个数为0时,此时生产者不能继续向缓冲区写数,必须等待,直到有消费者从满缓冲区取走数后,再次有了空闲缓冲区,生产者才能向缓冲区写数。 对于消费者来说,当缓冲区空时,此时没有数可以被取走,消费者必须等待,直到有生产者向缓冲区写数后,消...转载 2019-08-27 10:34:11 · 2286 阅读 · 1 评论 -
进程同步与信号量(李治军操作系统课笔记6)
临界区:一次只允许一个进程进入 为什么需要临界区?两个生产者因竞争资源会产生随机的执行顺序,造成信号量的修改不当,信号量语义错误,所以需要保护信号量。 临界区代码的保护原则: 1、基本原则——互斥 2、有空让进 3、有限等待 临界区保护方法 1、轮换法: 但是,若P1被什么阻塞了,而P0结束了之后又不能继续进入临界区,导致两个都不在临界区。 2、标记法: 但是,因为变量不共享,所以看不到对方...原创 2019-08-26 20:58:56 · 284 阅读 · 0 评论 -
多进程图像的理解(李治军操作系统课笔记3)
操作系统是怎么支持多进程图像的 1、 操作系统是如何组织多进程的: 以PCB为单位,一个PCB记录一个进程的信息。给每个进程一个状态:正在执行的进程(运行态)、准备好了只等cpu来执行的进程(就绪态)、缺少一些东西没准备好在等待的进程(阻塞态)。操作系统可以通过进程对应的PCB来知道进程现在所处的状态,按照状态形成不同的队列。根据进程的状态转化如下图: 2、操作系统如何交替进程: 调度和切换的代...转载 2019-08-17 16:12:57 · 357 阅读 · 0 评论 -
操作系统接口与系统调用的实现 (李治军操作系统课笔记2)
什么是接口 用户使用计算机的两种方式:命令行、图形。从这两种方式理解接口。 命令行 1、命令其实就是程序,经过编译后生成可执行文件,在命令行键入可执行文件名与参数输出结果。而实际上shell也是一个程序,开机时在main.c文件的所有xx_init()函数之后,通过/bin/sh这个可执行文件启动shell程序 2、关键是这些程序里面调用的函数:fork()控制进程 , printf()控制...原创 2019-08-16 23:36:26 · 1022 阅读 · 0 评论 -
基于内核栈切换的进程切换(李治军操作系统课实验5)
分析: TSS作用 找到当前内核栈:进程内核栈在线性地址空间中的地址是由该任务的TSS段中的ss0和esp0两个字段指定的,依靠TR寄存器就可以找到当前进程的TSS。也就是说,当从用户态进入内核态时,CPU会自动依靠TR寄存器找到当前进程的TSS,然后根据里面ss0和esp0的值找到内核栈的位置,完成用户栈到内核栈的切换。TSS是沟通用户栈和内核栈的关键桥梁,这一点在改写成基于内核栈切换的进程切...转载 2019-08-19 23:36:02 · 2912 阅读 · 0 评论 -
操作系统启动步骤解读 (李治军操作系统课笔记1)
总体流程图: 图源:https://www.cnblogs.com/ronny/p/7787259.html bootsect.S 剖析 一般PC在电源打开时,是由内存中地址FFFF(段地址cs):0000(偏移量ip)(cs<<4+ip)开始执行,此处的内容是一个jump指令,jump到另一个位于ROMBIOS中的位置,开始执行一系列的动作,包括了检查RAM,keyboard,...原创 2019-08-14 17:17:46 · 1337 阅读 · 0 评论 -
核心级线程实现实例(李治军操作系统课笔记5)
从中断开始 以fork()为例: fork()中有中断,执行 INT 0x80时,CPU找到对应的内核栈,将 SS SP PC CS 压栈;注意ret=??处写的是INT 的下一句,也就是PC = mov res,%eax 。 切换五段论中的中断入口和出口 刚进入内核,_system_call将用户态信息压栈,这就是中断入口——建立内核栈和用户栈的关联) movl _current,%eax...原创 2019-08-19 14:13:27 · 521 阅读 · 0 评论 -
用户级与内核级线程(李治军操作系统课笔记4)
此篇文章解释交替进程步骤中的切换。 又因为进程的切换=线程切换+映射表的切换(与内存管理有关),线程切换有用户级线程切换和内核级线程切换,而进程是要深入内核的,所以此处是内核级切换。 所可以从内核级线程切换来理解进程切换。 而用户级切换是内核级切换的基础。 用户级线程 一个切换例子: 关键:两个TCB+两个栈 Yield()就是切换esp,也就是栈顶指针,即切换了栈 Yield()之后通过栈...原创 2019-08-18 21:13:20 · 452 阅读 · 0 评论