操作系统实验Ucore lab1

2023-11-14

lab1

前言

这是中山大学数据科学与计算机学院2019年操作系统实验中关于Ucore的项目以及实验报告,实验要求与Ucore手则有少量出入。
所有源代码已经上传至github。
github个人主页: https://starashzero.github.io
项目地址: https://github.com/StarashZero/Ucore-homework

【实验题目】系统软件启动过程

【实验目的】

操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader 来完成这些工作。为此,我们需要完成一个能够切换到x86 的保护模式并显示字符的bootloader,为启动操作系统ucore 做准备。lab1 提供了一个非常小的bootloader 和ucoreOS,整个bootloader 执行代码小于512 个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个bootloader 和ucore OS,读者可以了解到:
● 基于分段机制的存储管理
● 设备管理的基本概念
● PC 启动bootloader 的过程
● bootloader 的文件组成
● 编译运行 bootloader 的过程
● 调试 bootloader 的方法
● ucore OS 的启动过程
● 在汇编级了解栈的结构和处理过程
● 中断处理机制
● 通过串口/并口/CGA 输出字符的方法

【实验方案】

包括:硬件或虚拟机配置方法、软件工具与作用、方案的思想、相关原理、程序流程、算法和数据结构、程序关键模块,结合代码与程序中的位置位置进行解释,组员工作分工。
虚拟机使用Ubuntu,主要的代码编辑与查看工具VSCode,结合Ucore启动过程指导与网上的资料完成实验。

练习 1:理解通过make 生成执行文件的过程。(要求在报告中写出对下述问题的回答)

