操作系统

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_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值