教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

ucore-lab1实验报告

来源:网络收集 时间:2026-05-06
导读: Lab1 实验报告 任务4:Bootloader如何准备并进入保护模式的? 打开bootasm.S文件分析其中的代码 启动CPU,转至32位保护模式;BIOS从主加载分区中物理地址为0x7c00的位置加载以下代码并开始执行实模式代码,段寄存器cs值为0,ip值为7c00。 CLI屏蔽中断;CLD使

Lab1 实验报告

任务4:Bootloader如何准备并进入保护模式的? 打开bootasm.S文件分析其中的代码

启动CPU,转至32位保护模式;BIOS从主加载分区中物理地址为0x7c00的位置加载以下代码并开始执行实模式代码,段寄存器cs值为0,ip值为7c00。 CLI屏蔽中断;CLD使DF复位,即DF=0,串操作方向控制。

设置寄存器 ax,ds,es,ss寄存器值清0;地址线20被封锁,高于1MB的地址都默认回卷到0。

从实模式转换到保护模式,用到了全局描述符表和段表,使得虚拟地址和物理地址匹配,保证转换时有效的内存映射不改变;lgdt汇编指令把GDTR描述符表的大小和起始位置存入gdtr寄存器中;将CR0的最后一位设置为1,进入保护模式;指令跳转由代码段选择子0x8跳到protcseg的起始位置。

设置保护模式下数据段寄存器;设置堆栈寄存器并调用main函数;对GDT作处理。

任务5:通过阅读bootmait.c,了解bootloader如何加载ELF文件;分析bootloader如何读取硬盘扇区以及bootloader如何加载ELF格式的OS

打开bootmain.c文件分析其中代码

1、加载ELF文件 void

bootmain(void) {

// read the 1st page off disk

readseg((uintptr_t)ELFHDR, SECTSIZE * 8, 0); #读取第一页 // is this a valid ELF?

if (ELFHDR->e_magic != ELF_MAGIC) {

goto bad;

} #判断魔数 struct proghdr *ph, *eph;

}

// load each program segment (ignores ph flags)

ph = (struct proghdr *)((uintptr_t)ELFHDR + ELFHDR->e_phoff); eph = ph + ELFHDR->e_phnum; for (; ph < eph; ph ++) { }

// call the entry point from the ELF header // note: does not return

((void (*)(void))(ELFHDR->e_entry & 0xFFFFFF))(); outw(0x8A00, 0x8A00); outw(0x8A00, 0x8E00); /* do nothing */ while (1);

readseg(ph->p_va & 0xFFFFFF, ph->p_memsz, ph->p_offset);

注:ph表示ELF段表首地址;eph表示ELF段表末地址

注:循环读每个段

bad: #出现问题时的处理

2、读取硬盘分区 static void waitdisk(void) { } static void

readsect(void *dst, uint32_t secno) {

// wait for disk to be ready #等待磁盘准备就绪

#count = 1 #读取一个扇区

waitdisk(); outb(0x1F2, 1);

outb(0x1F3, secno & 0xFF); #要读取的扇区编号

outb(0x1F4, (secno >> 8) & 0xFF); #用来存放读写柱面的低 8位字节 outb(0x1F5, (secno >> 16) & 0xFF); #用来存放读写柱面的高 2位字节 outb(0x1F6, ((secno >> 24) & 0xF) | 0xE0);#用来存放要读/写的磁盘号及磁头号 outb(0x1F7, 0x20);

// cmd 0x20 - read sectors

// wait for disk to be ready

while ((inb(0x1F7) & 0xC0) != 0x40)

/* do nothing */;

注:检查0x1F7的最高两位,如果是01,则跳出循环;否则等待

waitdisk(); }

// read a sector

insl(0x1F0, dst, SECTSIZE / 4); //获取数据

任务6:完成函数print_stackframe的实现,观察输出,并解释最后一行各个数值的含义。在汇编中如何调用C语言中的函数,需要做哪些准备工作?

补充源代码如下: void

print_stackframe(void) { } }

/* LAB1 YOUR CODE */

uint32_t eip = read_eip(); //读取当前ip寄存器的值 uint32_t arg2; uint32_t arg4;

while(ebp != 0) {

memcpy(&arg1,ebp+8,4); memcpy(&arg2,ebp+12,4); memcpy(&arg3,ebp+16,4); memcpy(&arg4,ebp+20,4);

cprintf(\

print_debuginfo(eip); //根据格式输出

uint32_t ebp = read_ebp(); //读取当前ep寄存器的值 uint32_t arg1; //用来存储参数值的变量(1-4) uint32_t arg3;

\

memcpy(&eip,ebp+4,4); //上一个eip就是当前ebp的上面4个字节的值

memcpy(&ebp,ebp,4); //上一个ebp就是当前ebp指向空间的值

分析最后一行为:

ebp: 0x00007bf8 eip:0x00007d62 args:0xc031fcfa 0xc08ed88e 0xfa7502a8

0x00100a3c : -- 0x00007d62 --

显示的信息是“文件名:行数:函数名称:函数入口偏移量”

汇编语言在调用C函数的时候,先将参数按照倒序压到栈里,然后压入返回地址,即call语句的下一条指令的地址,然后将ebp的值压入栈中,之后将esp的值赋给ebp,然后再调整eip的值为函数入口地址。

任务7:

1、中断向量表中一个表项占用多少字节,其中哪几位代表中断处理代码的入口?

如中断向量表中一个表项struct gatedesc {}:将bit位相加共64bit为8字节;其第31-16位是段选择子,第63-48位和第15-0位分别是偏移量的高16位和低16位。通过段选择子和段偏移量,就可以找到中断处理代码入口。

2、完成初始化函数idt_init;

查看mmu.h中的SETGATE宏:#define SETGATE(gate, istrap, sel, off, dpl) 主要使用这个宏进行段选择符的构造 gate:为相应的idt数组内容

istrap:系统段设置为1,中断门设置为0 sel:段选择子

off:为__vectors数组内容

dpl:设置优先级

使用__vector数组时,c程序文件中引用之前,extern声明一下 extern long __vectors[]; /* LAB1 YOUR CODE */ //初始化中断向量表进行操作 int i = 0;

for(i = 0;i <= 255; i++)

{ //设置IDT表的操作 SETGATE(idt[i],0,KERNEL_CS,__vectors[i],3); }

SETGATE(idt[T_SYSCALL],1,KERNEL_CS,__vectors[T_SYSCALL],0); lidt(&idt_pd ); //装载IDT表 }

3、完成中断处理函数trap();

设置时钟进行操作:

case IRQ_OFFSET + IRQ_TIMER:

if(ticks == TICK_NUM) //进行时钟进行分析;宏定义TICK_NUM为100 { print_ticks(); ticks = 0; } else {ticks++;} break;

函数主要实现调用时间中断处理,打印100ticks;但是在键入键盘中断后会出现kbd [000]字样。

…… 此处隐藏:1386字,全部文档内容请下载后查看。喜欢就下载吧 ……
ucore-lab1实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/594162.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)