从头写一个操作系统 08

in #esteem5 years ago (edited)

我们一直用qemu来装载.bin文件,模拟计算机启动的过程,qemu很好,后面我们会讲到如何用gdb调试qemu,只能用强大来形容。

喜欢折腾的人,永远都不会闲下来,就像用vmware将二进制文件作为启动盘,用qemu模拟树莓派的启动一样,对于学习来说是有意义的。
今天介绍另一个很好用的虚拟机:bochs。

bochs完全用软件模拟了整个X86计算机的硬件逻辑,然后在其虚拟的硬件上插入虚拟的软盘,砰,系统就启动了。这世界本身就是信息,无论是真实的,还是虚拟的,只要对外输出一样的数据,我们是无法感知它们的区别,就像阿里云,我们以为在使用一台独立的主机,但实际上是一个服务器中小小的vamwar虚拟机。

扯远了,bochs比vmware虚拟得彻底的多,vmware总是希望让能在cpu上跑的指令就在cpu上跑,bochs完全不依赖硬件,cpu在其上不过是一个不断轮询、等待信息的函数。bochs与真实机器几乎没有区别,整个模拟过程接近于现实,当然qemu也是同样的原理。

用bochs的原因依然是集思广益,由于bochs专业性,debug的选项与gdb调试qemu是有些区别的,到底哪个好现在没有客观的评价,所以最好都会用,遇到问题多一个分析角度。

下面是介绍bochs在ubuntu18上的安装步骤,fedora28也测试过,需要下载库的名字与ubuntu上稍有区别:

1.下载bochs:

https://sourceforge.net/projects/bochs/files/bochs/2.6.9/bochs-2.6.9.tar.gz/download

2.解压

tar vxzf bochs-2.6.9.tar.gz

3.运行configure脚本

简书上有个大神的帖子里有 建议[1] :
注意:其中--prefix是安装地址

cd bochs-2.6.9

./configure --prefix=/home/happy/Documents/bochs --enable-debugger --enable-disasm --enable-iodebug --enable-x86-debugger --with-x --with-x11

