资讯专栏INFORMATION COLUMN

【操作系统学习】一、熟悉实验环境实验报告

OBKoro1 / 1833人阅读

摘要:本门课的基本流程实验的基本流程是根据实验要求编写应用程序修改的源代码,用编译后,在的虚拟环境中运行调试目标代码。目录下是全部的源代码,很多实验内容都是要靠修改这些代码来完成。

本门课的基本流程

实验的基本流程是根据实验要求编写应用程序、修改Linux 0.11的源代码,用gcc编译后,在Bochs的虚拟环境中运行、调试目标代码。

实验的基本工具及介绍(部分谷歌)

X86模拟器Bochs:

Bochs是一个免费且开放源代码的IA-32(x86)架构PC机模拟器,注意是PC机模拟器,故他可以模拟硬件配置,同时可以模拟整个pc的I/O设备、内存和BIOS。不光可以运行linux,还可以模拟运行DOS和各种版本的Windows等多种操作系统。

特点
*很高的可移植性:所以本门课选用它
*运行效率低于虚拟机:由其原理决定,但在本实验不会太明显。
*相比于虚拟机:有着强大的无法比拟的调试操作系统的能力

【注】本实验的hit-oslab已经内置了bochs

GCC编译器

编译器:

是一种计算机程序,它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言) 一个现代编译器的主要工作流程如下: 源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标代码(object code)→ 链接器(Linker)→ 可执行文件(executables), 最后打包好的文件就可以给电脑去判读运行了。

本门课程采用的GCC编译器,GCC是和Linux一起成长起来的编译器。Linux最初的版本就是由GCC编译的。现在GCC也是在自由软件领域应用最广泛的编译器。所以,我们也选择GCC做为本书实验的指定编译器。

DB调试器

调试器的基本功能
1、控制软件运行
调试器的最基本功能就是将一个飞速运行的程序中断下来,并且使其按照用户的意愿执行。调试器是靠迫使目标程序触发一个精心构造的异常来完成这些工作的。
2、查看软件运行中信息
查看软件的当前信息,这些信息包含但不限于当前线程的寄存器信息,堆栈信息、内存信息、当前EIP附近的反汇编信息等。
3、修改软件执行流程
修改内存信息、反汇编信息、堆栈信息、寄存器信息等等。

GDB调试器是GCC编译器的兄弟。做为自由软件领域几乎是唯一的调试器,它秉承了*nix类操作系统的一贯风格,采用纯命令行操作,有点儿类似dos下的debug。关于它的使用方法请看GDB使用手册。

Ubuntu (GNU/Linux)

Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,支持x86、amd64(即x64)和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造的

主要特点是易用,非常的易用。

实验室的工作模式

hit-oslab实验环境简称oslab,是一个压缩文件(hit-oslab-linux-20110823.tar.gz)。

首先找到压缩文件 并在终端转换至该文件夹 用tar zxvf hit-oslab-linux-20110823.tar.gz
命令解压即可工作

解压的目录如图:

oslab的工作原理

oslab工作在一个宿主操作系统之上,在这个宿主系统之上完成对Linux的开发、编译、修改之后,会在linux-0.11文件夹下生成一个名为Image的文件。(参照上图理解)这个就是编译后的目标文件。

这个文件包含引导和所有内核的二进制代码。如果拿来一张软盘,从他的0磁道0扇区开始,逐字节写入Image的文件,它就可以用这张软盘启动一台真正的计算机!

oslab采用的是bochs模拟器来加载这个Image文件,模拟执行Linux 0.11,这样就省却了重新启动计算机的麻烦!

解压文件后我们看到bochs目录,此目录就是与bochs相关的执行文件、数据文件和配置文件。使用run命令运行bochs后,会创建两个,一个是虚拟硬盘,一个是虚拟软驱A,在软驱软驱关在的是刚才说的Image文件,而在硬盘上挂载的是hdc-0.11.img。因为是从软驱A启动,所以Linux0.11会被自动加载,

