清华大学操作系统lab1-实验报告_第1页
清华大学操作系统lab1-实验报告_第2页
清华大学操作系统lab1-实验报告_第3页
清华大学操作系统lab1-实验报告_第4页
清华大学操作系统lab1-实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

千里之行,始于足下让知识带有温度。第第2页/共2页精品文档推荐清华大学操作系统lab1_实验报告试验1:系统软件启动过程

练习1:

(1)操作系统镜像文件ucore.img是如何一步一步生成的?

在命令行中输入“makeV=”

1、首先把C的源代码举行编译成为.o文件,也就是目标文件(红色方框内)

2、ld命令将这些目标文件改变成可执行文件,比如此处的bootblock.out(绿色方框内)

3、dd命令把bootloder放到ucore.imgcount的虚拟硬盘之中

4、还生成了两个软件,一个是Bootloader,另一个是kernel。

(2)一个被系统认为是符合规范的硬盘主引导扇区的特征:

在/lab1/tools/sign.c中我们可以了解到

规范的硬盘引导扇区的大小为512字节,硬盘结束标志位55AA

练习2:

(1)从CPU加电后执行的第一条指令开头,单步跟踪BIOS的执行

改写Makefile文件

lab1-mon:$(UCOREIMG)

$(V)$(TERMINAL)-e"$(QEMU)-S-s-din_asm-D$(BINDIR)/q.log-monitorstdio-hda$DS:DataSegment

movw%ax,%es#->ES:ExtraSegment

movw%ax,%fs#->FS

movw%ax,%gs#->GS

movw%ax,%ss#->SS:StackSegment

#设置堆栈

movl$0x0,%ebp

movl$start,%esp#栈顶为0x7c00

#进入bootmain,不再返回

callbootmain

spin:

jmpspin

练习4:分析bootloader加载ELF格式的OS的过程

读一个扇区的流程可参看bootmain.c中的readsect函数实现。大致如下:

1.读I/O地址0x1f7,等待磁盘预备好;

2.写I/O地址0x1f2~0x1f5,0x1f7,发出读取第offseet个扇区处的磁盘数据的命令;

3.读I/O地址0x1f7,等待磁盘预备好;

4.延续读I/O地址0x1f0,把磁盘扇区数据读到指定内存。

staticvoid

readsect(void*dst,uint32_tsecno){

//waitfordisktobeready

waitdisk();

outb(0x1F2,1);//count=1

outb(0x1F3,secno

outb(0x1F4,(secno>>8)

outb(0x1F5,(secno>>16)

outb(0x1F6,((secno>>24)

outb(0x1F7,0x20);//cmd0x20-readsectors

//waitfordisktobeready

waitdisk();

//readasector

insl(0x1F0,dst,SECTSIZE/4);

}

该函数封装在readseg函数中,该函数完成读取随意的长度。

Notice:uint32_tsecno=(offset/SECTSIZE)+1;#0号扇区已被引导占用。

最后在bootmain函数中完成加载ELF格式os的操作:

1:读取ELF的头部

2:推断ELF文件是否是合法

3:将描述表的头地址存在ph

4:根据描述表将ELF文件中数据载入内存

5:按照ELF头部储存的入口信息,找到内核的入口(不再返回)

Notice:可能会浮现内存长度>文件长度的现象

多读入部分包含bss节,需要清0

练习5:实现函数调用堆栈跟踪函数

print_stackframe(void){

uint32_tebp=read_ebp(),eip=read_eip();

inti,j;

for(i=0;ebp!=0i++){

cprintf("ebp:0x%08xeip:0x%08xargs:",ebp,eip);

uint32_t*args=(uint32_t*)ebp+2;

//(uint32_t)callingarguments[0..4]=thecontentsinaddress(unit32_t)ebp+2[0..4]

for(j=0;jtf_cs!=USER_CS){

switchk2u=*tf;

switchk2u.tf_cs=USER_CS;

switchk2u.tf_ds=switchk2u.tf_es=switchk2u.tf_ss=USER_DS;

switchk2u.tf_esp=(uint32_t)tf+sizeof(structtrapframe)-8;

//在执行int120前系统在核心态,int不会引起栈的切换

switchk2u.tf_eflags|=FL_IOPL_MASK;

*((uint32_t*)tf-1)=(uint32_t)

}

break;

最后iret时返回5个值。

(2)用户态切换到内核态:

lab1_switch_to_kernel(void){

asmvolatile(

"int%0\n"

"movl%%ebp,%%esp\n"

:

:"i"(T_SWITCH_TOK)

);

}

caseT_SWITCH_TOK:

if(tf->tf_cs!=KERNEL_CS){

tf->tf_cs=KERNEL_CS;

tf->tf_ds=tf->tf_es=KERNEL_DS;

tf->tf_eflags

//定位暂时栈的栈顶

switchu2k=(structtrapframe*)(tf->tf_esp-(sizeof(structtrapframe)-8));

//复制

memmove(switchu2k,tf,sizeof(structtrapframe)-8);

//在执行int120前系统在核心态,int会引起栈的切换,iret不会引起

//栈的切换

*((uint32_t*)tf-1)=(uint32_t)switchu2k;

/*设置暂时栈,指向switchu2k,这样iret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论