操作系统原理与实践1

2023-05-16

文章目录

    • 1、熟悉实验环境
      • 实验环境的工作模式
      • 编译内核
      • 运行
      • 调试
        • (1)汇编级调试
        • (2)C 语言级调试
      • 文件交换

1、熟悉实验环境

1、Bochs 是一个免费且开放源代码的 IA-32(x86)架构 PC 机模拟器。

  • 因为 Bochs 的是模拟器,其原理决定了它的运行效率会低于虚拟机。
  • 但是,Bochs 有虚拟机无可比拟的调试操作系统的能力

2、GDB 调试器是 GCC 编译器的兄弟。做为自由软件领域几乎是唯一的调试器,它秉承了 Unix 类操作系统的一贯风格,采用纯命令行操作,有点儿类似 dos 下的 debug。

3、

tar -zxvf hit-oslab-linux-20110823.tar.gz \
 -C /home/shiyanlou/

4、
运行后 bochs 会自动在它的虚拟软驱 A 和虚拟硬盘上各挂载一个镜像文件,软驱上挂载是 linux-0.11/Image,硬盘上挂载的是hdc-0.11.img

5、编译内核

cd ./linux-0.11/
make all
make -j 2
make clean && make all
./run  #启动Bochs
./dbg-asm #汇编级调试
 ./dbg-c      ./rungdb        #C语言级调试

5、文件交换

sudo ./mount-hdc  #启动挂载脚本
#之后,hdc 目录下就是和 0.11 内核一模一样的文件系统了,可以读写任何文件
sudo umount hdc   #卸载

实验环境的工作模式

在这里插入图片描述

  • Image 文件

oslab 工作在一个宿主操作系统之上,我们使用的 Linux,在宿主操作系统之上完成对 Linux 0.11 的开发、修改和编译之后,在 linux-0.11 目录下会生产一个名为 Image 的文件,它就是编译之后的目标文件。

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

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

  • bochs 目录

bochs 目录下是与 bochs 相关的执行文件、数据文件和配置文件。

  • run 脚本

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 文件

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 下编译,然后覆盖现有的二进制内核。

编译内核

“编译内核” 比 “编写内核” 要简单得多。

首先要进入 linux-0.11 目录,然后执行 make 命令:

cd ./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 && make all。make clean 是删除上一次编译生成的所有中间文件和目标文件,确保是在全新的状态下编译整个工程。

运行

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

# 注意是在上层目录
# 刚刚编译是在 oslab/linux-0.11/ 文件夹下
cd ~/oslab/

# 执行 run 脚本
./run

如果出现 Bochs 的窗口,里面显示 linux 的引导过程,最后停止在 [/usr/root/]#,表示运行成功,如下图所示。用 Bochs 启动 Linux 0.11 以后的样子
在这里插入图片描述

调试

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

(1)汇编级调试

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

# 确认在 oslab 目录下
cd ~/oslab/

# 运行脚本前确定已经关闭刚刚运行的 Bochs
./dbg-asm

汇编级调试的启动之后 Bochs 是黑屏,这是正常的。

可以用命令 help 来查看调试系统用的基本命令。更详细的信息请查阅 Bochs 使用手册。
在这里插入图片描述

(2)C 语言级调试

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

cd ~/oslab
./dbg-c

然后再打开一个终端窗口,执行:

cd ~/oslab
./rungdb

注意:启动的顺序不能交换,否则 gdb 无法连接。

出现下图所示的提示,才说明连接成功:
在这里插入图片描述
新终端窗口中运行的是 GDB 调试器。关于 gdb 调试器请查阅 GDB 使用手册。

文件交换

接下来讲解一下 Ubuntu 和 Linux 0.11 之间的文件交换如何启动。

开始设置文件交换之前,务必关闭所有的 Bochs 进程。

oslab 下的 hdc-0.11-new.img 是 0.11 内核启动后的根文件系统镜像文件,相当于在 bochs 虚拟机里装载的硬盘。在 Ubuntu 上访问其内容的方法是:

