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

ucore - LAB1实验报告(3)

来源:网络收集 时间:2026-09-10
导读: } } 输出与原表大致一致。 ss:ebp指向的堆栈位置储存着caller的ebp,以此为线索可以得到所有使用堆栈的函数ebp。 ss:ebp+4指向caller调用时的eip,ss:ebp+8等是(可能的)参数。 输出中,堆栈最深一层为 ebp:0x0000

} }

输出与原表大致一致。

ss:ebp指向的堆栈位置储存着caller的ebp,以此为线索可以得到所有使用堆栈的函数ebp。 ss:ebp+4指向caller调用时的eip,ss:ebp+8等是(可能的)参数。

输出中,堆栈最深一层为 ebp:0x00007bf8 eip:0x00007d64 args:0xc031fcfa 0xc08ed88e0x64e4d08e 0xfa7502a8 : -- 0x00007d67 --

其对应的是第一个使用堆栈的函数,bootmain.c中的bootmain。

bootloader设置的堆栈从0x7c00开始,使用\转入bootmain函数。

call指令压栈,所以bootmain中ebp为0x7bf8。返回地址eip为0x0000d64,之后四个是参数args:0xc031fcfa 0xc08ed88e0x64e4d08e 0xfa7502a8.

练习6:中断初始化和处理

1. (保护模式中)中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口?

答:中断向量表中一个表项占8个字节,其中第0~15,48~63位代表中断处理代码的入口。

2. 完成trap.c中对中断向量表进行初始化的函数idt_init。在idt_init函数中,依次对所有中断入口进行初始化。使用mmu.h中的SETGATE宏,填充idt数组内容。注意除了系统调用中断(T_SYSCALL)以外,其它中断均使用中断门描述符,权限为内核态权限;而系统调用中断使用异常,权限为陷阱门描述符。每个中断的入口由tools/vectors.c生成,使用trap.c中声明的vectors数组即可。 答:idt_init(void) {

extern uintptr_t __vectors[]; int i;

for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) {

SETGATE(idt[i], 0, GD_KTEXT, __vectors[i], DPL_KERNEL); }//初始化每一条IDT项 // 设置内核态到用户态的转换

SETGATE(idt[T_SWITCH_TOK], 0, GD_KTEXT, __vectors[T_SWITCH_TOK], DPL_USER); // 载入IDT lidt(&idt_pd); }

3. 完成trap.c中的中断处理函数trap对时钟中断进行处理的部分填写trap函数中处理时钟中断的部分,使操作系统每遇到100次时钟中断后,调用print_ticks子程序,向屏幕上打印一行文字”100 ticks”。

答:case IRQ_OFFSET + IRQ_TIMER: ticks ++;

if (ticks % TICK_NUM == 0) { print_ticks();

}//当有100次时钟中断输出一次 break;

拓展练习:增加syscall功能,即增加一用户态函数(可执行一特定系统调用:获得时钟计数值),当内核初始完毕后,可从内核态返回到用户态的函数,而用户态的函数又通过系统调用得到内核态的服务。 答:⑴内核态切换到用户态:

lab1_switch_to_user(void) {

asm volatile (

\

// esp-8 为下一步复制的栈帧留好 tf_ss和tf_esp的位置 \

\ :

: \ );

}

case T_SWITCH_TOU:

if (tf->tf_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(struct trapframe) - 8; //在执行int120前系统在核心态,int不会引起栈的切换

switchk2u.tf_eflags |= FL_IOPL_MASK;

*((uint32_t *)tf - 1) = (uint32_t)&switchk2u; }

break;

最后iret时返回5个值。 ⑵用户态切换到内核态:

lab1_switch_to_kernel(void) { asm volatile ( \

\ :

: \ ); }

case T_SWITCH_TOK:

ucore - LAB1实验报告(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/604851.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)