操作系统实验报告1.docx

上传人:b****2 文档编号:1553199 上传时间:2022-10-23 格式:DOCX 页数:20 大小:180.55KB
下载 相关 举报
操作系统实验报告1.docx_第1页
第1页 / 共20页
操作系统实验报告1.docx_第2页
第2页 / 共20页
操作系统实验报告1.docx_第3页
第3页 / 共20页
操作系统实验报告1.docx_第4页
第4页 / 共20页
操作系统实验报告1.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

操作系统实验报告1.docx

《操作系统实验报告1.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告1.docx(20页珍藏版)》请在冰豆网上搜索。

操作系统实验报告1.docx

操作系统

实验报告

班号:

1303107

学号:

1130310726

姓名:

蔡鹏

1.请简述head.s的工作原理。

head.s实在32位保护模式下运行的。

我认为这段程序主要包括两个部分:

1.初始化设置。

2.任务执行与切换。

初始设置主要包括了:

1.设置GDT表2.设置系统定时芯片3.设置IDT表(0x08时钟中断和0x80系统调用中断)4.切换到任务0执行

任务切换和执行包括了:

1.任务0和任务1,

2.时钟中断,

3.系统中断

两个任务的在LDT中代码段和数据段描述符的内容都设置为:

基地址0x0000;段限长值为0x03ff,实际段长度为4MB。

因此在线性地址空间中这个“内核”的代码和数据段与任务的代码和数据段都从线性地址0开始并且由于没有采用分页机制,所以他们都直接对应物理地址0开始处。

为了每隔10毫秒切换运行的任务,head.s程序中把定时器芯片8253的通道0设置成每隔10毫秒就向中断控制芯片8259A发送一个时钟中断请求信号。

PC机的ROMBIOS开机时已经在8259A中把时钟中断请求信号设置成中断向量8,因此我们需要在中断8的处理过程中执行任务切换操作。

任务切换的实现是查看current变量中的当前运行的任务号,如果为0,就利用任务1的TSS选择符作为操作数执行远跳转指令,从而切换到任务1中,否则反之。

每个任务在执行时,会首先把一个字符的ASCII码放入寄存器AL中,然后调用系统中断调用int0x80,而该系统调用处理过程则会调用一个简单的字符写屏子程序,把寄存器AL中的字符显示在屏幕上,同时把字符显示的屏幕的下一个位置记录下来,作为下一次显示字符用。

在显示过一个字符后,任务代码会使用循环语句延迟一段时间,然后又跳转到任务代码开始处继续循环执行,直到运行了10毫秒而发生了定时中断,从而代码会切换到另一个任务执行。

对于任务A,寄存器AL中始终存放字符‘A’,而任务B运行时AL中始终存放字符‘B’。

因此程序运行时我们将看到一连串的‘A’和一连串的‘B’间隔的连续不断的显示在屏幕上。

若出现了一个‘C’,是由于PC机偶然产生了一个不是时钟中断和系统调用中断的其他中断。

因为我们已经在程序中给所有其他中断安装了一个默认中断处理程序。

当出现一个其他中断时,系统就会运行这个中断处理程序,于是就会在屏幕上显示一个‘C’,然后退出中断。

4.请记录head.s的内存分布状况,写明每个数据段,代码段,栈段的起始与终止的内存地址。

代码段编号

名称

起始地址

终止地址

1

startup_32

0x00

0xac

2

setup_idt

0xb5

0xe4

3

setup_gdt

0xad

0xb4

4

write_char

0xe5

0x113

5

ignore_int

0x114

0x129

6

timer_interrupt

0x12b

0x165

7

system_interrupt

0x166

0x17c

8

task0

0x10e0

0x10f3

9

task1

0x10f4

0x1107

数据段编号

名称

起始地址

终止地址

1

current

0x17d

0x180

2

scr_loc

0x181

0x184

3

lidt_opcode

0x186

0x18b

4

lgdt_opcode

0x18c

0x191

5

idt

0x198

0x997

6

gtd

0x998

0x9d7

7

ldt0

0xbe0

0xbf7

8

tss0

0xbf8

0xc5f

9

ldt1

0xc60

0xe77

10

tss1

0xe78

0xedf

堆栈段编号

名称

起始地址

终止地址

1

Init_stack

0x9d8

0xbd8

2

Krn_stk0

0xc60

0xe60

3

Krn_stk1

0xe00

0x10e0

4

User_stk1

0x1108

0x1308

5.简述Head.s57~62行在做什么?

简述iret执行后,pc如何找到下一条指令?

并记录iret执行前后,栈是如何变化的。

代码作用:

是在初始堆栈中人工设置返回环境。

57:

把任务0当前局部空间数据段(堆栈段)选择符入栈

58:

把堆栈指针入栈(也可以把ESP入栈)

59:

把标志寄存器入栈

60:

把当前局部空间代码段选择符入栈

61:

把代码指针入栈

62:

执行中断返回指令,从而切换到特权级3的任务0中执行

如何找到下一条指令:

执行iret之后,将推入堆栈的段地址和偏移地址弹出,使程序返回到原来发生中断的地方。

其作用是从中断中恢复中断前的状态,具体作用有如下三点:

1.恢复IP:

(IP)←((SP)+1:

(SP)),(SP)←(SP)+2

2.恢复CS:

(CS)←((SP)+1:

(SP)),(SP)←(SP)+2