cd ~/oslab/

# 启动挂载脚本
sudo ./mount-hdc

大家使用 sudo 时,password 是 shiyanlou,也有可能不会提示输入密码。

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

# 进入挂载到 Ubuntu 上的目录
cd ~/oslab/hdc

# 查看内容
ls -al

读写完毕,不要忘了卸载这个文件系统:

cd ~/oslab/

# 卸载
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,使用起来非常不便。
上图 用 Ubuntu 和 Linux 0.11 完成文件交换以后再启动 Linux 0.11 以后
上图为: 用 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。

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

操作系统原理与实践1 的相关文章

  • LED驱动电路的分析

    文章目录 一 方案一 1 电路工作原理 2 组件选择 3 个人分析 二 方案二 在方案一的基础上改进 1 电路工作原理 2 个人分析 三 方案三 在方案一的基础上改进 1 电路工作原理 2 个人分析 参考连接 常见驱动电路的分析 一 方案一
  • linux基础操作之二

    文章目录 6 文件解压与打包1 概念讲解2 实战1 zip 压缩打包程序2 使用 unzip 命令解压缩 zip 文件3 tar 打包工具4 总结 7 文件系统操作与磁盘管理1 查看磁盘和目录的容量2 dd 命令简介3 使用 dd 命令创建
  • mmap的使用

    参考资料 mmap 函数 xff1a 原理与使用 含代码 mmap函数使用与实例详解 Linux系统编程 xff1a mmap使用技巧 mmap和普通文件读写的区别和比较 amp mmap的注意点 认真分析mmap xff1a 是什么 为什
  • LED高效恒流驱动电源的设计指导书

    参考链接 LED高效恒流驱动电源的设计指导书 LED灯驱动电源设计 LED恒流驱动电路 精 LED恒流驱动电路 led灯驱动电源电路图 led灯的驱动原理电路图方案详解 KIA MOS管 一 LED驱动电源原理 1 由于LED的光特性通常都
  • 恒流源驱动电路 随笔一

    方案一 参考论文 LED光源驱动电路研究 华科 硕士 08 06 采用恒流源控制的原因 1 LED的PN结的温度系数为负 温度升高时LED的势垒电势降低 由于这个特点 所以LED不能直接用电压源供电 必须采用限流措施 否则LED随着工作时温
  • 恒流源驱动电路 随笔二

    参考论文 LED的驱动电路研究 大理 硕士 07 06 三个简单方案 电荷泵驱动的典型电路 CAT3604是一个工作在1x 1 5x分数模式下的电荷泵 可调节每只LED白光管脚 xff08 共4只LED管脚 xff09 的电流 使背光的亮度
  • gcc编译c文件常用命令参数解释

    gcc编译c文件 gcc是常用来编译c语言程序的编译器 xff0c 了解它编译c语言的命令参数 xff0c 对c c 43 43 语言的学习是有一定好处的 gcc编译文件一步到位的命令格式 gcc main c o main exe 设置了
  • 恒流源驱动电路 随笔三

    参考论文一 LED蓝绿光黄疸光疗系统的研究与设计 天工 硕士 15 12 AMC7150是一种仅需 xff15 个外部零件的高功率LED驱动IC AMC7150内建P xff37 xff2d 和功率晶体管 xff0c 工作频率可达200kH
  • 光源系统厂商、结构

    参考论文 基于PWM的LED机器视觉光源技术的研究 哈工大 硕士 span class token number 2009 span fpga 前言 机器视觉系统包括 xff1a 照明 镜头 相机 图像采集卡 视觉处理器 led光源分为两大
  • LED驱动IC厂家

    厂家芯片类别 世微半导体 英飞凌Infineon 壹芯半导体科技 xff08 深圳 xff09 有限公司 欧司朗OSRAM xff1a 汽车照明 深圳天微电子有限公司 中铭电子 深圳市华芯光电有限公司 宁波欧特电子科技有限公司 芯片介绍 l
  • 2D/3D模板匹配

    2D 对象 正交视图 物体的组成部分之间的角度和距离可以改变 xff0c 不需要缩放 需要缩放 存在遮挡 杂乱或颜色 物体的特征是具有特定的纹理 xff0c 而不是清晰可见的轮廓 图像高度散焦 对象变化显著 期望物体轮廓的局部变形 xff0
  • linux基础操作之三

    文章目录 10 命令执行顺序控制与管道命令执行顺序的控制1 顺序执行多条命令2 有选择的执行命令 管道3 1 试用3 2 cut 命令 xff0c 打印每一行的某一字段3 3 grep 命令 xff0c 在文本中或 stdin 中查找匹配字
  • 2020华为软挑总结——baseline

    span class token macro property span class token directive keyword include span span class token string lt bits stdc 43
  • 2020华为软挑总结——复赛方案一code

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • 2020华为软挑总结——方案二code

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • 机器视觉照明技术与装置实验研究(论文纪要)

    参考文献 机器视觉照明技术与装置实验研究 中原 硕士 2016 有用 摘要 图片质量很大程度上是由目标周围的照明环境和目标物体表面材质 物体摆放位置所决定的 1 首先 xff0c 对照明系统主要技术进行了研究 研究内容包括光源的参数与选择
  • Affine Transformations(仿射变换)

    英文版原文链接 先修教程 xff1a Remapping 重映射 下一教程 xff1a Histogram Equalization 直方图均衡化 文章目录 结果目标原理什么是仿射变换 我们如何得到一个仿射变换 代码这个程序是做什么的 代码
  • Linux 网桥功能使用

    Linux 网桥功能使用 网桥是在数据链路层 xff0c 将两个LAN连接起来 xff0c 根据MAC地质来转发帧 xff0c 可以看作是低层的路由器 安装网桥配置工具 检测系统中是否有有bridge 工具 xff1a rpm qa gre
  • Remapping(重映射)

    英文版原文链接 上一教程 xff1a Hough Circle Transform Hough圆变换 下一教程 xff1a Affine Transformations 仿射变换 文章目录 结果目标原理什么是重映射 xff1f 代码这个程序

