|
@ -1,6 +1,6 @@ |
|
|
= Lab1 report = |
|
|
|
|
|
|
|
|
# Lab1 erport |
|
|
|
|
|
|
|
|
== [练习1] == |
|
|
|
|
|
|
|
|
## [练习1] |
|
|
|
|
|
|
|
|
[练习1.1] 操作系统镜像文件 ucore.img 是如何一步一步生成的?(需要比较详细地解释 Makefile 中 |
|
|
[练习1.1] 操作系统镜像文件 ucore.img 是如何一步一步生成的?(需要比较详细地解释 Makefile 中 |
|
|
每一条相关命令和命令参数的含义,以及说明命令导致的结果) |
|
|
每一条相关命令和命令参数的含义,以及说明命令导致的结果) |
|
@ -149,7 +149,7 @@ bin/ucore.img |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== [练习2] == |
|
|
|
|
|
|
|
|
## [练习2] |
|
|
|
|
|
|
|
|
[练习2.1] 从 CPU 加电后执行的第一条指令开始,单步跟踪 BIOS 的执行。 |
|
|
[练习2.1] 从 CPU 加电后执行的第一条指令开始,单步跟踪 BIOS 的执行。 |
|
|
|
|
|
|
|
@ -278,7 +278,7 @@ bin/ucore.img |
|
|
|
|
|
|
|
|
其与bootasm.S和bootblock.asm中的代码相同。 |
|
|
其与bootasm.S和bootblock.asm中的代码相同。 |
|
|
|
|
|
|
|
|
== [练习3] == |
|
|
|
|
|
|
|
|
## [练习3] |
|
|
分析bootloader 进入保护模式的过程。 |
|
|
分析bootloader 进入保护模式的过程。 |
|
|
|
|
|
|
|
|
从`%cs=0 $pc=0x7c00`,进入后 |
|
|
从`%cs=0 $pc=0x7c00`,进入后 |
|
@ -350,7 +350,7 @@ bin/ucore.img |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== [练习4] == |
|
|
|
|
|
|
|
|
## [练习4] |
|
|
分析bootloader加载ELF格式的OS的过程。 |
|
|
分析bootloader加载ELF格式的OS的过程。 |
|
|
|
|
|
|
|
|
首先看readsect函数, |
|
|
首先看readsect函数, |
|
@ -434,7 +434,8 @@ readseg简单包装了readsect,可以从设备读取任意长度的内容。 |
|
|
``` |
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[练习5] 实现函数调用堆栈跟踪函数 |
|
|
|
|
|
|
|
|
## [练习5] |
|
|
|
|
|
实现函数调用堆栈跟踪函数 |
|
|
|
|
|
|
|
|
ss:ebp指向的堆栈位置储存着caller的ebp,以此为线索可以得到所有使用堆栈的函数ebp。 |
|
|
ss:ebp指向的堆栈位置储存着caller的ebp,以此为线索可以得到所有使用堆栈的函数ebp。 |
|
|
ss:ebp+4指向caller调用时的eip,ss:ebp+8等是(可能的)参数。 |
|
|
ss:ebp+4指向caller调用时的eip,ss:ebp+8等是(可能的)参数。 |
|
@ -452,7 +453,7 @@ call指令压栈,所以bootmain中ebp为0x7bf8。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== [练习6] == |
|
|
|
|
|
|
|
|
## [练习6] |
|
|
完善中断初始化和处理 |
|
|
完善中断初始化和处理 |
|
|
|
|
|
|
|
|
[练习6.1] 中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口? |
|
|
[练习6.1] 中断向量表中一个表项占多少字节?其中哪几位代表中断处理代码的入口? |
|
@ -469,7 +470,7 @@ call指令压栈,所以bootmain中ebp为0x7bf8。 |
|
|
见代码 |
|
|
见代码 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== [练习7] == |
|
|
|
|
|
|
|
|
## [练习7] |
|
|
|
|
|
|
|
|
增加syscall功能,即增加一用户态函数(可执行一特定系统调用:获得时钟计数值), |
|
|
增加syscall功能,即增加一用户态函数(可执行一特定系统调用:获得时钟计数值), |
|
|
当内核初始完毕后,可从内核态返回到用户态的函数,而用户态的函数又通过系统调用得到内核态的服务 |
|
|
当内核初始完毕后,可从内核态返回到用户态的函数,而用户态的函数又通过系统调用得到内核态的服务 |
|
|