MIT6.828 32位操作系统笔记(4)----LAB1上

MIT EDU 6.828 实验源代码

分类 MIT6.828 32位操作系统实验笔记

实验完善代码 LAB2-4下载链接 提取码:79t8

1、安装qemu

  • 下载qemu
    git clone https://github.com/mit-pdos/6.828-qemu.git /usr/local (后面的表示将文件保存到这个文件夹下)
  • 切换到文件目录,并运行命令
    ./configure --disable-kvm --target-list="i386-softmmu x86_64-softmmu"
  • 运行命令
    make
    make install

2、下载程序源代码

git clone https://pdos.csail.mit.edu/6.828/2018/jos.git   ~/lab

3、运行并分析代码

这里可先参考 链接—初始化 部分内容,理解之后再进行下面的步骤。

4、Exercise 3

MIT6.828 32位操作系统笔记(4)----LAB1上_第1张图片
下图中,左边的是obj/boot/boot.asm 文件中的内容,右边的是在GDB 窗口显示的5条从地址0x7c00处开始的汇编指令
MIT6.828 32位操作系统笔记(4)----LAB1上_第2张图片

回答下面的问题

  • 在什么时候处理器开始运行于32位模式?哪一条指令讲CPU从实模式切换到保护模式?

从boot.S文件的lgdt gdtdesc 指令这里开始切换模式,模式切换完成后,运用长跳转指令ljmp $PROT_MODE_CSEG, $protcseg 进入保护模式。

MIT6.828 32位操作系统笔记(4)----LAB1上_第3张图片

  • boot loader 的最后一条指令是什么?内核执行的第一条指令是什么?

1、 boot loader 的最后一条指令是跳转到内核程序代码入口
((void (*)(void)) (ELFHDR->e_entry))();
2、内核执行的第一条指令是
movw $0x1234,0x472 # warm boot

  • boot loader 如何决定应该加载多少块扇区进入内存?它从哪里获取这个信息?

boot loader 将内核可执行代码加载到内存,其实这个内核可执行代码就是一个ELF文件,ELF头文件中记录了可执行代码的相关信息,包括它分为哪些节,分别占多少内存等信息。

5、Exercise 4

MIT6.828 32位操作系统笔记(4)----LAB1上_第4张图片

6、 内核的装入过程

bootmain.c 程序的主要作用是将内核的可执行代码(ELF文件) 从硬盘镜像中读到内存中。
MIT6.828 32位操作系统笔记(4)----LAB1上_第5张图片

  • 显示输出
    原来我们刚接触C语言的时候都用过printf 函数,现在所有的底层操作都需要操作系统的代码来实现。
    (1) cprintf 函数
    第一个参数表示的是显示字符串的指针,第二个参数是可变参数。函数的参数实际上都是存放在内存的堆栈中的,而且参数会按照先后的顺序依次存放,靠前的参数会存放在较低的地址。
    MIT6.828 32位操作系统笔记(4)----LAB1上_第6张图片
    MIT6.828 32位操作系统笔记(4)----LAB1上_第7张图片
    MIT6.828 32位操作系统笔记(4)----LAB1上_第8张图片

(2)cga_putc(ch)
字符ch 的第8位到第15位的含意如图,前四位代表背景色,后四位代表字符前景色,I表示是否高亮。
MIT6.828 32位操作系统笔记(4)----LAB1上_第9张图片
本实验中,显示屏规定位25行,80个字符,可以在console.h 头文件的预处理中找到。

MIT6.828 32位操作系统笔记(4)----LAB1上_第10张图片
从图中可以看到,CGA_BUF 的地址位0xb800,显示缓存的物理地址。
MIT6.828 32位操作系统笔记(4)----LAB1上_第11张图片

(3)cprintf 函数所调用的vcprintf 函数在执行过程中调用了 lib/printfmt.c 中的vprintfmt 函数,字符串输出功能的主要实现,该函数的流程图如图所示。
MIT6.828 32位操作系统笔记(4)----LAB1上_第12张图片
(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);

MIT6.828 32位操作系统笔记(4)----LAB1上_第13张图片
然后,在/lab 文件下打开一个终端,运行命令

make qemu

在这里插入图片描述

7、Exercise 8

在这里插入图片描述
八进制输出的实现

首先前面介绍了,字符串输出功能的主要实现在lib/printfmt.c 文件中的vprintfmt函数中。
MIT6.828 32位操作系统笔记(4)----LAB1上_第14张图片
然后在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
推荐这位博主系列的文章

你可能感兴趣的:(操作系统)