而Linux 0.11会驱动硬盘,并mount硬盘上的文件系统,也就是将hdc-0.11.img内镜像的文件系统挂载到0.11系统内的根目录——“/”。在0.11下访问文件系统,访问的就是hdc-0.11.img文件内虚拟的文件系统。

hdc-0.11.img文件的格式是Minix文件系统的镜像。Linux所有版本都支持这种格式的文件系统,所以可以直接在宿主Linux上通过mount命令访问此文件内的文件,达到宿主系统和bochs内运行的Linux 0.11之间交换文件的效果。Windows下目前没有(或者是还没发现)直接访问Minix文件系统的办法,所以要借助于fdb.img,这是一个1.44M软盘的镜像文件,内部是FAT12文件系统。将它挂载到bochs的软驱B,就可以在0.11中访问它。而通过filedisk或者WinImage,可以在Windows下访问它内部的文件。

hdc-0.11.img内包含有:

Bash shell
一些基本的Linux命令、工具,比如cp、rm、mv、tar。
vi编辑器
gcc 1.4编译器,可用来编译标准C程序
as86和ld86
Linux 0.11的源代码,可在0.11下编译,然后覆盖现有的二进制内核


使用方法

准备活动

cd ~/oslab

把当前目录切换到oslab下,用pwd命令确认,用“ls -l”列目录内容。本实验的所有内容都在本目录或其下级目录内完成。

编译内核

“编译内核”比“编写内核”要简单得多。首先要进入linux-0.11目录,然后执行:

$ make all

因为“all”是最常用的参数,所以可以省略,只用“make”,效果一样。

在多处理器的系统上,可以用-j参数进行并行编译,加快速度。例如双CPU的系统可以:

$ make -j 2

make命令会显示很多很多很多的信息,你可以尽量去看懂,也可以装作没看见。只要最后几行中没有“error”就说明编译成功。最后生成的目标文件是一个软盘镜像文件——linux-0.11/Image。如果将此镜像文件写到一张1.44MB的软盘上,就可以启动一台真正的计算机。

linux-0.11目录下是全部的源代码,很多实验内容都是要靠修改这些代码来完成。修改后需要重新编译内核,还是执行命令:

$ make all

make命令会自动跳过未被修改的文件,链接时直接使用上次编译生成的目标文件,从而节约编译时间。但如果重新编译后,你的修改貌似没有生效,可以试试先“make clean”,再“make all”“make clean”是删除上一次编译生成的所有中间文件和目标文件,确保是在全新的状态下编译整个工程。

运行和调试

在Bochs中运行最新编译好的内核很简单,在oslab目录下执行:

$ ./run

如果出现Bochs的窗口,里面显示linux的引导过程,最后停止在“[/usr/root/]#”,表示运行成功。

内核调试分为两种模式:汇编级调试和C语言级调试。

汇编级调试需要执行命令:

$ ./dbg-asm

可以用命令help来查看调试系统用的基本命令。更详细的信息请查阅Bochs使用手册。

C语言级调试稍微复杂一些。首先执行如下命令:

$ ./dbg-c

然后再打开一个终端窗口,进入oslab目录后,执行:

$ ./rungdb

新终端窗口中运行的是GDB调试器。关于gdb调试器请查阅GDB使用手册。

Ubuntu和Linux 0.11之间的文件交换
oslab下的hdc-0.11-new.img是0.11内核启动后的根文件系统镜像文件,相当于在bochs虚拟机里装载的硬盘。在Ubuntu上访问其内容的方法是(大家使用sudo时,password是shiyanlou):

1.使用$ sudo ./mount-hdc,将linux 0.11文件系统挂载到hdc目录下
2.hdc目录就是和linux 0.11内核一模一样的文件
3.然后就可以直接在hdc目录下操作了, 比如可以在hdc目录下新建一个hello.c
$ sudo umount hdc

