前言
又到了学习的时候了,上次记笔记是在2017年学汇编的时候。
记录的笔记挺有用,既能加深印象,又能再需要用的时候随时翻出来查,也能证明自己确实是学过了。
话不多说,开始吧
boot
扇区512字节,结尾是0xaa55
7c00
主引导内存地址。至于为什么。
参考:
GDT
// 一个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一样都是个结构体
调用门
调用方式:call 调用门
,调用门结构体储存选择子,和偏移,最后调转的的地址是选择子中的基地址加上偏移。
对于call和jmp指令,有着不同的优先级检查规则的:
对call来说:当前CPL<=调用门描述符DPL,RPL<=调用门描述符DPL,当前CPL>=目的代码段描述符DPL;
对jmp来说:除了跟call的“当前CPL<=调用门描述符DPL,RPL<=调用门描述符DPL”一样外,如果目的代码段的一致的话,CPL>=目的代码段的DPL,而如果目的代码段是非一致的话,CPL=目的代码段的DPL。
另外,只有call指令可以将代码通过调用门转移到特权级更高的非一致性代码之中。对于非一致性代码的成功转移,CPL被目的代码的DPL刷新,会引起堆栈切换;对于一致性代码,不会刷新,也不会切换。
调用门的作用是,让一个代码段中的过程被不同特权级的程序访问。通常用于低特权级代码来访问高特权级的代码段。
查看笔记+1
早些年学过操作系统,非常底层的,忘得一干二净