技术标签: Ubuntu ubuntu 操作系统 bochs GeekOS
请注意:博主仅测试在Ubuntu18和Ubuntu20上成功安装Bochs-2.6.9、nasm-2.08.02、geekos-0.3.0,其它版本可能会出现不兼容的情况。若安装调试过程中出现各种奇奇怪怪的错误,请百度报错信息,或给我留言。博主也是在多次失败的情况下,总结各位大佬的解决方案,才成功的。
安装过程就不多介绍了,放个Ubuntu的种子,需要的自行下载
magnet:?xt=urn:btih:286D2E5B4F8369855328336AC1263AE02A7A60D5&dn=ubuntu-18.04.4-desktop-amd64.iso
magnet:?xt=urn:btih:9FC20B9E98EA98B4A35E6223041A5EF94EA27809&dn=ubuntu-20.04-desktop-amd64.iso&xl=2715254784
Ubuntu20安装成功如下图
安装Bochs之前需要联网安装下面这些软件:
sudo apt-get install build-essential
sudo apt-get install xorg-dev
sudo apt-get install bison
sudo apt-get install libgtk2.0-dev
sudo apt-get install gcc-multilib
下载安装速度可能较慢,需要点耐心,如果下载中出现失败,用手机开个热点给电脑试下
下载Bochs2.6.9
进入链接: 下载地址.
找到bochs-2.6.9.tar.gz并下载保存
解压bochs-2.6.9.tar.gz
可以直接鼠标右键选择“提取到此处”
安装Bochs
进入bochs-2.6.9目录
在终端输入下列命令
sudo ./configure --enable-debugger --enable-disasm
sudo make
sudo make install
启动Bochs
直接在终端输入bochs启动,这里可能会报错,不用着急,百度可以解决。
若没有报错,则会出现Bochs的菜单
但是建议选项为[2],没有找到配置文件
配置Bochs
当我们在终端输入bochs后,
Bochs会自己在当前目录顺序寻找以下文件作为默认配置文件:
.bochsrc
bochsrc
bochsrc.txt
bochsrc.bxrc(仅对Windows有效)
我们可以自己创建一个名为.bochsrc的文件,来指定Bochs配置我们想要的虚拟机
(请将.bochsrc文件放在 geekos-0.3.0/src/project0/build 目录下。没有geekos?请看第4步!在此目录下会有一个自带的.bochsrc文件,但它是隐藏文件)
在终端输入
sudo gedit .bochsrc
粘贴以下内容(注意这里要确保romimage和vgaromimage这两项的路径是正确的,不然虚拟机启动时会提示“couldn’t open ROM image file”的错误,还有Bochs的版本不一样的话,键盘设置的方式也不太一样):
#################################################################
# Bochs的配置文件
# Configuration file for Bochs
#################################################################
# how much memory the emulated machine will have
megs: 32
# filenameof ROM images
romimage:file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage:file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# which disk image will be used 这个是启动软盘
floppya:1_44=fd.img, status=inserted
# choose the boot disk 确定启动方式
boot: floppy
# where do we send log messages?
log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping ,using US layout as default
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
保存退出
./configure
sudo make
sudo make install
再在终端输入nasm -version
出现2.08.02,OK继续!
进入目录 geekos-0.3.0/src/project0/build
终端输入
sudo make depend
sudo make
会报错,因为Makefile在make时将warnings全部视为了errors
于是我们打开当前目录下的Makefile
sudo gedit Makefile
找到第149行的-Werror:
CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror
修改为:
CC_GENERAL_OPTS := $(GENERAL_OPTS)
在Makefile文件的第148行 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) 后面添加编译选项:
(高版本的Ubuntu会有优化问题,导致project运行时线程报错,所以此处可以把-O改成-O0,取消优化)
-fno-stack-protector
然后把Makefile文件中的100行至109行修改为如下内容:
TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
# Host C compiler. This is used to compile programs to execute on
# the host platform, not the target (x86) platform. On x86/ELF
# systems, such as Linux and FreeBSD, it can generally be the same
# as the target C compiler.
HOST_CC := gcc -m32
# Target linker. GNU ld is probably to only one that will work.
TARGET_LD := $(TARGET_CC_PREFIX)ld -m elf_i386
然后输入命令:
sudo make clean
sudo make depend
sudo make
会出现
cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > fd.img
即为编译成功
注意:这里的fd.img是软盘文件,和.bochsrc文件相关,非常重要!如果启动Bochs出现黑色界面,但是有弹窗报错,多半和它有关。
进入目录 geekos-0.3.0/src/project0/build
终端输入:bochs
会出现Bochs菜单,且建议选项为[6]意思是开始模拟
输入"6"弹出黑色页面,然后再在命令行输入"c"
如果出现错误提示,可能是因为软盘映像中没有找到编译好的可执行程序,所以需要我们导入程序。
可以自己编写一段程序,也可以使用自带的示例程序,将编译好的引导扇区写进软盘。
Linux下自带了dd命令可以很方便地进行软盘读写:
sudo dd if=main.o of=fd.img bs=512 count=1 conv=notrunc
("main.o"是要写入软盘的程序文件,“fd.img"是目的软盘,可以用自己建的软盘"a.img”,也可以用自动生成的)
重新运行GeekOS,看到Bochs界面上出现的“Welcome to GeekOS!”,恭喜你成功了!
如果文章对你有用,点个赞再走吧,有问题的可以评论区讨论。
Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: Seconds Minutes Hours DayofMonth Month DayofWeek Year 或 Seconds Minutes Hours DayofMonth Month DayofWeek 每一个域可出现的字符如下:代码S
原理我们创建一个 Bus.js 文件,用来控制数据和注册事件的。Bus.js 里有一个 Bus 类eventList 是必须项,用来存放事件列表的。constructor 里除了 eventList 外,其他都是自定义数据,公共数据就是存在这里的。$on 方法用来注册事件。$emit 方法可以调用 $on 里的事件。$off 方法可以注销 eventList 里的事件。然后需要用到总线的组件,都导入 Bus.js ,就可以共同操作一份数据了。Bus.jsclass Bus {
sphinx原理先创建数据源。根据数据源创建索引,使用分词技术。php把查询的关键词给Sphinx服务器,Sphinx根据关键词查找到关键字在mysql表里面的记录的id.Sphinx把id返回给php查询端。php根据返回的id,查询mysql服务器。安装gcc和gcc-c++yum install gccyum install gcc-c++ libstdc++-devel...
structs校验框架 Struts2提供了功能强大的输入校验机制,通过Struts2内建的输入校验器,在应用程序中无需书写任何代码,即可完成大部分的校验功能,并可以同时完成客户端和服务器端的校验。 如果应用的输入校验规则特别,Struts2也允许通过重写validate方法来完成自定义校验,另外Struts2的开放性还允许开发者提供自定义的校验器。 Struts2中可以通过重写va...
Java中 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构。和普通的HashMap不一样,普通的HashMap元素存取的时间复杂度一般是O(1)的范围,而TreeMap内部对元素的操作复杂度为O(logn)。虽然在元素的存取方面TreeMap并不占优,但是它内部的元素都是排序的,当需要查找某些元素以及顺序输出元素的时候它能够带来比较理想的结果。可以说,TreeMap是
实例把字符串 "Hello world!" 中的字符 "WORLD"(不区分大小写)替换成 "Peter":<?phpecho str_ireplace("WORLD","Peter","Hello world!");?>运行实例 »定义和用法str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。该函数必须遵循下列规则:如果搜索的字符串是一个数组,那么它将返回一个数组。 如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
行地址12位,列地址8位,数据16位,片内有四个组。 那么这块芯片的容量大小是多少?怎么计算的?具体计算如下行地址12位,说明行数是2的12次方列地址8位,说明列数是2的8次方数据数就有2的20次方每个数据16位,就是2字节(B)所以是2的20次方字节,就是1MB2字节(B)*1MB=2MB片内有4组,所以总容量4*2MB=8MB
弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器,帮助用户打造可靠、安全、灵活、高效的应用环境,确保服务持久稳定运行,提升运维效率三年低至5折,多种配置可选了解详情区域和可用区||https://support.huaweicloud.com/productdesc-ecs/zh-cn_topic_0186645877.html...
一、四大域对象所对应的的对象域对象存取用法(Servlet存—>jsp取)request.getRequestDispatcher("/demo06.jsp").forward(request, response);...
相信不管是web前端还是后台的程序员,都讨厌网页水平方向出现滚动条。而要避免出现水平滚动条,计算宽度是必不可少的。而在设计过程中,设计师一般避免计算这个右侧滚动条的宽度。为了避免出现水平滚动条,而将宽度设为比具体分辨率少五六十像素的宽度。如YUI推荐的宽度750px对800*600的分辨率,950px或974px对1024*768的分辨率。一般认为:这个滚动条的宽度为20px,那窗口右侧...
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的最长路,就可以得到答案,可以DP;然而写着写着写不下去了,不会求向上最小值和最长路;于是看看TJ,原来要再记录一个次长路!然而写挫了,写不下去了...#include<...
Python 有两个内建的模块用于处理命令行参数: 一个是 getopt只能简单处理 命令行参数;另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。会自动帮你负责-h帮助选项。更高级的可以使用aegparse这个模块,argparse从python2.7开始被加入标准库. 后续版本都不在维护 optparse 了.Python command line parsinghttps://code.google.com/archiv