也可以简单的:
```bash
cd bochs-2.6.9
./configure --enable-debugger --enable-disasm  

4.make

make
sudo make install

最后,建立软链接:

cd /bin 
ln -s ~/bochs.2.6.9/bochs /bin/bochs 
ln -s ~/bochs.2.6.9/bximage /bin/bximage

错误排查:

1.出现 找不到X11/Xlib.h 错误:x11/xlib.h no such file or directory
ubuntu:

sudo apt-get install libx11-dev 

fedora:

sudo dnf install libX*

如果未解决,执行下面指令再试:

make dist-clean
./configure --enbale-debugger --enable-disasm
make
make install

使用bochs的方法:

1.创建硬盘镜像 1->hd -> enter->enter...

bximage

2.nasm编译bin文件

nasm boot.asm -o boot.bin

3.dd写入镜像文件

dd if=boot.bin of=c.img bs=512 count=1 conv=notrunc

4.修改bochsrc.txt[2](链接指向官方img范例,是个压缩包,其中的配置文件既是本bochsrc.txt的原版文件,本人略作了修改)。
bochsrc.txt其实只是bochs启动时默认查找的配置文件,官方有详细的文档 ,这里要谢谢@cn-stem的细心提醒,推荐大家都加入cn-stem标签,能够让文章更加规范哦。
如果按照上面的步骤,使用下面的bochsrc.txt即可:

###############################################################
# bochsrc.txt file for DLX Linux disk image.
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

# what disk images will be used 
floppya: 1_44=floppya.img, status=inserted
floppyb: 1_44=floppyb.img, status=inserted

# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="c.img", cylinders=306, heads=4, spt=17
ata0-master: type=disk, path="c.img", mode=flat
# choose the boot disk.
boot: c

# default config interface is textconfig.
#config_interface: textconfig
#config_interface: wx

#display_library: x
# other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga

# where do we send log messages?
log: bochsout.txt

# disable the mouse, since DLX is text only
mouse: enabled=0

# set up IPS value and clock sync
cpu: ips=15000000
clock: sync=both

# enable key mapping, using US layout as default.
#
# NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows.
# However, the key mapping tables are used in the paste function, so 
# in the DLX Linux example I'm enabling keyboard_mapping so that paste 
# will work.  Cut&Paste is currently implemented on win32 and X windows only.

keyboard: keymap=$BXSHARE/keymaps/x11-pc-us.map
#keyboard: keymap=$BXSHARE/keymaps/x11-pc-fr.map
#keyboard: keymap=$BXSHARE/keymaps/x11-pc-de.map
#keyboard: keymap=$BXSHARE/keymaps/x11-pc-es.map

5.启动bochs,如果c.img文件没有问题,弹出的bochs窗口中选择6,然后bochs停在黑屏状态,在shell中输入c即可运行系统


  1. https://www.jianshu.com/p/6b3df43932c3

  2. 官方的镜像范例在:http://bochs.sourceforge.net/guestos/dlxlinux4.tar.gz

Sort:  

欢迎向cn-stem投稿 :)

存在如下问题,请给予修复:

  1. 请添加图片的作者、来源、版权等信息。关于图片的版权使用,请参考文档:https://steemit.com/steemstem/@steemstem/guidelines-on-copyright-standards-in-steemstem
  2. 对于使用的代码,如为开源,请提供开源代码的地址、版权等信息。本文的部分代码与此文过于相似:https://www.jianshu.com/p/f4cd1fbfb109
  3. 对于本文写作时引用的资料、代码等,须在文末添加参考资料,对于引用的部分文字用markdown的引用格式注明

谢谢,已修改如下:
1.图片是截屏,已删除。
2.已获得https://www.jianshu.com/p/f4cd1fbfb109的源码授权。
3.引用已注明

谢谢修改:

关于 https://www.jianshu.com/p/f4cd1fbfb109 的源码授权,是指引用2中的链接吗?该链接打不开(可能需要登录?)

最后一部分的boshsrc.txt文件,似乎也存在多种来源?(例如:(1)(2))是否可以确认该文件的内容是否开源、采用何种开源协议,并可以用于商用?

链接是有些问题,那个博客是我自己的,现在改好了,https://www.jianshu.com/p/b1f4c1419f88
bochsrc.txt只是一个配置文件,它本身也是bochs官网的范例中的配置,配置文件本来就都长一样,没有什么版权概念。它是个菜单,做一个菜每个人都会买这些原料,可是这个菜单本身就没有版权,我修改之后的也是没有版权的。

由于上面的博客是作者所有,有必要进一步说明此文件/代码的原始来源。换句话说,如果bochsrc.txt是作者本身创作的,需要给予说明(如作者的GitHub repo);如果借鉴了其他来源,也需要说明出处。如果主要参考了官方或他人的研究,可以将“bochs官网的范例中的配置”的原始文件/代码,以及相关说明也添加到文中(或本文的引用中),以便读者参考学习。

steemstem重视版权和引用的原因在于尊重每一个创作者的贡献。如果对于参考或者引用有明确的说明和解释,有利于读者追根溯源、促进讨论和引发深度思考,对于文章本身的价值也有所裨益。

谢谢,已经修改了。
但是我并不赞同配置文件的追根溯源:
bochs是个开源软件,我使用它就像使用linux一样,我不可能在每次提到linux的时候,就把linux kernel的网站地址贴出来。
配置sshd_config时,谁也不会知道config最初是谁写的。
文中的bochs是我修改过的,可我现在给出的链接是原来未修改过的,我不知道这样是否更好

关于版权的原则很简单:(1)如果该文本/代码为作者所创作,请说明为本人著作或采用开源方式提供;(2)如果是使用了他人的成果,或基于他人的成果修改,应明确注明原著作的相关信息。否则一旦发现其他相似内容,都存在版权疑问。

这背后的版权与尊重的精神,比法律上的意义更重要。

对于所有代码,如前所述,请明确提供“作者”、“开源协议”、“出处”等信息。也可以添加bochsrc的官方文档以方便读者学习(如
http://bochs.sourceforge.net/doc/docbook/user/bochsrc.html ),如果是作者修改过的文件也请说明为“修改”而非“原创”。上面的链接指向一个压缩包,不方便读者查看,请尽量提供作者写作时参考的配置文件、或其他更容易理解的说明。

任何一本严谨的关于Linux的出版物都会澄清其使用的版本、网址、演进过程、贡献者等信息。如果出版物中配置文件不是作者自己写的,在出版物的附录中也应该说明。开源软件的精神绝不是没有版权;其目的在于促进全人类知识的进步,而尊重是进步的前提。

您的意思我理解,我也理解尊重别人劳动成果的重要性。
只是如果非要在配置文件上争论让我觉得没有意义。
文中的配置文件修改于那个压缩包里的配置文件,与官方的文档没有直接关系,与文章也无直接关系,读者可以自行浏览官方文档,我也可以贴出链接,但与这个配置文件对应的链接无关。
如果只与教育目的相关,我无法在每一次修改配置文件时思考到这样的深度,在我眼里也没有必要。
如果您的点赞对我的要求是:文章中的配置文件需要链接原配置文件链接,并且如果是软件压缩包中的配置文件,则提供没有直接关系的官方文档,以利于读者查阅,如此要求,恕我冒昧使用您的标签。
最后,配置文件没有版权!我不链接官方文档,不违反道德也不违反法律,不是不尊重,也没有逃避责任。



This post has been voted on by the SteemSTEM curation team and voting trail. It is elligible for support from @curie.

If you appreciate the work we are doing, then consider supporting our witness stem.witness. Additional witness support to the curie witness would be appreciated as well.

For additional information please join us on the SteemSTEM discord and to get to know the rest of the community!

Please consider setting @steemstem as a beneficiary to your post to get a stronger support.

Please consider using the steemstem.io app to get a stronger support.

Coin Marketplace

STEEM 0.16
TRX 0.15
JST 0.028
BTC 57975.44
ETH 2289.64
USDT 1.00
SBD 2.46