ucore 实验 lab1
#练习1
在此练习中,大家需要通过静态分析代码来了解:
1.操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
2.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
补充材料:
如何调试Makefile
当执行make时,一般只会显示输出,不会显示make到底执行了哪些命令。
如想了解make执行了哪些命令,可以执行:
$ make "V="
要获取更多有关make的信息,可上网查询,并请执行
$ man make
1.操作系统镜像文件ucore.img是如何一步一步生成的?
在makefile中可以找到ucore.img部分,查看代码,发现其与kernel和bootblock有关
dd if=/dev/zero of=bin/ucore.img count=10000
dd if=bin/bootblock of=bin/ucore.img conv=notrunc
dd if=bin/kernel of=bin/ucore.img seek=1 conv=notrunc
//dd命令用于向文件中写入数据块。dd命令把if文件连续地从头(除非有特别声明)写入到of文件中
//if:用于指明要写入的文件,/dev/zero是Linux下的虚拟设备,用于提供空字符
//of:用于指明要接受文件的文件,此处是硬盘镜像文件**ucore.img**
//count:拷贝的数据量,指明有多少块,块大小由bs指明,默认是512字节
//conv=notrunc:不截短输出文件
//seek=1:从输出文件开头跳过1个块后再开始复制,因为第0块是引导扇区
查看make过程中执行了哪些指令
将目标文件生成可执行文件kernel
将目标文件生成可执行文件bootblock(bootloader的一个执行程序)
参数解释如下:
- -m 模拟为i386上的连接器
- -N 设置代码段和数据段均可读写
- -e 指定入口
- -Ttext 制定代码段开始位置
dd下面的代码是生成一个虚拟的硬盘,名为ucore.img count,容量为1000块,一块大小默认为512k,把bootloader放到此虚拟硬盘中,qemu基于硬盘模拟器中相应数据执行相应代码,同时生成两个软件:kernel和bootblock
上述图片命令中的具体参数,查阅后得知
查阅资料罗列如下:
- -ggdb 生成可供gdb使用的调试信息
- -m32 生成适用于32位环境的代码
- -gstabs 生成stabs格式的调试信息
- -nostdinc 不使用标准库
- -fno-stack-protector 不生成用于检测缓冲区溢出的代码
- -Os 为减小代码大小而进行优化
- -I
添加搜索头文件的路径
- -fno-builtin 不进行builtin函数的优化
2.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
查看硬盘扇区特征的标识文件
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
int
main(int argc, char *argv[]) {
struct stat st;
if (argc != 3) {
fprintf(stderr, "Usage: <input filename> <output filename>\n");
return -1;
}
if (stat(argv[1], &st) != 0) {
fprintf(stderr, "Error opening file '%s': %s\n", argv[1], strerror(errno));
return -1;
}
printf("'%s' size: %lld bytes\n", argv[1], (long long)st.st_size);
if (st.st_size > 510) {
fprintf(stderr, "%lld >> 510!!\n", (long long)st.st_size);
return -1;
}
char buf[512];
memset(buf, 0, sizeof(buf));
FILE *ifp = fopen(argv[1], "rb");
int size = fread(buf, 1, st.st_