暑期项目是以于渊《ORANGES:一个操作系统的实现》为基础对其进行改进,博主和bug争斗很久终于勉强完成答辩,为了不让学弟学妹和我当初拿到任务时一样一头雾水,这里记录下我的项目完成过程。
详细代码见OS_project
一、准备工作
在主机上安装一个虚拟机
博主的电脑主机是windows系统,关于linux和windows两大系统的纷争在此不再赘述,所以,下载一个虚拟机以配置linux系统。
VMware
博主下载的VMware Workstation Pro,用着还算流畅,下载安装也很简单,直接百度搜一个就行,随便你想官网下载还是去华军软件园。实在不放心自己再搜一遍教程。
Ubuntu
这是一个类似于linux的系统,要安装在你的虚拟机中,不要想着怎么在你主机上安装。
1.下载Ubuntu镜像文件
进入网址http://www.ubuntu.com/,点击Download,下载Ubuntu Desktop,记住你的下载路径。
2.建立Ubuntu系统
- 打开你的虚拟机(VMware),在主页点击“创建新的虚拟机”;
- 出现新建虚拟机向导框后点“下一步”“下一步”;
- 选择“稍后安装操作系统”后点“下一步”;
- 选择客户机操作系统“Linux”,版本“Ubuntu 64位”后点“下一步”;
- 选好安装位置后继续“下一步”;
- 一直“下一步”到选内存,直接“最大推荐内存”,如果内存太小会出现开机黑屏的现象;
- 网络方式先选“桥连”,后面如果出现虚拟机连不上网再看我后面的“异常处理”;
- 一直“下一步”,选择“创建新虚拟磁盘”;
- 选择“将虚拟磁盘存储为单个文件”,最大磁盘大小30GB、40GB都可;
- 后面保存路径自己选,最后点击“完成”。
3.安装Ubuntu系统
- 在VMware窗口中点击“编辑虚拟机设置”按钮,打开“虚拟机设置”对话框。
- 点击”CD\DVD(SATA)”项,然后在右侧窗口中选中“使用映像文件”并选中之前下载好的Ubuntu镜像文件,最后点击“确定”按钮。
- 回到VMware主窗口,点击“开启此虚拟机”按钮,进入系统安装界面。
- 等待系统启动,进入“欢迎界面”,选中“English”,并点击“install Ubuntu”按钮(也可以选择中文简体,但用英语的话后面敲代码方便);
- 选择安装Ubuntu时下载更新,选择第一个清除选项,继续,选择汉语,城市随便填,继续,设置用户名和密码,继续,完成,重启。
- 关于VMware Tools这个插件,主要是为了能显示全屏以及方便主机虚拟机之间文件交换,安装教程可参照Ubuntu VMware Tools安装
在Ubuntu中安装编译器
打开Ubuntu系统,鼠标右击中选择“在终端中打开”,然后依次输入下面的命令:
(初次使用sudo命令时会有显示要求输入密码,密码就是安装ubuntu系统时设置的用户密码,输入的时候密码不显示,不要慌,输完回车就行了)
sudo apt-get install build-essential
sudo apt-get install xorg-dev
sudo apt-get install bison
sudo apt-get install gcc
sudo apt-get install nasm
sudo apt-get install make
sudo apt-get install samba
sudo apt-get install bochs
把代码源文件夹放进Ubuntu系统
你想慢慢研究我不阻止,从chapter1开始研究当然是好的,我对你的钻研精神表示敬佩。但如果暑期项目时间短来不及把整个系统原理吃透,还是直接在chapter11的基础上开始改进吧。
把文件夹放进Ubuntu的方法很多,你可以安装了VMware Tools插件后直接从自己主机复制粘贴过来。要是你和我一样安装完还是没反应,那就可以先在主机上上传文件至github.com,再在虚拟机上clone下来。
*Ubuntu中克隆代码:
sudo apt-get install git
git clone https://github.com/…(你的代码托管地址).git
二、开始改进
我们打开源文件,可以看到相当多的文件夹和各种之前没碰过的文件,但是不要慌,改进内容基本上只需要你在kernel文件夹的main.c文件里进行改动。
你可以改进文件管理、进程管理、内存管理部分,也可以增加一些系统级小游戏,或者加两个开关机动画。
如果你想改一改别的,比如输入输出,那就把战场扩张到include文件夹和lib文件夹。不过目前你只需要动一动c文件或者h文件,不用考虑其他的。
怎么改进就不说了,这是你要做的,下面讲改完要做什么。
三、开始调试
- 在有Makefile文件的目录下,右击空白处选择“在终端中打开”,输入make all,回车,系统开始编译。根据终端显示结果你可以开始改自己写的bug了,改完再make all一次,如果显示没有错误就继续下面的操作。
- 补充一点,make all没有明显bug的最直观体现是该目录下会多出一个kernel.bin文件,如果没有这个文件那就继续debug吧。
- 依次输入一下命令:
dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notrunc
sudo mount -o loop a.img /mnt/
sudo cp -fv boot/loader.bin /mnt/
sudo cp -fv kernel.bin /mnt/
sudo umount /mnt
上面这些命令在Makefile文件的buildimg部分,但是于渊的版本不适用,你可以改成上面的,之后再编译就能直接去那儿复制。 - 上面都没问题了,就在终端输入bochs,回车,然后你会得到一个
Bochs is exiting with the following message:
[ ]bochsrc:34:‘keyboard_mapping’ is deprecated - use ‘keyboard’ option instead.
不要慌,这还是于渊那版本不适用的问题,点开bochsrc文件,找到最后一行,把keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map改成keyboard: keymap=/usr/share/bochs/keymaps/x11-pc-us.map - 继续在终端输入bochs,成功运行后会跳出来一个黑色页面,那就是你的模拟器,但它现在是黑屏。回到终端,输入c,回车,跑起来了,打开模拟器,它开始模拟你写的操作系统了。
四、异常处理
连不上网怎么办
连不上网,不能git clone,怎么办?下面是我用的两种解决办法,仅供参考。
- 一种情况是你内存设置得小,把网卡没了,那就关机(关虚拟机别关主机),在编辑虚拟机设置里面把内存尽可能调大(过大的话开机时会报错)。
- 还有一种可能是换了wifi就不行的网络连接问题,虚拟机关机后打开VMware的编辑-虚拟网络编辑器,点击左下角的还原默认设置,确定。再去编辑虚拟机设置里面,将网络适配器那块改成NAT模式。
虚拟机总打不开怎么办
打不开,黑屏,关又关不掉,急死个人。先把主机重启吧,内存已经卡爆了。
最初我是主机重启后,其他任何软件均不打开,不开QQ,不开网页,不开word,直接点开虚拟机,还能勉勉强强开机。
后来依旧免不了死机,所以干脆卸了重装一个版本。事实证明VMware Workstaion 15.0版本是真的垃圾。
不用担心重装后之前在Ubuntu里的所有文件都要重写一遍(以防万一你还是先搞个备份),只要你卸载VMware的时候没把装Ubuntu的文件一起删了,那你的新虚拟机上还是会有你原来的Ubuntu系统的。