哈工大李治军操作系统课程实验环境搭建
资源下载
首先,我们需要linux-0.11源码、bochs等。我把资源放在百度云盘里了。
链接: https://pan.baidu.com/s/1wtec1_UlBA1wxwNeMyFBOw 密码: 7j1l
另外,为了编译Linux0.11源码,我们需要GCC3.4编译器(只能在低版本编译器上编译Linux0.11)。还是在百度云盘里。
链接: https://pan.baidu.com/s/1475p2I1VgTjCna0_p6WMZA 密码: mjvk
安装GCC3.4
解压下载下来的GCC3.4,命令如下:
tar -zxvf gcc-3.4.tar.gz
然后进入解压以后的目录,命令如下:
cd gcc-3.4
然后使用ls命令可以看到有amd64和i386两个目录,其中amd64目录下存放的是64位操作系统安装gcc3.4的包,i386目录存放的是32位操作系统安装gcc3.4的包。我的Ubuntu是64位的(具体是Ubuntu Kylin 20.04版本),因此选择amd64目录下的包进行安装,使用如下命令:
cd amd64 #进入该目录
sudo dpkg -i *.deb #安装所有包
安装完成以后,可以输入如下的命令,查看是否安装成功。
gcc-3.4 -v
在32位操作系统上安装gcc3.4的命令也是一样的。
安装编译环境
bootsect.S 和 setup.S 是实模式下运行的 16位代码程序,采用近似于 Intel 的汇编语言语法,并且需要使用 8086 汇编编译器和连接器 as86 和 ld86。而 head.s 则使用一种 AT&T 的汇编语法格式,并且运行在保护模式下,需要用 GNU 的 as(gas)汇编器 进行编译。所以,我们需要安装as86、ld86。
搜索as86和ld86,命令如下:
apt-cache search as86 ld86
然后,安装bin86,命令如下:
sudo apt install bin86
由于是64位系统,还需要安装32位系统的兼容库,命令如下:
sudo apt install libc6-dev-i386
如果,你没有顺手的代码编辑器,这里强烈推荐使用Visual Studio Code。
编译Linux0.11源码
首先解压下载下来的hit-oslab-linux-20110823.tar.gz,命令如下:
tar -zxvf hit-oslab-linux-20110823.tar.gz
解压之后,得到如下的文件。
进入linux-0.11目录,编译源代码。使用如下命令
make all
编译之后,在oslab目录下运行run会出错,这是因为我们缺少一些东西,因此,安装它们。命令如下:
sudo apt install libsm6:i386
sudo apt install libx11-6:i386
sudo apt install libxpm4:i386
安装完上面的这些依赖库之后,输入命令./run,就会看到bochs加载Linux0.11成功,界面如下:
Ubuntu与Linux-0.11之间的文件交换
在oslab目录下,运行mount-hdc脚本,挂载linux0.11。挂载以后就可以在hdc目录下和Ubuntu进行文件交换。挂载以后可以在hdc目录下看到如下文件。
不要在0.11内核运行的时候mount镜像文件,否则可能会损坏文件系统。同理,也不要在已经mount的时候运行0.11内核;
在关闭Bochs之前,需要先在Linux-0.11的命令行运行“sync”,确保所有缓存数据都存盘后,再关闭Bochs。
卸载命令:umount hdc,卸载以后以上文件就没了。如下所示:
- 懒惰的力量
- 让AI自动修复程序中的bug:微软亚洲研究院新研究 | 附论文
- OpenDaylight与Mininet应用实战之OpenFlow1.0协议分析二
- Javascript: 世纪机器语言?
- OpenDaylight与Mininet应用实战之基本环境搭建一
- 永恒不变的魅力
- MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App
- OpenDaylight与Mininet应用实战之流表操作三
- 天啊,这个围笑代表什么?麻省理工的AI比你更懂 | 论文+Demo
- elixir:灵丹妙药?or 徒有其名?
- OpenDaylight与Mininet应用实战之三层转发机制四
- 程序员效率指南
- 【每日播报】OpenDaylight与Mininet应用实战之复杂网络验证(五)
- Docker hackathon, teamspark 及团队协作软件设计上的思考
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 低比特量化之DoreFa-Net理论与实践
- 不用数组求多个数的最小值
- 小程序 Tip | 文档、环境、开发工具界面与特性
- 大佬的思路就是不一样,这是我见过最简洁又清晰的SSM框架整合
- SQL Server重置自增的值为0
- 被经理邀请去“爬山”,只是因为我写错了一条SQL语句?
- Maven环境配置-必会
- Centos7中Docker安装RabbitMQ
- 又陷入知识盲区了,面试被问Redis事务,我差点脸都“绿”了
- Mybatis中#{}与${}的区别
- POI合并单元格
- Centos7.x安装Docker
- 实在是妙啊!Java中强软虚弱引用,居然还能这样去操作
- 数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决
- Swift 数组dropFirst方法