西南交通大学操作系统期末复习总结

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1

org 07c00h ;这是告诉编译器将这段程序加载到内存偏移地址0x7c00处

mov ax,cs

mov ds,ax

mov es,ax

call DispStr

jmp $

DispStr:

mov ax,BootMessage

mov bp,ax

mov cx,16

mov ax,01301h

mov bx,000ch

mov dl,0

int 10h

ret

BootMessage: db "hello,os world!"

times 510-($-$$) db 0

dw 0xaa55

这是第一章的程序,从中可以看出起始位置是07c00h,程序的结束标志是0xaa55。

$表示当前行被汇编后的地址。

$$表示一个节的开始处被汇编后的地址。

那么$-$$表示本行距离程序开始处的相对距离。

1.对于程序的说明

实际上以上程序只是一个引导扇区(Boot Sector),不是完整的OS,当计算机电源被打开时,它会加电自检(POST),然后寻找启动盘,如果是从软盘启动,计算机就会检查软盘的0面0磁道1扇区,如果发现它以0xaa55结束,并且包含了少于512字节的执行码,那么BIOS 认为它是一个引导扇区。

一旦发现了引导扇区,就将这512字节放入内存地址0000:7c00处,然后跳转并且移交控制器。

2.制作软盘过程

本身这段程序是boot.asm,是汇编程序,然后使用工具nasm将其转换为boot.bin,

然后使用软盘绝对扇区读写工具将这个文件写到一张空白软盘的第一个扇区。

(.bin文件的说明:*.bin是Foxbase定义的一种特殊的可执行文件,它同DOS的.com文件类似,区别在于.com文件是从100H开始运行的,而.bin从0开始,.bin的调用参数保存在DS:BX中。如果在Foxbase中,你可以使用Call命令调用。如果你在VFP中,将无法直接调用,只能使用Debug反汇编,分析其功能,然后重新编写.)

3.方括号[]的使用

在NASM中,任何不被方括号[]括起来的标签或变量名都被认为是地址,访问标签中的内容必须使用[]。

3.1认识保护模式

1.对于这一节的程序的理解

数据区:

先是定义了一些描述符(LABEL_GDT,LABEL_DESC_CODE32,LABEL_DESC_VIDEO),

然后定义了GdtPtr,它是一个6字节的数据结构,前两字节表示GDT的界限(即描述符的界限),后4字节表示GDT的基地址(GdtPtr就是用来描述GDT的,会用一个寄存器GDTR来保存它的值)。然后定义两个选择子,分别指向已定义的描述符。

代码区:

初始化32位代码段描述符,为加载GDTR作准备,加载GDTR: lgdt [GdtPtr],然后是关中断:cli,(保护模式下中断处理的机制是不同的,不关中断会出错)打开地址线A20,然后将cr0的PE位置为1(0:实模式,1:保护模式),准备切换到保护模式,跳转到保护模式中jmp dword SelectorCode32:0

2.Descriptor是一个宏,它是一个8字节的数据结构。三个描述符组成了一个结构数组。

3.[BITS 16]说明这是一个16位的代码段,而[BITS 32]是32位的代码段。

程序中的知识点

要搞清楚的有:

GDT是一个索引,指向一个数据结构的表项。GDT作用:提供段式存储机制。

程序对GDT做了什么?

jmp SelectorCode32:0?

GDT

1.在保护模式下,CPU有着巨大的寻址能力(保护模式下为4G,实模式下为1M),并为强大的32位操作系统提供了更好的硬件保障。

2.在保护模式下,段值仅仅变成了一个索引,这个索引指向一个数据结构的一个表项,表项中定义了段的起始地址、界限、属性等内容。这个数据结构就叫GDT,表项就叫描述符。

3.描述符分为代码段和数据段描述符,还可以分为系统段描述符和门描述符。

4.选择子

TI位0:GDT,1:LDT

当TI和RPL都为0时,选择子就变为了偏移。

