练习1:理解通过make生成执行文件的过程。

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

生成 bin/kern 部分

生成 init.o

生成 readline.o

生成 stdio.o

生成 kdebug.o

生成 kmonitor.o

生成 panic.o

生成 clock.o

生成 console.o

生成 intr.o

生成 picirq.o

生成 trap.o

生成 trapentry.o

生成 vectors.o

生成 pmm.o

生成 printfmt.o

生成 string.o

 

用上面 .o 文件连接生成 bin/kern

生成bin/bootblock部分

生成 bootasm.o

生成 bootmain.o

 

用上面两个.o文件生成 bin/bootblock

生成 bin/sign

生成 sign.o

用上面.o生成 bin/sign

生成 ucore.img

2.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

主引导扇区大小为512字节,并且最后结尾为 0x55,0xAA

练习2:使用qemu执行并调试lab1中的软件

1. 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。

(1).首先启动一个终端,使用 qemu -S -s -hda bin/ucore.img -monitor stdio 的方式启动qemu,等待gdb连接

(2).在启动一个终端,启动gdb用远程连接的方式连接qemu

(3).在qemu终端输入 x /6i $pc 这条指令,观察qemu启动时候首先执行的指令

发现第一条指令是一个长跳转,在gdb终端输入 i r观察寄存器值

可以看到现在的CS:IP --> 0xffff0,这是指向内存的开始位置,也是加电后bios初始化后cs:ip的位置。

然后在gdb终端输入si执行一条汇编指令,然后在qemu终端观察下面的执行指令已经变为下面

也就是第一条指令后跳转后的位置

2.在初始化位置0x7c00设置实地址断点,测试断点正常。

打开qemu和gdb,建立远程连接,在gdb终端输入 p *0x7c00,然后输入c执行

执行完毕,可以正常运行到断点

3.从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和 bootblock.asm进行比较。

使用si单步执行观察下面10条指令,进行比较。

反汇编得到的代码是:

代码指令比较简洁,没有多余东西,bootasm代码是:

代码也比较简洁,不过里面带有注释,bootlock.asm代码是:

发现里面除了具有注释,还有代码所在的位置,位置与反编译得到的一致

4.自己找一个bootloader或内核中的代码位置,设置断点并进行测试。

在gdb终端载入file ./bin/kernel,然后设置暂停点memset,用c执行,得到下面结果,在string里面暂停了下来

习题3.分析bootloader进入保护模式的过程

为何开启A20,以及如何开启A20

开启A20可以使用32根地址总线,如果不开启只能使用20根地址总线,寻址能力只有1MB,开启后寻址能力可以达到4GB。

打开A20方法,不断查看0x64端口的值,如果是2表示不忙,如果不忙,把x0d1写入0x64端口,把0xdf写入0x60端口

如何初始化GDT表

在bootasm.s里面有这样一段代码来对GDT进行了初始化

# Bootstrap GDT
.p2align # force byte alignment
gdt:
SEG_NULLASM # null seg
SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg for bootloader and kernel
SEG_ASM(STA_W, 0x0, 0xffffffff) # data seg for bootloader and kernel gdtdesc:
.word 0x17 # sizeof(gdt) -
.long gdt # address gdt

如何使能和进入保护模式

movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %eax, %cr0 ljmp $PROT_MODE_CSEG, $protcseg

由上面代码可以看出进入保护模式是把cr0寄存器的最后一位编程1,然后跳转到保护模式段

lab 1实验报告的更多相关文章

  1. 20169219 SQL注入实验报告

    实验介绍 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表单提交框.输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令. 在 ...

  2. ucoreOS_lab8 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  3. ucoreOS_lab5 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  4. 《ucore lab8》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 完成读文件操作的实现(需要编码) 题目 首先了解打开文件的处理流程,然后参考本实验后续的文件读写操作的过程分析,编写在sfs_inod ...

  5. 《ucore lab3》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1:给未被映射的地址映射上物理页 题目 完成do_pgfault(mm/vmm.c)函数,给未被映射的地址映射上物理页.设置访问权限的时候需 ...

  6. 《ucore lab1》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1:理解通过make生成执行文件的过程 详见<ucore lab1 exercise1>实验报告 练习2:使用qemu执行并调试 ...

  7. 《MIT 6.828 Lab1: Booting a PC》实验报告

    <MIT 6.828 Lab1: Booting a PC>实验报告 本实验的网站链接见:Lab 1: Booting a PC. 实验内容 熟悉x86汇编语言.QEMU x86仿真器.P ...

  8. CSAPP_BombLab实验报告

    Lab_2实验报告 目录 Lab_2实验报告 屏幕截图 考察内容 各题答案 bomb1 bomb2 bomb3 bomb4 bomb5 bomb6 secret_phase 解题思路 bomb1 bo ...

  9. 北京电子科技学院(BESTI)实验报告5

    北京电子科技学院(BESTI)实验报告5 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名) 郑凯杰.周恩德 学号:(按贡献大小排名) 20145314.20145217 ...

随机推荐

  1. 导入NGUI插件

    在Unity编辑器顶部菜单栏中的Assets菜单中选择Import Package,然后选择Custom Package(自定义资源包),弹出资源路径窗口,在其中找到NGUI资源包所在的位置,单击”打 ...

  2. javascript debut trick, using the throw to make a interrupt(breakpoint) in your program

    console.log('initialize'); try { throw "breakPoint"; } catch(err) {} when I debug the extj ...

  3. App新版本提醒

    童鞋们是否遇过在使用app的时候出现有新版本更新跳转到苹果商店的提示呢? github中有一个三方框架 Harpy 完美实现了这一功能! demo时刻 我的github - Harpy

  4. 关于SQL语句中SUM函数返回NULL的解决办法

    SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...

  5. ZOJ 2110 Tempter of the Bone(DFS)

    点我看题目 题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO. 思路 :DFS一下就可以,不过要注意下一终止条 ...

  6. android activity在横竖屏切换的时候不重新调用onCreate方法

    在安卓系统中,横竖屏切换会默认重新调用onCreate等生命周期方法,如果此时有一些临时数据没有保存下来,很有可能会导致该数据丢失. 因此我们可以进行以下设置,来避免恒切换时重新调用onCreate方 ...

  7. ANDROID_MARS学习笔记_S01原始版_005_ProgressBar

    一.代码 1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...

  8. RUST叫系统编程语言,而GO是网络编程语言

    用GO你必须要搞清楚一点,GO不是面向CPU密集计算的,而是面向IO密集计算的!!!RUST才是面向CPU密集计算的语言,所以RUST叫系统编程语言,而GO是网络编程语言.GO跟JAVA的Spring ...

  9. Android Touch事件传递机制

    1.基础知识 (1) 所有Touch事件都被封装成了MotionEvent对象,包括Touch的位置.时间.历史记录以及第几个手指(多指触摸)等. (2) 事件类型分为ACTION_DOWN, ACT ...

  10. 如何关闭win7的ps/2兼容鼠标(触屏版)

    买了一个新电脑联想ThinkPad E555 可是刚拿到是个win10 的系统,用习惯了win7,win0不太好用, 然后帮我刷成了win7,之后一切都好,性能也是让我很满意,但是却关不掉触控板,于是 ...