课程:https://mooc.study.163.com/learn/1000002004?tid=2402971010&_trace_c_p_k2_=f79694c7fc04429bb9be772b5aaa7cce#/learn/content?type=detail&id=2403308873&cid=2403327520

实验一:

主要平台和工具简介

x86模拟器Bochs

类VMWare的虚拟机

GCC编译器

编译器

GDB调试器

调试器

Ubuntu (GNU/Linux)

用来编译linux0.11的系统

实验环境的工作模式

oslab工作在ubuntu之上,在ubuntu上完成对Linux 0.11的开发、修改和编译之后,在linux-0.11目录下会生产一个名为Image的文件,它就是编译之后的目标文件。该文件内已经包含引导和所有内核的二进制代码。如果拿来一张软盘,从它的0扇区开始,逐字节写入Image文件的内容,就可以用这张软盘启动一台真正的计算机,并进入Linux 0.11内核。oslab采用bochs模拟器加载这个Image文件,模拟执行Linux 0.11。

run是运行bochs的脚本命令。运行后bochs会自动在它的虚拟软驱A和虚拟硬盘上各挂载一个镜像文件,软驱上挂载是linux-0.11/Image,硬盘上挂载的是hdc-0.11.img。因为bochs配置文件中的设置是从软驱A启动,所以Linux 0.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/]#”,表示运行成功,如下图所示。

图1 用Bochs启动Linux 0.11以后的样子

内核调试分为两种模式:汇编级调试和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):

$ sudo ./mount-hdc

之后,hdc目录下就是和0.11内核一模一样的文件系统了,可以读写任何文件(可能有些文件要用sudo才能访问)。读写完毕,不要忘了卸载这个文件系统:

$ 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,使用起来非常不便。

图2 用Ubuntu和Linux 0.11完成文件交换以后再启动Linux 0.11以后

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

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

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

实验报告:

实验步骤:

参考https://blog.csdn.net/JustJavaC2016/article/details/78944909

**在首页进入命令行,不要再应用程序菜单中进入,否则无法启动bochs**

cd /home/shiyanlou/oslab
tar hi.....
cd linux0.11
make all cd ..
sudo -i
cd ../home/shiyanlou/oslab/oslab
sudo ./mount hdc
cd hdc/usr/root
touch helloLinux.c
cd ../../..
sudo umount hdc

  

操作系统-chapter1的更多相关文章

  1. chapter1 渗透测试与metasploit

    网络对抗技术课程学习 chapter1 渗透测试与metasploit 一.读书笔记 二.渗透测试 通过模拟恶意攻击者的技术与方法进行攻击,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响 ...

  2. 《Linux内核设计与实现》CHAPTER1,2阅读梳理

    <Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...

  3. 《Linux内核分析》第二周:操作系统是如何工作的

    杨舒雯 20135324 北京电子科技学院 杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1 ...

  4. 操作系统篇-调用门与特权级(CPL、DPL和RPL)

    || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在前两篇文章(<操作系统篇-浅谈实模式与保护模式>和<操作系统篇-分段机制与GDT|LDT>)中,我们提到 ...

  5. 操作系统篇-分段机制与GDT|LDT

    || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的. ...

  6. 操作系统篇-hello world(免系统运行程序)

     || 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言     今天起开始分享关于操作系统的相关知识,本人也是菜鸟一个,正处于学习阶段,这整个操作系统篇也是我边学习边总结的一些结果,希 ...

  7. Linux实战教学笔记03:操作系统发展历程及系统版本选择

    标签(空格分隔): Linux实战教学笔记-陈思齐 第1章 Linux简介 1.1 什么是操作系统? 简单讲:操作系统就是一个人与计算机硬件的中介. 操作系统,英文名称Operating System ...

  8. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

  9. ucos实时操作系统学习笔记——任务间通信(队列)

    ucos操作系统中的queue机制同样使用了event机制来实现,其实和前面的sem,mutex实现类似,所不同的是对sem而言,任务想获得信号量,对mutex而言,任务想获得的是互斥锁.任务间通信的 ...

随机推荐

  1. AI新生代“教父”崛起,或成就迈向具有类人意识机器的一大步

    <麻省理工科技评论>公布了 2018 年全球十大突破性技术,“对抗性神经网络”即“生成对抗网络”作为突破性人工智能技术赫然上榜.这家全球最顶级科技杂志编辑部对这项革命性技术给出的评价是:它 ...

  2. 获取radio点击事件

    获取radio点击事件,不能用click(),而是用change(). $('input[name="options"]').change(function(){ console. ...

  3. Azure经典虚拟机(Windows)如何监测单个磁盘的使用空间

    Azure云平台创建经典虚拟机(Windows)后,发现仪表板的监测项下默认是没有针对磁盘空间进行检测的指标的 本地机器安装Windows Azure Powershell模块,并通过如下命令登陆并查 ...

  4. 《Mysql - 优化器是如何选择索引的?》

    一:概念 - 在 索引建立之后,一条语句可能会命中多个索引,这时,索引的选择,就会交由 优化器 来选择合适的索引. - 优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句. 二: ...

  5. Windows 下redis的安装和使用

    1.下载 Window 下载地址:https://github.com/MSOpenTech/redis/releases 查找版本对应的一个MSI或者zip文件下载 2.安装 MSI文件需要安装 z ...

  6. python多任务基础

    1.多任务:两个程序段同时运行2.为某个函数创建线程并启动: import threading 线程名 = threading.Thread(target = 函数名,args = 参数元组) #创建 ...

  7. 防止vi粘贴时自动添加缩进的方法

    使用Xshell连接Linux服务器,使用vi打开文件进行粘贴时,会自动在行首添加很多空格,导致格式错乱.可以用如下方法剞劂 在拷贝前输入:set paste (这样的话,vim就不会启动自动缩进,而 ...

  8. (六)springmvc之ModelAndView、Model、Map、ModelMap

    <a href="<%=request.getContextPath()%>/responseData/response_1">使用原生的作用域</a ...

  9. VS App_Code文件夹下的类文件不能直接被调用的解决方法

    如下图所示,新建的类不能直接使用,会显示报错,检查命名空间什么的,未果 通过百度搜索,发现这么一篇文章:https://blog.csdn.net/younghaiqing/article/detai ...

  10. java01_简介_开发环境

    JAVA的前世今生 美国SUN(Stanford University Network)公司,在中国大陆的正式中文名为"太阳计算机系统(中国)有限公司",在中国台湾的正式中文名为& ...