经过sudo ./mount-hdc这样处理以后,我们可以在Ubuntu的hdc目录下创建一个xxx.c文件,然后利用Ubuntu上的编辑工具(如gedit等)实现对xxx.c文件的编辑工作,在编辑保存以后。执行sudo umount hdc后,再进入Linux 0.11(即run启动bochs以后)就会看到这个xxx.c(即如下图所示),这样就避免了在Linux 0.11上进行编辑xxx.c的麻烦,因为Linux 0.11作为一个很小的操作系统,其上的编辑工具只有vi,使用起来非常不便。

另外在Linux 0.11上产生的文件,如后面实验中产生的process.log文件,可以按这种方式”拿到“Ubuntu下用python程序进行处理,当然这个python程序在Linux 0.11上显然是不好使的,因为Linux 0.11上搭建不了python解释环境。

【注】:不要在0.11内核运行的时候mount镜像文件,否则可能会损坏文件系统。同理,也不要在已经mount的时候运行0.11内核。

【注】:在关闭Bochs之前,需要先在0.11的命令行运行“sync”,确保所有缓存数据都存盘后,再关闭Bochs。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10501.html

相关文章

  • 初学者怎么选择神经网络环境?对比MATLAB、Torch和TensorFlow

    摘要:本报告面向的读者是想要进入机器学习领域的学生和正在寻找新框架的专家。其输入需要重塑为包含个元素的一维向量以满足神经网络。卷积神经网络目前代表着用于图像分类任务的较先进算法,并构成了深度学习中的主要架构。 初学者在学习神经网络的时候往往会有不知道从何处入手的困难,甚至可能不知道选择什么工具入手才合适。近日,来自意大利的四位研究者发布了一篇题为《神经网络初学者:在 MATLAB、Torch 和 ...

    yunhao 评论0 收藏0
  • 数据结构--顺序表的c语言实现(超详细注释/实验报告

    摘要:数据结构顺序表的语言实现超详细注释实验报告知识小回顾线性表是一种最基本最常用的数据结构,它有两种存储结构顺序表和链表。顺序表是由地址连续的的向量实现的,便于实现随机访问。 ...

    Fourierr 评论0 收藏0
  • 神经进化是深度学习的未来

    摘要:摘要本文主要讲了神经进化是深度学习的未来,以及如何用进化计算方法优化深度学习。揭示了神经进化的突破性研究深度学习的大部分取决于网络的规模和复杂性。在这三个例子中,使用神经进化成功地超越了最先进的基准。 摘要: 本文主要讲了神经进化是深度学习的未来,以及如何用进化计算方法(EC)优化深度学习(DL)。 过去几年时间里,我们有一个完整的团队致力于人工智能研究和实验。该团队专注于开发新的进化...

    zebrayoung 评论0 收藏0
  • 神经进化是深度学习的未来

    摘要:摘要本文主要讲了神经进化是深度学习的未来,以及如何用进化计算方法优化深度学习。揭示了神经进化的突破性研究深度学习的大部分取决于网络的规模和复杂性。在这三个例子中,使用神经进化成功地超越了最先进的基准。 摘要: 本文主要讲了神经进化是深度学习的未来,以及如何用进化计算方法(EC)优化深度学习(DL)。 过去几年时间里,我们有一个完整的团队致力于人工智能研究和实验。该团队专注于开发新的进化...

    dunizb 评论0 收藏0
  • 神经进化是深度学习的未来

    摘要:摘要本文主要讲了神经进化是深度学习的未来,以及如何用进化计算方法优化深度学习。揭示了神经进化的突破性研究深度学习的大部分取决于网络的规模和复杂性。在这三个例子中,使用神经进化成功地超越了最先进的基准。 摘要: 本文主要讲了神经进化是深度学习的未来,以及如何用进化计算方法(EC)优化深度学习(DL)。 过去几年时间里,我们有一个完整的团队致力于人工智能研究和实验。该团队专注于开发新的进化...

    VishKozus 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<