随机推荐

  • 机器视觉(Robot Vision)——1

    参考书籍 Robot Vision MIT机器视觉课程指定教材 机器视觉探究两个基本问题 xff1a 成像过程的基本原理是什么 xff1f 如何探索对成像过程 求逆 的基本知识和方法 所谓 求逆 xff1a 具体来说 xff0c 就是从一张
  • 机器视觉实验架套装选型

    文章目录 0 机器视觉集成商0 1 上海热驰自动化1 海康威视2 集云誉创3 深圳新次元4 机器视觉光源控制器厂5 恒视科技6 小厂商6 机器视觉检测配套商 0 机器视觉集成商 购买链接 基础款 xff1a 580 970 加强款 xff1
  • meiqua / shape_based_matching(issue记录)

    文章目录 readmeissue 1 如何加快responsemap的创建 issue 2 请问一下是否抗缩放呢 xff1f issue 3 匹配准确定位精度还能再提高吗 xff1f branch有些多了 xff0c 能否写个文档介绍一下各
  • 机器视觉(Robot Vision)——2

    参考书籍 Robot Vision MIT机器视觉课程指定教材 机器视觉探究两个基本问题 xff1a 成像过程的基本原理是什么 xff1f 如何探索对成像过程 求逆 的基本知识和方法 所谓 求逆 xff1a 具体来说 xff0c 就是从一张
  • git同步远程仓库的所有分支

    方法一 span class token comment 找一个干净目录 xff0c 假设是clone span span class token function cd span clone span class token commen
  • linux基础操作之四

    文章目录 14 Linux下软件安装2 简介2 1 先体验一下2 2 apt 包管理工具介绍2 3 apt get2 4 安装软件包2 5 软件升级2 6 卸载软件2 7 软件搜索 3 使用 dpkg3 1 dpkg 介绍3 2 使用 dp
  • FPGA开发板选型

    1 Micro Phase微相官方旗舰店 淘宝链接 1 小熊猫嵌入式电子 淘宝链接 2 正点原子 淘宝链接 3 黑金ALINX 淘宝链接
  • 红黑树原理

    文章目录 参考链接红黑树简介RB Tree的五条基本性质RB Tree的基本操作增情景1 xff1a 红黑树为空树情景2 xff1a 插入结点的Key已存在情景3 xff1a 插入结点的父结点为黑结点情景4 xff1a 插入结点的父结点为红
  • B+tree原理

    文章目录 参考链接B 43 树B树B 43 树与B树的对比B 43 树的插入与分裂 之 删除与合并插入与分裂删除与合并示例 参考链接 B 43 tree详解及实现 C语言 B tree详解及实现 C语言 印度老哥视频讲解 xff1a 彻底理
  • ubuntu 20.04设置开机自启动脚本

    ubuntu16 04 以后的版本不再使用initd管理系统 xff0c 因此不再支持 update rc d 方式添加开机自启脚本 Ubuntu18 版本开始 xff0c 使用了systemd 替代了 initd 管理系统 xff0c 并
  • 核心功能(core 模块)

    英文版原文链接 您将了解这个库的基本构建块 为了理解如何在像素级上操作图像 xff0c 必须阅读 Mat 基本的图像容器 您将了解如何在内存中存储图片 xff0c 以及如何将其内容打印到控制台 如何扫描图像 xff0c 查找表 和 用Ope
  • Mat——基本的图像容器

    英文版原文链接 文章目录 目标Mat存储方法显式创建一个Mat对象格式化输出其他常用项的输出 目标 我们有多种方法从现实世界获取数字图像 数码相机 扫描仪 计算机断层扫描和磁共振成像等等 在以上任何情况下 xff0c 我们 人类 看到的都是
  • TCP/IP 网络协议基础入门

    文章目录 1 TCP IP简介IP 地址域名MAC 地址端口号封装和分用 2 链路层介绍控制帧的传输差错控制反馈重发计时器序号流量控制 以太网PPP xff08 点对点协议 xff09 SLIP 与 PPPSLIP 协议PPP 协议 MTU
  • 一些致力于底层图像处理算法的大神

    只 挚 爱图像处理 SSE图像算法优化系列九 xff1a 灵活运用SIMD指令16倍提升Sobel边缘检测的速度
  • 网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    详解网络传输中的三张表 xff0c MAC地址表 ARP缓存表以及路由表MAC地址表 ARP缓存表以及路由表MAC地址表 ARP缓存表 路由表及交换机 路由器基本原理
  • malloc 函数详解

    malloc详细malloc 函数详解malloc 函数详解 原文
  • 内存对齐示例及详解

    示例 什么是内存对齐 xff1f 为什么要内存对齐 xff1f 内存对齐的规则以及作用 详解 为什么要内存对齐 Data alignment Straighten up and fly right关于内存对齐 转 内存对齐
  • MySQL 基础课程

    文章目录 1 SQL 介绍及 MySQL 安装相关概念MySQL安装1 安装之前的检查2 Ubuntu Linux 安装配置 MySQL3 尝试 MySQL 2 创建数据库并插入数据1 新建数据库2 连接数据库3 数据表4 新建数据表5 数
  • Redis 简明教程

    1 Redis 安装介绍 2 Redis 数据类型 3 Redis 系统管理 4 Redis 高级应用
  • 操作系统原理与实践1

    文章目录 1 熟悉实验环境实验环境的工作模式编译内核运行调试 xff08 1 xff09 汇编级调试 xff08 2 xff09 C 语言级调试 文件交换 1 熟悉实验环境 1 Bochs 是一个免费且开放源代码的 IA 32 xff08