MIT EDU 6.828 实验源代码
分类 MIT6.828 32位操作系统实验笔记
实验完善代码 LAB2-4下载链接 提取码:79t8
./configure --disable-kvm --target-list="i386-softmmu x86_64-softmmu"
git clone https://pdos.csail.mit.edu/6.828/2018/jos.git ~/lab
这里可先参考 链接—初始化 部分内容,理解之后再进行下面的步骤。
下图中,左边的是obj/boot/boot.asm 文件中的内容,右边的是在GDB 窗口显示的5条从地址0x7c00处开始的汇编指令
从boot.S文件的lgdt gdtdesc 指令这里开始切换模式,模式切换完成后,运用长跳转指令ljmp $PROT_MODE_CSEG, $protcseg 进入保护模式。
1、 boot loader 的最后一条指令是跳转到内核程序代码入口
((void (*)(void)) (ELFHDR->e_entry))();
2、内核执行的第一条指令是
movw $0x1234,0x472 # warm boot
boot loader 将内核可执行代码加载到内存,其实这个内核可执行代码就是一个ELF文件,ELF头文件中记录了可执行代码的相关信息,包括它分为哪些节,分别占多少内存等信息。
bootmain.c 程序的主要作用是将内核的可执行代码(ELF文件) 从硬盘镜像中读到内存中。
(2)cga_putc(ch)
字符ch 的第8位到第15位的含意如图,前四位代表背景色,后四位代表字符前景色,I表示是否高亮。
本实验中,显示屏规定位25行,80个字符,可以在console.h 头文件的预处理中找到。
从图中可以看到,CGA_BUF 的地址位0xb800,显示缓存的物理地址。
(3)cprintf 函数所调用的vcprintf 函数在执行过程中调用了 lib/printfmt.c 中的vprintfmt 函数,字符串输出功能的主要实现,该函数的流程图如图所示。
(4)关于cprintf 函数的演示
上面所述的函数,读者可以仔细研读,推荐使用源码阅读器Understand 安装教程
这里,我们简单验证和使用下,下cprintf() 函数。
首先,打开 lab/kern/monitor.c 文件。在这个C文件的最低端处添加代码。
int x = 1,y = -2, z = 3;
cprintf("x = %d, y = %d, z = %d.\n",x,y,z);
make qemu
首先前面介绍了,字符串输出功能的主要实现在lib/printfmt.c 文件中的vprintfmt函数中。
然后在kern/monitor.c 文件中的monitor函数中加入代码
int x = 1,y = 15, z = 3;
cprintf("x = %d, y = %o, z = %d.\n",x,y,z);
分类 MIT6.828 32位操作系统实验笔记
本文参考文章 http://grid.hust.edu.cn/zyshao/OSEngineering.htm
推荐这位博主系列的文章