3.恢复中断前的PSW(programstatusword),即恢复中断前的标志寄存器的状态。

(FR)←((SP)+1:

(SP)),(SP)←(SP)+2

4.恢复ESP(返回权限发生变化)

5.恢复SS(返回权限发生变化)

PC根据弹出的cs查找其ldt表形成段基地址0x0000,然后再加上偏移地址eip得到下一条指令的地址0x10e0。

栈的变化:

其中,iret指令执行前后栈的内容如下:

执行前:

栈中的内容就是上面57-62行指令压入的内容。

栈指针esp=0x0bc4

地址

0x0BC4

0x10e0

0x0BC8

0x0f

0x0BCC

0x246

0x0BD0

0xbd8

0x0BD4

0x17

0x0BD8

0xbd8

具体截图如下:

执行后:

将上述内容全部弹出,使程序返回到原来发生中断的地方。

栈指针esp=0x0bd8

地址

0x0BD8

0x0bd8

具体截图如下:

6.当任务进行系统调用时,即int0x80时,记录栈的变化情况。

当执行完system_interrupt函数,执行153行iret时,记录栈的变化情况。

此外,当进入和退出system_interrupt时,都发生了模式切换,请总结模式切换时,特权级是如何改变的?

栈切换吗?

如何进行切换的?

执行系统调用int0x80前,栈为task0或者task1的用户栈,栈的内容:

地址

0x0BD8

0x0bd8

具体截图如下:

执行系统调用int0x80后,堆栈变为此任务的系统栈,而在这系统栈中自动压入了发生中断之前的ss、栈指针、标志寄存器、cs和下一条指令的eip。

栈的内容如下:

地址

0x0e4c

0x10eb

0x0e50

0x0f

0x0e54

0x246

0x0e58

0xbd8

0x0e5c

0x17

具体截图如下:

当执行完system_interrupt函数,执行153行iret前,栈为任务0的系统栈:

esp=0x0e4c,栈的内容是:

地址

0x0e4c

0x10eb

0x0e50

0x0f

0x0e54

0x246

0x0e58

0xbd8

0x0e5c

0x17

具体截图如下:

执行153行iret后,系统栈弹出下一条指令的地址以及各寄存器的值,弹完后系统栈为空。

栈变化为任务1的用户栈:

esp=0x0bd8。

栈的内容是:

地址

0x0bd8

0x0bd8

具体截图如下:

当进入和退出system_interrupt时,都发生了模式切换。

进入系统中断时,硬件将各寄存器的值压入系统栈后,查找其中断向量表后,根据描述符的格式,cs值变为0x08,此时,cs标志着由用户模式切换至内核模式,特权级也由3变为0,栈也切换至系统栈。

退出系统中断时,由于处于特权级0的代码不能直接把控制权转移到特权级3的代码中执行,但中断返回操作iret是可以的,可利用中断返回指令IRET来启动第一个任务。

具体实现方法是在初始堆栈init_stack中人工设置一个返回环境。

例,把任务0的TSS段选择符加载到任务寄存器LTR中、LDT段选择符加载到LDTR中以后,把任务0的用户栈指针(0x17:

init_stack)和代码指针(0x0f:

task0)以及标志寄存器值压入栈中,然后执行中断返回指令IRET。

该指令会弹出堆栈上的的堆栈指针作为任务0用户指针,恢复假设的任务0的标志寄存器内容,并且弹出栈中代码指针放入CS:

EIP寄存器中,从而开始执行任务0的代码,完成了从特权级0到特权级3代码的控制转移,模式由内核模式转换为用户模式。

7.当时钟中断发生,进入到timer_interrupt程序,请详细记录从任务0切换到任务1,以及又过了10ms,从任务1切换回到任务0,整个流程是怎样的?

TSS是如何变化的?

各个寄存器的值是如何变化的?

请详细总结任务切换的过程。

从任务0切换到任务1:

1、硬件将任务0的各寄存器的值和状态保存到tss0中。

2、通过$TSS1_SEL选择符查找gdt的tss1和ldt1得到任务1的各寄存器的值和任务1的局部代码段指针等,加载到对应各寄存器中,

3、然后跳转到任务1中。

此时,tss0中为任务0在跳转前的对应各寄存器的值

跳转前的tss0:

tss0的基地址位0xbf8

切换后,数据或指针加载到对应各寄存器后的tss0:

切换后各寄存器的值是tss1中对应的各寄存器的值:

tss1:

基地址为0x0e78

各寄存器的值也是对应tss1中的值。

当过10ms后,从任务1切换到任务0:

执行跳转指令时,

1、硬件将任务1的各寄存器的值和状态保存到tss1中。

2、通过$TSS0_SEL选择符查找gdt的tss0和ldt0,

3、将tss0对应值加载到寄存器中,其中eip的值是前面跳转到任务0时下一条指令的地址,即jmp2f,栈切换为任务1的系统栈,

4、正常执行。

tss1中变为跳转前任务1的对应各寄存器的值。

任务1切换到任务0之前的tss1上图已给出,

切换之后的tss1:

各寄存器的值:

(由任务0跳转到任务1后):

各寄存器的值:

(由任务1跳转到任务0后):

请修改模板的文件名,并在第一页上填写你的个人信息,然后回答第二页上的5个问题,每个问题的回答都要新起一页,标清序号。

OperatingSystem2015秋 20/20

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1