ucore-lab1实验报告
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
显示的信息是“文件名:行数:函数名称:函数入口偏移量”
汇编语言在调用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字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




