操作系统知识点汇总(持续更新)

1.中断(interrupt)、异常(exception)、陷入(trap)
中断Interrupt:
是为了设备与CPU之间的通信。典型的有如服务请求,任务完成提醒等。比如我们熟知的时钟中断,硬盘读 写服务请求中断。中断的发生与系统处在用户态还是在内核态无关,只决定于EFLAGS寄存器的一个标志位。我们熟悉的sti, cli两条指令就是用来设置这个标志位,然后决定是否允许中断。在单个CPU的系统中,这也是保护临界区的一种简便方法。中断是异步的,因为从逻辑上来 说,中断的产生与当前正在执行的进程无关。事实上,中断是如此有用,Linux用它来统计时钟,进行硬盘读写等。
异常Exception:
异常是由当前正在执行的进程产生。异常包括很多方面,有出错(fault),有陷入(trap),也有可编程异常(programmable exception)。出错(fault)和陷入(trap)最重要的一点区别是他们发生时所保存的EIP值的不同。出错(fault)保存的EIP指向触发异常的那条指令;而陷入(trap)保存的EIP指向触发异常的那条指令的下一条指令。因此,当从异常返回时,出错(fault)会重新执行那条指令;而陷入(trap)就不会重新执行。这一点实际上也是相当重要的,比如我们熟悉的缺页异常(page fault),由于是fault,所以当缺页异常处理完成之后,还会去尝试重新执行那条触发异常的指令(那时多半情况是不再缺页)。陷入的最主要的应用是在调试中,被调试的进程遇到你设置的断点,会停下来等待你的处理,等到你让其重新执行了,它当然不会再去执行已经执行过的断点指令。
可编程中断Trap:
这类中断可由编程者用int指令来触发。在Linux中,使用了一个,也是唯一的一个可编程中断,就是int
0x80系统调用。硬件对可编程中断的处理与对trap的处理类似,即从这类异常返回时也是返回到触发异常的下一条指令。关于可编程中断,还有另外一种说法:软件中断(software interrupt),其实是一个意思.

更多关于中断异常的描述、处理以及相应保护机制
2.特权指令
特权指令指具有特殊权限的指令。这类指令只用于操作系统或其他系统软件,一般不直接提供给用户使用。
在多用户、多任务的计算机系统中特权指令必不可少。它主要用于系统资源的分配和管理,包括改变系统工作方式,检测用户的访问权限,修改虚拟存储器管理的段表、页表,完成任务的创建和切换等。

常见的特权指令有以下几种:
(1)有关对I/O设备使用的指令 如启动I/O设备指令、测试I/O设备工作状态和控制I/O设备动作的指令等。
(2)有关访问程序状态的指令 如对程序状态字(PSW)的指令等。
(3)存取特殊寄存器指令 如存取中断寄存器、时钟寄存器等指令。
(4)其他指令
3.x86架构中特权级
内核要和用户程序分开,内核一定要安全,不能被用户程序干涉,但是有时候用户程序也需要读取内核的某些数据,怎么办呢?x86就引入了访问特权等级(0-3)的机制,x86 cpu共有4个特权级 level0 到 level3 其中level0特权级最高,level3特权级最高。处理器通过识别CPL、DPL、RPL这3中种特权级进行特权级检验。
CPL(Current Privilege Level)是当前执行的程序或任务的特权级。它被存储在CS和SS的第0位和第1位上。
DPL(Descriptor Privilege Level)表示段或者门的特权级。它被存储在段描述符或者门描述符的DPL字段中。
RPL(Requessted Privilege Level)是通过段选择子的第0位和第1位表现出来的。
jmp和call所能进行的代码间转移是非常有限的,对于非一致代码段,只能在相同特权级代码间转移;对于一致代码段,可以从低到高,且CPL不会改变。
我们一般用调用门和lcall指令实现特权级由低到高的转移,通过lret指令实现特权级由高到低的转移。
4.用户态和核心态的区别
5.关于中断向量的部分概念
中断标识码(中断类型号): 由硬件(通常是中断控制器)产生,以标识不同的中断源。
中断向量: 中断服务程序的入口地址。在某些计算机中,中断向量的位置存放一条跳转到中断服务程序入口地址的跳转指令。
中断向量地址:存储中断向量的存储单元地址
6.强内核与微内核
强内核,又称宏内核或单内核,是操作系统内核架构的一种,简单理解,就是把所有要用到的东西都放到了内核里,比如最基本的进程、线程管理、内存管理、文件系统、驱动、网络协议等等。因为所有的模块都是在内核里,那优点就是处理效率高,但随着内核增大,管理起来也越不方便,而且只要其中一个模块出现问题,就会导致整个内核崩溃,系统的稳定性就差一些。 Linux使用强内核。
微内核是指将内核模块化设计,大部分内核都作为单独的进程,相互之间通过消息传递进行通信。微内核的功能类似于一个消息的转发站,优点是有助于内核功能的扩展和模块间的隔离,单个模块的bug不影响整个内核,只要杀掉出问题的进程就可以了,内核稳定性高,缺点就是进程间通信肯定会影响内核的效率。Windows使用微内核。
7.RISC和CISC简单区别
8.X86实模式下和保护模式下段式管理的寻址方式

段选择符(16位):段内偏移

实模式(20位):段选择符左移四位+偏移
段选择符:都是索引位
保护模式(32位):GDTR ->段描述表GDT->段描述符->段+偏移=32位线性地址(CR3->页目录表项->页表项->偏移量=物理地址)
段选择符:前13位索引+TI(1位)(选择访问GDTR/LDTR(访问操作系统代码/用户代码,一个进程一个))+RPL(2位)(ring指示,即特权级)
LDT局部描述符表:面向进程,LDT中也存放数据CS、DS、SS
GDT全局描述符表:面向操作系统(前四段存放CS(操作系统代码段)、DS(操作系统数据段)、GS(操作系统显存)、TSS,之后是每个进程的LDT表基址,而每个进程的LDT表偏移在LDTR(16位)中)
General-Purpose Reg
segment Reg :cs(代码段) ss(堆栈段) ds(数据段) gs(显存) es fs
逻辑地址 ->分段单元-> 线性地址 ->分页单元 ->物理地址
段描述符(64位):段基址(32位,分开存放)+段界限(20位)+其他权限位(8位,S位=1)+G+D+0+AVL
系统段描述符(64位):S位=0,差别主要在8位权限位(TSS)
描述符表:GDT、IDT(中断描述符表)、LDT、TSS(任务表)
IDT(中断描述符表):存放中断入口地址,如 int 0x80是IDT的0x80行,里面存放相应的中断入口地址
GDTR(48位,BASE(32位)+LIMIT(16位)),存放指令lgdt QWORD PTR VGDTR
设置IDTR(48位):LIDT QWORD PTR SRC 将SRC地址存放的6字节数据装到IDTR
设置LDTR(16位):LLDT SRC
LGDT LIDT LRTD都是特权指令,只能在核心态操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值