在此练习中,大家需要通过静态分析代码来了解:

  1. 操作系统镜像文件 ucore.img 是如何一步一步生成的?(需要比较详细地解释Makefile 中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
    首先找到创建ucore.img的makefile代码如下
# create ucore.img
UCOREIMG	:= $(call totarget,ucore.img)

$(UCOREIMG): $(kernel) $(bootblock)
	$(V)dd if=/dev/zero of=$@ count=10000
	$(V)dd if=$(bootblock) of=$@ conv=notrunc
	$(V)dd if=$(kernel) of=$@ seek=1 conv=notrunc

$(call create_target,ucore.img)

可以看到要生成ucore.img首先要生成kernel和bootblock
生成kernel代码如下

# create kernel target
kernel = $(call totarget,kernel)

$(kernel): tools/kernel.ld

$(kernel): $(KOBJS)
	@echo + ld $@
	$(V)$(LD) $(LDFLAGS) -T tools/kernel.ld -o $@ $(KOBJS)
	@$(OBJDUMP) -S $@ > $(call asmfile,kernel)
	@$(OBJDUMP) -t $@ | $(SED) '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $(call symfile,kernel)

$(call create_target,kernel)

运行makefile,在其中找到kernel的实际命令为
在这里插入图片描述
关键参数
-m 模拟指定的连接器
-nostdlib 不使用标准库
-T 指定命令文件
-o 指定输出文件的名称
可以发现生成kernel所需要的文件有:tools/kernel.ld obj/kern/init/init.o obj/kern/libs/readline.o obj/kern/libs/stdio.o obj/kern/debug/kdebug.o obj/kern/debug/kmonitor.o obj/kern/debug/panic.o obj/kern/driver/clock.o obj/kern/driver/console.o obj/kern/driver/intr.o obj/kern/driver/picirq.o obj/kern/trap/trap.o obj/kern/trap/trapentry.o obj/kern/trap/vectors.o obj/kern/mm/pmm.o obj/libs/printfmt.o obj/libs/string.o
生成这些文件的makefile为下面的批处理代码

# kernel

KINCLUDE	+= kern/debug/ \
			   kern/driver/ \
			   kern/trap/ \
			   kern/mm/

KSRCDIR		+= kern/init \
			   kern/libs \
			   kern/debug \
			   kern/driver \
			   kern/trap \
			   kern/mm

KCFLAGS		+= $(addprefix -I,$(KINCLUDE))

$(call add_files_cc,$(call listf_cc,$(KSRCDIR)),kernel,$(KCFLAGS))

其实际代码为(以init.o为例)
在这里插入图片描述
关键参数
-fno-bultin 除非用_builtin_前缀,否则不进行builtin函数的优化
-ggdb 此选项将尽可能的生成gdb的可以使用的调试信息
-m32 生成适用于32位环境的代码
-gstabs 此选项以stabs格式声称调试信息,但是不包括gdb调试信息
-nostdinc 使编译器不在系统缺省的头文件目录里面找头文件
-fno-stack-protector不生成用于检测缓冲区溢出的代码
-I<dir> 添加搜索头文件的路径
kernel生成完成

生成blootblock的makefile代码如下

# create bootblock
bootfiles = $(call listf_cc,boot)
$(foreach f,$(bootfiles),$(call cc_compile,$(f),$(CC),$(CFLAGS) -Os -nostdinc))

bootblock = $(call totarget,bootblock)

$(bootblock): $(call toobj,$(bootfiles)) | $(call totarget,sign)
	@echo + ld $@
	$(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 $^ -o $(call toobj,bootblock)
	@$(OBJDUMP) -S $(call objfile,bootblock) > $(call asmfile,bootblock)
	@$(OBJCOPY) -S -O binary $(call objfile,bootblock) $(call outfile,bootblock)
	@$(call totarget,sign) $(call outfile,bootblock) $(bootblock)

$(call create_target,bootblock)

其生成代码为
在这里插入图片描述
关键参数:
-N设置代码段和数据段均可读写
可以看到生成bootblock需要bootasm.o,bootmain.o,以及sign
bootasm.o和bootmain.o由以下makefile代码生成

bootfiles = $(call listf_cc,boot)
$(foreach f,$(bootfiles),$(call cc_compile,$(f),$(CC),$(CFLAGS) -Os -nostdinc))

实际代码为
在这里插入图片描述
sign的makefile代码为

# create 'sign' tools
$(call add_files_host,tools/sign.c,sign,sign)
$(call create_target_host,sign,sign) 

生成代码为
在这里插入图片描述
2. 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

    char buf[512];
    memset(buf, 0, sizeof(buf));
    FILE *ifp = fopen(argv[1], "rb");
    int size = fread(buf, 1, st.st_size, ifp);
    if (size != st.st_size) {
   
        fprintf(stderr, "read '%s' error, size is %d.\n", argv[1], size);
        return -1;
    }
    fclose(ifp);
    buf[510] = 0x55;
    buf[511] = 0xAA;

一个磁盘主引导扇区512字节,且第510个字节为0X55,第511个字节为0XAA

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统实验Ucore lab1 的相关文章

  • MySQL基础(非常全)

    MySQL基础 一 MySQL概述 1 什么是数据库 答 数据的仓库 如 在ATM的示例中我们创建了一个 db 目录 称其为数据库 2 什么是 MySQL Oracle SQLite Access MS SQL Server等 答 他们均是
  • 线程和进程的区别(面试必备)

    参考文章 https www jianshu com p 2dc01727be45 线程与进程的区别通俗的解释 https www jianshu com p 8ad441510860 附加可参考文章 https baijiahao bai
  • java调优总结

    JVM调优总结 序 几年前写过一篇关于JVM调优的文章 前段时间拿出来看了看 又添加了一些东西 突然发现 基础真的很重要 学习的过程是一个由表及里 再由里及表的过程 呵呵 所谓的 温故而知新 而真正能走完这个轮回的人 也就能称为大牛或专家了
  • 小白学协程笔记2-c语言实现协程-2021-2-10

    文章目录 前言 一 c语言中协程切换方式 二 使用setjmp 和 longjmp实现协程切换 1 setjmp和longjmp函数简介 2 协程实现 三 使用switch case实现协程切换 1 switch case小技巧 2 协程实
  • redis主从同步,总是显示master_link_status:down的解决方法

    前几天 在修改一台从节点的redis的监听端口后 重启了下redis 发现master link status 很长时间一直都是down状态 查看了redis日志 发现日志里出现很多的 I O error trying to sync wi
  • 计算机领域中随处可见的抽象

    想要管理多种具体的东西 那么需要遵守每种东西的规范 如果想要提供一种通用模式来对这些具体的东西统一管理 需要使用一种古老的技术 抽象 抽象是将多种具体的东西 管理时需要遵守的规范 的共同点抽取出来 放入到更高一层的抽象层 在抽象层不定义或少
  • pycharm内存不足时如何修改设置?

    Help gt Find Action gt type VM Options gt Click Edit Custom VM Options Pycharm 2016 2 will open the appropriate vmoption
  • Client-Server问题

    1 实验内容与要求 需要创建客户Client和服务器Server两个进程 它们通过管道进行通信 Client进程派生3个生产者线程 一个管道线程 共享一个20个slots的缓冲区 每个生产者线程随机产生一个数据 打印出来自己的id 进程 线
  • Linux使用nvida-smi查看GPU类型

    nvida smi提供一个查看GPU信息的方法 然而这种方式不能查看GPU型号 型号被省略成了GeForce RTX 208 如果我们需要查看GPU的型号 只需要运行nvidia smi L即可 mrfive ubuntu nvidia s
  • nslookup命令详解

    nslookup命令用于查询DNS的记录 查看域名解析是否正常 在网络故障的时候用来诊断网络问题 nslookup的用法相对来说还是蛮简单的 主要是下面的几个用法 1 直接查询 这个可能大家用到最多 查询一个域名的A记录 nslookup
  • 操作系统笔记六(文件管理)

    1 文件逻辑结构 1 1逻辑结构的文件类型 分类 有结构文件 例如 PNG文件 无结构文件 1 2顺序文件 1 3索引文件 2 辅存的存储空间分配 2 1分配方式 连续分配 直接分配连续的存储空间 链接分配 隐式链接 在盘块内指定下一个盘块
  • Linux,Network manager 导致节点异常重启

    推断是Network manager 导致的 原因待查今天在VmWare的虚拟机上装了个测试RAC 又遇到了一个摸不到头绪的问题CRS装好后 一旦登陆图形界面 节点就重启 事情就有这么巧不登陆图形界面 观察了1个小时没问题 一旦登陆后 立刻
  • 03LinuxC线程学习之线程共享和非共享

    1 线程共享和非共享 1 1 线程共享资源 1 文件描述符表 由于线程间共享进程间的内容 而文件描述符表在主线程的PCB当中 各个线程可以直接去请求访问 所以线程间通信就不需要像进程那样通过管道这些方式通信 2 每种信号的处理方式 即当某个
  • Linux学习--CentOS7.5

    CentOS7命令大全 Linux系统简介 Unix Linux发展史 Linux目录结构 树形结构 查看 切换以及创建目录 文本内容操作 grep工具 关机和重启 Linux命令 基本用法 ls list 使用通配符 mkdir 别名 g
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • MacOS中清除原有ssh公钥方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 用ssh的跳转登录服务器后 ssh会把你每个你访问过计算机的公钥 public key 都记录在 ssh known hosts 当下次访问相同计算机时 SSH会核对公钥
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位
  • 八股文打卡day20——操作系统(3)

    面试题 线程同步的方式有哪些 我的回答 多线程同时访问和修改某个数据的话 会造成数据的不一致和冲突问题 所以就需要线程同步 线程同步的方式有 1 互斥锁 互斥锁就是 当一个资源被访问和操作时 会对这个资源加锁 把这个资源锁定 其他线程不能对

随机推荐

  • fetchxml 汇总_Microsoft Dynamics CRM 4.0 更新汇总2

    946745 You cannot import the customization for an entity to a new system in Microsoft Dynamics CRM BUG 5824 CRM SE 94776
  • wechall writeup

    记录做wechall的题解 转载于 https www cnblogs com babers p 7226535 html
  • python 解决print数组/矩阵无法完整输出的问题

    问题描述 当数组 矩阵过大则只会显示其中一部分 中间则会自动用省略号代替 而我们想要去查看数组 矩阵的具体内容时 则需要将省略号代替的部分展示出来 解决方法 直接在import numpy 加上下面一句代码即可解决 import numpy
  • 几个巧妙的电流检测电路

    在电源等设备中通常需要做电流检测或反馈 电流检测通常用串联采样电阻在通过放大器放大电阻上的电压的方法 如果要提高检测精度 这地方往往要用到比较 昂贵的仪表放大器 以为普通运放失调电压比较大 下面介绍几种巧妙的廉价的电流检测电路 1 三极管电
  • Window XP驱动开发(十六) XP下新建驱动程序工程并编译的第二种方法

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家提出意见 一起讨论 需要源码的可以与我联系 参考文章 http blog 163 com ljm1113 126 blog static 579
  • CButton & CMFCRibbonButton

    CButton public CWnd CMFCRibbonButton继承自CObject 不能添加消息映射
  • vmware虚拟机双网卡 实现本地内网和网络双连接

    一 vmware新建网卡 vmware中 编辑 gt 虚拟网络编辑器 gt 更改设置 网卡配置如下 桥接本地连接 NAT网卡连接网络 二 重启虚拟机 双网卡状态下 ifconfig可以看到有两个ip 可以同时ping通百度 远程公司内网 本
  • Windows系统安装Linux系统教程

    下载VMware workstation 安装地址如下 VMware下载地址 下载好了就是这个样子 我选择的是试用30天 大家也可以找破解版安装包 下载ubuntu ubuntu桌面版下载地址 下载桌面版就好 接下来是安装过程 每一步都有详
  • 如何使用apipost进行接口测试

    在之前的文档中对apipost导入api文档进行了介绍 本次将会给大家介绍一下如何使用apipost对之前导入的接口进行测试 接口测试的介绍 首先先对接口测试进行简单的介绍 接口测试是测试系统组件间接口的一种测试 主要用于测试系统与外部其他
  • Python计算机二级考试备考(重复元素判定)

    编写一个函数 输入参数为列表 如果一个元素在列表中出现了不止一次 这返回True 同时编写调用这个函数和输出测试结果的程序 def isRepeat x if type x type return print 输入错误 请输入列表类型 el
  • 有趣的数据结构算法10——后缀表达式(PRN)介绍及利用栈计算后缀表达式的结果

    有趣的数据结构算法10 后缀表达式 PRN 介绍及利用栈计算后缀表达式的结果 解题思路 实现代码 GITHUB下载连接 在前一天已经利用栈完成2进制到8进制的转换 但是栈的应用方面还有很多 本次我将讲解如何计算后缀表达式的结果 解题思路 后
  • 知识蒸馏-Yolov3

    本人实验 利用上篇的 Learning Efficient Convolutional Networks Through Network Slimming论文阅读笔记 方法 成功将算力8 5G的darknet21 yolo模型 9个类别 m
  • ETSI最新边缘原生白皮书

    ETSI 6月底发布了由 ETSI 多接入边缘计算小组 ISG MEC 成员撰写的关于 MEC 对边缘原生设计的支持 的新白皮书 本白皮书提供了有关边缘原生方法的概述和愿景 作为云原生的自然演变 它详细解释了 Edge Native 的概念
  • Kotlin中标准库函数(apply、let、run、with、also、takeIf、takeUnless)的使用详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到教程 一 apply函数 apply apply函数可以看作是一个配置函数 你可以传入一个接收者 然后调用一系列函数来配置它以便使用 如果提供
  • 【FFmpeg】ffmpeg+nginx-rtmp实现视频流转发

    1 应用场景 目前的摄像头厂家能提供出来的视频流格式有限 且chrome已经禁止了对flash的支持 导致像硬盘录像机这种只能提供rtsp格式流地址的摄像头无法接入Web应用 所以不得不对视频的流地址进行分发 通过代码对流地址中的数据进行切
  • yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测 并且可以估测出目标与本车之间的距离 一 视频展示 yolo车距1 订阅专栏获得源码 提供完整代码 无需看下文 二 单目测距原理 图中有一个车辆 且车辆在地面上 其接地点Q必定在地面上
  • JavaScript数据类型,包括原始类型和引用类型有哪些?

    问题 http bbs daxiangclass com thread 334 htm JavaScript数据类型 包括原始类型和引用类型有哪些 原始类型有五个 Number类型 专门保存数字的类型 可用于进行数学计算等的数值 Strin
  • HTTP2.0之我见

    概述 在讨论HTTP2 X 之前 先要搞清楚HTTP2 0的目的 HTTP 2 协议的主要目的是提高网页性能 以及 HTTP1 0 HTTP1 1 SPDY HTTPS之间的关系 参考 https cloud tencent com dev
  • 合批/批量渲染 (Batch)、实例化Instancing

    可以简单的理解为 批量渲染是通过减少CPU向GPU发送渲染命令 DrawCall 的次数 以及减少GPU切换渲染状态的次数 尽量让GPU一次多做一些事情 来提升逻辑线和渲染线的整体效率 但这是建立在GPU相对空闲 而CPU把更多的时间都耗费
  • 操作系统实验Ucore lab1

    lab1 前言 这是中山大学数据科学与计算机学院2019年操作系统实验中关于Ucore的项目以及实验报告 实验要求与Ucore手则有少量出入 所有源代码已经上传至github github个人主页 https starashzero git