
操作系统
文章平均质量分 89
是浩浩子
十年饮冰难凉热血
展开
-
结合代码再看进程管理(下)
一、基本概念1 处理机的调度在多道程序系统中,进程的数量往往多于处理机的个数,因此进程争用处理机的情况在所难免。处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程的并发运行。1.1 调度方式所谓进程调度方式,是指当某个进程正在处理机上执行时,若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时应如何分配处理机。通常有以下两种进程调度方式:非剥夺调度方式,又称非抢占方式。非剥夺调度方式是指当一个进程正在原创 2022-05-01 22:40:01 · 502 阅读 · 0 评论 -
结合代码再看进程管理(上)
一、基本概念1. 进程的状态与转换进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断地发生变化(一个进程会经历若干不同状态)。通常进程有以下5 种状态,前 3 种是进程的基本状态。创建态。 进程正在被创建,尚未转到就绪态。创建进程通常需要多个步骤:(1)首先申请一个空白的 PCB,并向 PCB 中填写一些控制和管理进程的信息;(2)然后由系统为该进程分配运行时所必需的资源;(3)最后把该进程转入就绪态。就绪态。 进程获得了除处理机外的一切所需资原创 2022-04-21 16:44:17 · 467 阅读 · 0 评论 -
页机制下的内存分配与管理(下)
在上篇文章中介绍了基于显式链表的内存的分配与释放,这篇文章在此基础上进行内存访问管理的介绍。在页机制下,虚拟内存的访问可能产生缺页异常,这篇文章主要对产生缺页异常前后的处理过程进行介绍,其中会涉及到页面在内存和硬盘换入换出的过程,实现细节不作具体介绍。以上提到的过程都是虚拟存储的一部分,其中关键环节是页映射,为了便于理解这个过程我们站在操作系统的角度阐述一个可执行文件如何被装载。进程的建立(1)创建虚拟地址空间对我们来说,我们看到的地址其实是可执行文件中体现的虚拟地址,并不是可执行文件实际在内存.原创 2022-04-08 13:48:29 · 298 阅读 · 0 评论 -
ELF目标文件链接与程序头表
今天做OS实验时发现一个问题如题,困扰很久,通过试错硬是把原因给试出来了。在开始描述问题之前,首先对了解下ELF文件的结构。ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容(比如对于目标文件来说没有程序头表),而且它们的位置也未必如下图所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值.原创 2022-04-02 22:18:33 · 1171 阅读 · 0 评论 -
页机制下的内存分配与管理(上)
对于操作系统内核中页内存管理有必要理一下。其中涉及到采用什么数据结构管理内存,内存的分配与释放应该采用什么算法,而这其中要造哪些轮子,以便于达到目的。所谓轮子可以是宏、普通函数或者内联函数,好的轮子可以提高代码的编写效率,可读性也越好。对于已有的轮子要明确,输入什么输出什么。在分页机制下,物理内存将以页为单位进行组织,页内存管理的需求是:能够分配指定的页数(>=1);能够释放某页。每一页通过一个结构体描述其状态,所有的页对应一个Page型的数组,大小由管理页的数量而定:struct.原创 2022-04-01 22:23:18 · 335 阅读 · 0 评论 -
特权级保护和任务切换
在简单的内核与程序加载部分,不管是内核还是用户程序,是把所有的的段描述符都放在GDT中,为了有效地在任务之间进行隔离,处理器建议每个任务都有自己的描述符表,称为局部描述符表(LDT),并把那些专属自己的段放在LDT中。为了访问这些LDT,处理器使用了局部描述符表寄存器(LDTR)。在一个多任务系统中,LDTR只指向当前任务的LDT,LDTR也包含了32位线性基地址和16位界限。在任务切换过程中,为了保存任务的状态,并在下次重新执行是恢复他们,每个任务都应当用一个额外的内存区域保存相关信息,叫做任务状态段(原创 2022-03-26 19:31:06 · 855 阅读 · 0 评论 -
简单的内核与程序加载
前言在进入保护模式后,段的访问是基于段的信息描述符表中定义的描述符,但是操作系统是怎么知道任意一个加载程序的段的信息呢?所以有必要探讨这个问题。1.操作系统是怎么加载用户程序,然后转移到用户程序去执行;2.操作系统怎么提供大量的例程供用户程序使用,比如显示字符。当然在主流的操作系统中肯定与书中提到的有所区别,但通过这个过程去认识普通程序的加载过程,对理解现代操作系统肯定是有所帮助的。主引导程序主引导程序负责把内核加载到内存中,因为此时已经启动保护模式,内存的访问都要通过描述符(描述符要加载进段寄原创 2022-03-25 20:16:45 · 775 阅读 · 0 评论 -
从实模式到保护模式
对《X86汇编语言从实模式到保护模式》书中的内容进行总结。实模式因为早期的处理器是16位的如8086,后来处理器逐渐升级为32位的如80386,实模式的存在主要还是为了让32位处理器兼容针对16位处理器开发的程序。处理器中代表的寄存器:8086处理器的寄存器都是16位的,为了达到1MB的寻址空间,在寻址的时候先将段寄存器的内容左移四位形成20位的段地址,再加上16位的偏移地址得到20位的物理地址。在寻址时,通常两个寄存器搭配完成,指令段的寻址由[CS:IP]确定,数据段的寻址由[DS:偏移]确.原创 2022-03-16 19:41:30 · 1091 阅读 · 0 评论 -
AT&T汇编语言
内联汇编通常是指在 C/C++ 代码中嵌入的汇编代码,内联汇编方式两个作用,一是程序的某些关键代码直接用汇编语言编写,可提高代码的执行效率;二是有些操作无法通过高级语言实现,或者实现起来很困难,必须借助汇编语言达到目的。{ int a=10, b; asm ("movl %1, %%eax; movl %%eax, %0;" :"=r"(b) /* output */ :"r"(a) /* input */ :"%eax"); /* clobbered register */}在上例中,我们使用汇编指原创 2021-12-11 22:16:40 · 2749 阅读 · 0 评论 -
通用循环双向链表
通过设计一个通用循环双向链表,以实现对由不同类型节点组成的链表进行统一管理。实现此链表的关键是如何将不同类型的节点串联起来,并且能够访问节点内的数据。用途设计的链表主要用于操作系统,所以代码的运行效率是首要考虑的问题,在定义的过程中将不考虑普通函数的定义,优先选用内联函数和宏函数。思路为了将节点链接起来,所有节点必须存在公共部分,公共部分中包含能够指向前置节点和后置节点的指针。通过公共部分在节点中的偏移量,以确定节点的地址,进而访问节点内的数据,如下图。设计方法公共部分设计typedef.原创 2022-01-01 13:53:18 · 345 阅读 · 0 评论 -
ucoreOS-lab0
前言对操作系统学习中的一些关键知识进行了总结,跟随课程是清华大学《操作系统》慕课课程。一、 环境的搭建因为课程需要的是Linux实验环境,我采用的是WSL下的Linux环境,相比于虚拟机感觉轻便点,也避免了双系统方案不能用Windows的不便。WSL的具体安装步骤可以参考这个链接。下面进行软件的安装,在课程的实验手册中已经对需要的软件进行了详细说明。主要用到的软件有Vim(负责代码的阅读,编辑等),gcc(代码编译),gdb(代码调试),diff、patch(比较代码、文本和文件夹差异),还有一个非常原创 2021-12-12 11:56:04 · 1023 阅读 · 0 评论 -
GCC编译器和GDB、Bochs调试器的使用
介绍两种工具的用法原创 2022-01-15 22:03:50 · 806 阅读 · 0 评论 -
操作系统内存管理
为了更加有效地管理内存并少出错,现代操作系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。从概念上讲,可以将虚拟内存看作存储在磁盘上的字节序列,存储在磁盘上的虚拟内存的内容要缓存到主存中,这个操作有点类似Cache的工作原理。在开始操作系统内存管理之前先了解一下Cache的工作原理。虚拟内存实现的思路:在程序运行时,只把当前必要的很小一部分代码和数据装入内存中。其余代码和数据需要时再装入。不再运行的代码和数据及时从内存删除。利用了程序运行的局部性。1. 页式虚拟内存管理概念: 把进程空间(虚拟原创 2022-02-22 22:38:34 · 1023 阅读 · 0 评论 -
操作系统进程管理
1. 进程的概念2. 进程控制3. 线程4. 临界区和锁5. 同步和P-V操作6. Windows和Linux同步机制7. 进程通信原创 2022-02-18 14:25:51 · 1264 阅读 · 0 评论