5."段:偏移"经过段机制转化为“线性地址”,而不是物理地址。

JMP

1.对于cr0的设置是实模式和保护模式的关键

2.jmp dword SelectorCode32:0的作用是将描述符DESC_CODE32对应的段的首地址。

3.为什么那儿有一个dword呢?(没有dword的话编译出来是16位的代码,而目标地址是32位的。)

进入保护模式的主要步骤:

1.准备GDT

2.用lgdt加载gdtr

3.打开A20

4.设置cr0的PE位

5.跳转,进入保护模式

描述符的属性

1.P位——存在位。P=1,表示在段内存中存在;P=0则在内存中不存在。

2.DPL位——描述符特权级。有0,1,2,3级,数字越小级别越大

3.S位——指明描述符是数据段/代码段(s=1),还是系统段/门描述符(s=0)

3.2保护模式进阶

在这一节中,首先在上一节程序的基础上改写:

(1)跳入保护模式之后再次跳回实模式

(2)读写大地址内存

对于读大地址内容,它是先读,然后再写,然后再读,以此来判断是否可以读写大地址内存。(注意:程序中调用子程序时要保存edi的值,要对其进行压栈,所以要用到堆栈,那么在程序中也要有堆栈的描述符和堆栈的选择子。)

从保护模式跳转到实模式时要复杂一些(从实模式到保护模式只要一个跳转就可以了),我们不能直接从32位的代码段中返回实模式,只能从16位代码段中返回,因为无法从32为代码段返回时cs高速缓存寄存器中的属性符合实模式的要求。所以增加一个Normal描述符,在返回实模式前把对应的选择子加载到ds、ss和es.

跳回实模式之后要做的事情:用Normal描述符的选择子加载到ds、ss和es,值cr0的PE=0,关闭A20地址线,开中断STI。

LDT:局部描述符表

1.LDT与GDT差不多,一个是全局的,一个是局部的。在代码中也要有一个LDT的描述符和选择子,它的初始化有所不同,有两步:(1)初始化LDT在GDT中的描述符,(2)初始化LDT中的描述符。其中,第二步与GDT类似,多了一个在GDT中定义LDT。

2.LDT与GDT的区别就在于选择子中TI位(0为GDT,1为LDT)

3.在使用LDT时需要先用lldt指令加载ldtr(lgdt加载gdtr)

4.使用LDT的目的:多任务处理。

5.保护模式“保护”的含义

(1)描述符中的段基址和段界限定义了一个段的范围,对超越段界限之外的地址的访问是被禁止的,这是对段的一种保护。

(2)有点复杂的段属性作为对一个段各个方面的定义规定和限制了段的行为和性质

以上两点是静态的

(3)在涉及特权级的每一步中,处理器都会对CPL,DPL和RPL等内容进行比较,这种比较是动态的。

特权级概述

1.常规保护模式错误

2.将Level0叫做内核,Level1、Level2叫做服务,Level3叫做应用程序。

3.CPL、DPL、RPL

CPL 是当前执行的程序或任务的特权级。通常情况下,CPL等于代码所在段的特权级,

当程序转移到不同特权级的代码段时,处理器将改变CPL。当处理器访问一个与CPL特权级不同的一致代码段时,CPL不会被改变。

DPL 表示段或者门的特权级,下面是各种类型的段或者门的情况

数据段:高级->低级,相同级别之间

非一致代码段:相同级别之间

调用门:与数据段一致

一致代码段和通过调用门访问的非一致代码段:低级->高级,相同级别之间

TSS(Task-State Stack:任务状态栈):与数据段一致

RPL 通过选择子的第0位和第1位表现出来的。操作系统过程往往用RPL来避免低特权级应用程序访问高特权级段内的数据。

4.不同特权级代码之间的转移

程序从一个代码转移到另一个代码之前,目标代码的选择子将会被加载到cs中。通常使用jmp和call指令来实现转移,转移分为两大类:(1)直接转移(2)间接转移

相关文档
最新文档