OS相关笔记

记录学习

请注意,本文编写于 1382 天前,最后修改于 1378 天前,其中某些信息可能已经过时。

前言

又到了学习的时候了,上次记笔记是在2017年学汇编的时候。

记录的笔记挺有用,既能加深印象,又能再需要用的时候随时翻出来查,也能证明自己确实是学过了。

话不多说,开始吧

boot

扇区512字节,结尾是0xaa55

7c00

主引导内存地址。至于为什么。
参考:

为什么主引导记录的内存地址是0x7C00?

GDT

gdt.png
gdt.png

// 一个bytes 8字节
struct Descriptor{
    segment_Length = new bytes(2),
    baseAddress = new bytes(3),
    attr = new bytes(2),
}

实模式/保护模式

实模式寻址方式:

段寄存器 * 16 + 偏移( 16 bit )

保护模式寻址:

selector:偏移
selector = 指向GDTde偏移->从GDT中找到32位基地址

实模式到保护模式

  • 准备GDT
  • 用lgdt加载gdtr
  • 打开A20
  • 进入保护模式

LDT

和GDT一样,不过一个是全局一个是局部。只不过selector的TI位置必须设置为1

使用lldt加载

什么是保护模式?保护在哪?

每个段地址被gdt表限制,不能超出访问

每个段的作用也在gdt表中明确指明

层级跃迁使用,和LDT,GDT一样都是个结构体

调用门

929457-20170103234617253-66741751.png
929457-20170103234617253-66741751.png

调用方式:call 调用门,调用门结构体储存选择子,和偏移,最后调转的的地址是选择子中的基地址加上偏移。

对于call和jmp指令,有着不同的优先级检查规则的:

  

对call来说:当前CPL<=调用门描述符DPL,RPL<=调用门描述符DPL,当前CPL>=目的代码段描述符DPL;

对jmp来说:除了跟call的“当前CPL<=调用门描述符DPL,RPL<=调用门描述符DPL”一样外,如果目的代码段的一致的话,CPL>=目的代码段的DPL,而如果目的代码段是非一致的话,CPL=目的代码段的DPL。

另外,只有call指令可以将代码通过调用门转移到特权级更高的非一致性代码之中。对于非一致性代码的成功转移,CPL被目的代码的DPL刷新,会引起堆栈切换;对于一致性代码,不会刷新,也不会切换。

调用门的作用是,让一个代码段中的过程被不同特权级的程序访问。通常用于低特权级代码来访问高特权级的代码段。

添加新评论

已有 2 条评论

早些年学过操作系统,非常底层的,忘得一干二净