推荐从bilibili上看清华大学操作系统的视频,里面讲的很清楚。关于虚拟机镜像,我也是从向勇老师所提供的资源上下载的,他的资源里面环境都已经搭建完毕,自己搭建环境会出现很多问题。建议从网上下载,省时省心。
lab1练习一的传送门
练习1:理解通过make生成执行文件的过程
操作系统镜像文件ucore.img是如何一步一步生成的?
1 进入相应文件夹
2 展现编译过程
利用make V=查看文本内容
注意在“make V=”之前,需要先清空一下, 否则如上。
通过大体的阅读,我们不难发现,系统调用了gcc把源代码编译成了.o 文件。
对于很多行,前面都有一个+号,这个是编译指令,多数UNIX平台都通过CC调用它们的C编译程序
ld通过编译又将目标文件,转化成了一个执行程序,即生成了bootblock
通过这个,我们看出,他生成了两个文件,分别是“bootblock”和“kernel”
所以,综上, ucore.img 的生成过程是
1 编译所有生成bin/kernel所需的文件
2 链接生成bin/kernel
3 编译bootasm.S bootmain.c sign.c
4 根据sign规范生成obj/bootblock.o
5 生成ucore.img
一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
先说一下主引导扇区(MBR)干什么用的
主引导扇区在计算机引导过程中起着非常重要的作用,计算机在按下电源后,开始执行主板的BIOS程序,进行完一系列的检测和配置以后,开始按CMOS中设定的系统引导顺序进行引导。
值得一提的是,MBR有且仅有512个字节,在执行MBR的引导程序时,会验证MBR扇区最后两个字节是否为“55AA”,如果是“55AA”,那么系统才会继续执行下面的程序;如果不是“55AA”,则程序认为这是一个非法的MBR,那么程序将停止执行,同时会在屏幕上列出错误信息。
也就是说,我们需要检查是否占用512个字节,并且看后两位字节是否是“55AA”
查看sign.c的文件内容
less tools/sign.c
内容如下
1 #include <stdio.h>
2 #include <errno.h>
3 #include <string.h>
4 #include <sys/stat.h>
5
6 int
7 main(int argc, char *argv[]) {
8 struct stat st;
9 if (argc != 3) {
10 fprintf(stderr, "Usage: <input filename> <output filename>\n");
11 return -1;
12 }
13 if (stat(argv[1], &st) != 0) {
14 fprintf(stderr, "Error opening file '%s': %s\n", argv[1], strerror(errno));
15 return -1;
16 }
17 printf("'%s' size: %lld bytes\n", argv[1], (long long)st.st_size);
18 if (st.st_size > 510) {
19 fprintf(stderr, "%lld >> 510!!\n", (long long)st.st_size);
20 return -1;
21 }
22 char buf[512];
23 memset(buf, 0, sizeof(buf));
24 FILE *ifp = fopen(argv[1], "rb");
25 int size = fread(buf, 1, st.st_size, ifp);
26 if (size != st