清华操作系统实验课程实验一:系统软件启动过程
ucore_lab1_练习一
(本示例中,如果输入行前面出现美元符号($),表示这是命令行提示符。紧接其后的是命令行,可以通过控制台输入命令)
理解通过make生成执行文件的过程
通过静态分析代码来了解:
- 操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
- 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
注:前面为一些基础知识,看题目答案可直接到:二、make生成过程分析 中的 第2点 和 第3点
一、预备知识
关于编译和链接:程序编译的过程
对于在没有汇编知识的时候有些不理解,所以写一下
类似于C、C++,有一个源文件,在Windows下也就是 .asm 文件。
编译过程首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link),也就是把==.obj== 文件进行链接。
关于gcc:
GCC 编译器是 Linux 下默认的 C/C++ 编译器,大部分 Linux 发行版中都是默认安装的。GCC 编译器通常以 Linux 命令的形式在终端(Shell)中使用,它有很多选项。
GCC 仅仅是一个编译器,没有界面,必须在命令行模式下使用。通过gcc命令就可以将源文件编译成可执行文件。
GCC 既可以一次性完成C语言源文件的编译,也可以分步骤完成。
(这里给出一些这次实验用到的gcc命令,更详细gcc教程参考:)
1. 在类 Unix 操作系统(Unix、Linux、Mac OS 等)中检测是否已经安装GCC编译器
$ gcc --version
如图“cc”也可以
2. gcc 命令
- gcc -c 命令:只编译不链接,仅生成目标文件
-c选项表示编译、汇编指定的源文件(也就是编译源文件),但是不进行链接。使用-c选项可以将每一个源文件编译成对应的目标文件。
目标文件是一种中间文件或者临时文件,如果不设置该选项,gcc 一般不会保留目标文件,可执行文件生成完成后就自动删除了。
例如:
$ gcc -c bootmain.c
编译bootmain.c源文件
- gcc -o命令:指定输出文件
它的用法为:
$ [infile] -o [outfile]
[infile] 表示输入文件(也即要处理的文件),它可以是源文件,也可以是汇编文件或者是目标文件;[outfile] 表示输出文件(也即处理的结果),它可以是预处理文件、目标文件、可执行文件等。
关于gdb
UNIX及UNIX-like下的调试工具。具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。
GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
关于Makefile
所要完成的Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
二、make生成过程分析
1、执行Makefile文件的方法
进入 Makefile 文件所在位置执行 make 命令
$ cd [文件位置]
1是文件位置,用清华的系统应该都是这个位置,
进入文件后用命令
$ ls
看到有Makefile文件,执行make命令
$ make
如果已经执行过make文件则会显示nothing to be啥啥啥,用以下命令清除之前make的执行结果:
$ make clean
然后看到 + cc 我觉得就是在调用gcc 编译器编译 .c 文件,然后执行结果生成一个名为 obj 的文件夹
然后执行命令:
$ man make
可以看到应该是关于make命令的使用手册
2、Makefile文件干了什么,如何一步一步生成本次实验问的镜像文件ucore.img
1、用make V=命令查看make命令的详细执行过程
$ make V=
然后显示makefile文件详细执行过程
其中:
1、
+cc kern/init/init.c
表示编译了 kern/init 文件中的 init.c 文件
-ggdb : 生成可供gdb使用的调试信息
-m32 :生成适用于32位环境的代码
-gstabs :生成stabs格式的调试信息
-nostdinc :不在标准系统文件夹寻找头文件,只在-I等参数指定的文件夹中搜索头文件
-fno-stack-protector :不生成用于检测缓冲区溢出的代码
-Os 为减小代码大小而进行优化
标黑的一段表示将 init.c 文件编译为输出文件 init.o 并放入 obj 文件夹中
之后的类似的+cc开头的代码均执行了这样一个过程
2、
这里的 .S 文件是经过预编译的汇编语言源代码文件
3、
ld 命令目标文件转化成可执行程序,这里转化成 bootblock.out,可以理解成一个Bootloader的执行程序
4、
dd 命令把Bootloader放到一个虚拟的硬盘里去,这里生成一个虚拟硬盘叫 uCore.img ,这个虚拟硬盘就会基于里面的数据来执行相应的代码
5、
这里生成两个软件,第一个是Bootloader,第二个是kernel,kernel是uCore的组成部分
3、被系统认为是符合规范的硬盘主引导扇区的特征
这里需要看一下一个文件:
在tools文件夹中的sign.c文件,这个文件中完成了特征的标记
查看sign.c文件内容:
按照这个文件的描述,需要检查以下几点:
输入的主引导扇区的记录必须是510字节以内(446+64)
输出的主引导扇区的最后两个字节是55AA
bootblock就是需要用到的主引导扇区
清华操作系统实验课程实验一:系统软件启动过程相关推荐
- 计算机组成原理节拍发生器实验报告,计算机组成原理微程序控制器组成实验课程实验报告书研讨.doc...
文档介绍: 学生课程实验报告书 13级计算机与信息科学系软件工程专业 130 3班学号 3138907308 姓名王明渊 2014 --2015 学年第2学期实验项目: 微程序控制器组成实验实验时间: ...
- 计算机组成原理时序发生器qd,计算机组成原理微程序控制器组成实验课程实验报告书...
学生课程实验报告书 13 级 计算机与信息科学 系 软件工程 专业 1303 班 学号 3138907308 姓名 王明渊 2014 --2015 学年 第 2 学期 另外它还产生节拍信号W1-W3的 ...
- 操作系统(一) BIOS/MBR 启动过程
无论是什么计算机或操作系统,标准("IBM 兼容")台式 PC 和笔记本电脑都使用以下两种方式之一开机和启动:传统的 BIOS-MBR 方法和较新的 UEFI-GPT 方法.本文总 ...
- linux系统shell讲解实验报告,《操作系统》课程实验报告 SHELL编程.doc
华南理工大学 <操作系统 SHELL编程 姓名: 余柳红 学号: 201330571011 班级: 13信息安全班 合作者: 无 指导教师: 贺小箭 实验概述[实验目的及要求] 实验目的: 熟悉 ...
- Linux内核分析实验3——分析linux内核启动过程
本文大量内容引用自孟宁老师在<LINUX操作系统分析>课程中的内容 <Linux内核分析>MOOC课程 http://www.xuetangx.com/courses/cour ...
- 杨月江计算机导论答案,计算机导论课程实验教学大纲-计算机学院-华北科技学院.doc...
计算机导论课程实验教学大纲-计算机学院-华北科技学院.doc 华 北 科 技 学 院 2010级 实验教学大纲 网络工程系 目 录 TOC \o "1-1" \h \z \u HY ...
- 大学计算机实验五实验六实验报告表,北京理工大学计算机实验六
北京理工大学计算机实验六Tag内容描述: 1.实验四实验报告表 实验名称 一条指令的执行过程 学号姓名 班级 实验时间 年月日 实验报告表 4 1 一条指令执行过程记录表 步骤 1 用户指定两个加数 ...
- 哈工大操作系统课程实验记录
哈工大操作系统课程实验记录 0-课程准备 课程视频地址: https://www.bilibili.com/video/BV1d4411v7u7 实验楼地址: https://www.shiyanlo ...
- 课程linux实验报告,Linux操作系统课程实验报告.doc
Linux操作系统课程实验报告.doc Linux操作系统课程实验报告班级姓名学号指导老师田丽华完成时间2014年7月目录一.实验目的1二.实验要求1三.实验内容1[第一题]1[第二题]2[第三题]4 ...
最新文章
- 转 使用 HttpClient 4 进行文件上传
- c语言 文件截断,c – 是否有一种正统的方法来避免编译器警告C4309 – “二进制文件输出的”常数值的截断“?...
- 前端学习(3062):vue+element今日头条管理-总页码处理
- pmp知识点详解-项目大牛整理_PMP核心知识点—第四章:项目整合管理(一)
- 一个简单51c语言程序,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
- Q91:真实地模拟透明材质(Realistic Transparency)(2)——Triangle Meshes
- java date 最小值_Java_Math/Date
- M3U8文件简介及在线播放器
- 谈谈Java的学习方法
- Intel系列CPU架构的发展史
- linux安装tomcat
- Markdwon语法讲解
- 解决Teamviewer密码总是在变的问题
- 安卓手机”应用未安装“解决办法
- 2020职高计算机录取分数线,四川邮电职校2020单招录取分数线
- Protege Tutorial
- 找回sonarqube管理员密码
- 英语思维导图绘制方法,内附图例
- Selective Search for Object Recognition论文翻译
- 神奇的Grails:自关联的树状Domain一行代码获取所有子节点
热门文章
- The Wiley Handbook of Human Computer Interaction翻译
- (附源码)计算机毕业设计SSM基于Java的小型电子病历系统
- Linux常用文本比对命令——diff
- 零基础Vlog教程!
- conda安装python3.5_解决 Raspbian Miniconda 无法安装最新 Python3.6
- 2021年广东省安全员A证(主要负责人)考试内容及广东省安全员A证(主要负责人)证考试
- 使用vite的社区模板来创建对应的项目(比如React17,vue+electron)
- Qt开发技术:Q3D图表开发笔记(三):Q3DSurface三维曲面图介绍、Demo以及代码详解
- frp实现内网穿透(花生壳也可以)
- 再见!Minagawa先生