在Ubuntu下基于QEMU运行XINU OS x86系统
2015-12-31 21:51
555 查看
标题有点绕, 其实主要是记录一下这两天折腾的一个结果, 主角是
XINU, 一个比较短小精悍的操作系统, 重点是, 这个操作系统是完整的, 可以在一些平台(包括x86虚拟机)上实际跑起来的一个操作系统, 具体可以看给的链接, 作者是Douglas Comer, 也就是<<TCP/IP网络互联技术>>那套书的作者, XINU 本身也对应有一本书, 写得很不错, 现在出到第2版了
之所以发这个帖子, 不是为了在这介绍 XINU 的前世今生, 而是要说 XINU 一个很有意思的地方, 即这个系统非常好折腾, 怎么个好折腾法呢, 只要你有一个 Linux 的开发环境(注1), 到
github 上抓一下代码, 做几个简单的调整, 就可以直接编译, 并通过 QEMU 运行了, 整个过程非常方便, 随时改, 随时运行, 所见即所得, 对于想折腾 OS 的朋友, 是个很不错的东西
以下记录调整的内容:
1. 解决编译器 undefined reference to __stack_chk_fail 报错
--- a/compile/Makefile
+++ b/compile/Makefile
@@ -24,7 +24,7 @@ TOPDIR := ..
# Set the C compilation flags common to all Embedded Xinu platforms.
# platformVars can add more flags if desired.
-CFLAGS :=
+CFLAGS := -fno-stack-protector
2. 修正 64 位环境下的链接问题
--- a/compile/platforms/x86/platformVars
+++ b/compile/platforms/x86/platformVars
@@ -10,6 +10,7 @@ PLATFORM_NAME := Intel x86
# Add flags to compile 32 bit code
CFLAGS += -m32
ASFLAGS += --32
+LDFLAGS += -melf_i386
3. 最后也最重要的是, 修改x86对应启动代码, 支持 Multiboot 规范, 从而可以直接由 QEMU 启动, 具体参考 SO 上的帖子(注2)
--- a/loader/platforms/x86/start.S
+++ b/loader/platforms/x86/start.S
@@ -10,6 +10,8 @@
.extern startup
.extern _end
+#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
+#define MULTIBOOT_HEADER_FLAGS 0x00000003
_start:
/* disable any interrupts from coming in */
cli
@@ -22,3 +24,9 @@ _start:
movl %eax, %esp # set stack pointer
jmp startup
+
+ /* Enable multiboot support */
+.align 4
+.long MULTIBOOT_HEADER_MAGIC
+.long MULTIBOOT_HEADER_FLAGS
+.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
修改完成之后, 进入 compile 目录, 执行 make;qemu-system-i386 -kernel xinu.elf, 如果看见 QEMU 提示 "Booting from ROM...", 那么恭喜, 请按
注1: 我的环境是 Ubuntu 14.04 x64 + gcc version 4.8.4, 不同环境过程可能会稍有不同
注2: 实际上, 整个过程都是基于这篇帖子, 最近在看一本讲操作系统的书
Operating Systems: Three Easy Pieces, 想用 XINU 来对照实验, 不过 XINU 提供的 server/client 虚拟机的方式感觉还是不方便, 于是找到了 SO 的这篇帖子, 中间碰到了一些小问题, 所以把解决的过程记录一下, 方便其他想折腾的朋友
XINU, 一个比较短小精悍的操作系统, 重点是, 这个操作系统是完整的, 可以在一些平台(包括x86虚拟机)上实际跑起来的一个操作系统, 具体可以看给的链接, 作者是Douglas Comer, 也就是<<TCP/IP网络互联技术>>那套书的作者, XINU 本身也对应有一本书, 写得很不错, 现在出到第2版了
之所以发这个帖子, 不是为了在这介绍 XINU 的前世今生, 而是要说 XINU 一个很有意思的地方, 即这个系统非常好折腾, 怎么个好折腾法呢, 只要你有一个 Linux 的开发环境(注1), 到
github 上抓一下代码, 做几个简单的调整, 就可以直接编译, 并通过 QEMU 运行了, 整个过程非常方便, 随时改, 随时运行, 所见即所得, 对于想折腾 OS 的朋友, 是个很不错的东西
以下记录调整的内容:
1. 解决编译器 undefined reference to __stack_chk_fail 报错
--- a/compile/Makefile
+++ b/compile/Makefile
@@ -24,7 +24,7 @@ TOPDIR := ..
# Set the C compilation flags common to all Embedded Xinu platforms.
# platformVars can add more flags if desired.
-CFLAGS :=
+CFLAGS := -fno-stack-protector
2. 修正 64 位环境下的链接问题
--- a/compile/platforms/x86/platformVars
+++ b/compile/platforms/x86/platformVars
@@ -10,6 +10,7 @@ PLATFORM_NAME := Intel x86
# Add flags to compile 32 bit code
CFLAGS += -m32
ASFLAGS += --32
+LDFLAGS += -melf_i386
3. 最后也最重要的是, 修改x86对应启动代码, 支持 Multiboot 规范, 从而可以直接由 QEMU 启动, 具体参考 SO 上的帖子(注2)
--- a/loader/platforms/x86/start.S
+++ b/loader/platforms/x86/start.S
@@ -10,6 +10,8 @@
.extern startup
.extern _end
+#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
+#define MULTIBOOT_HEADER_FLAGS 0x00000003
_start:
/* disable any interrupts from coming in */
cli
@@ -22,3 +24,9 @@ _start:
movl %eax, %esp # set stack pointer
jmp startup
+
+ /* Enable multiboot support */
+.align 4
+.long MULTIBOOT_HEADER_MAGIC
+.long MULTIBOOT_HEADER_FLAGS
+.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
修改完成之后, 进入 compile 目录, 执行 make;qemu-system-i386 -kernel xinu.elf, 如果看见 QEMU 提示 "Booting from ROM...", 那么恭喜, 请按
CTRL-ALT-3, 你会发现一些神奇的事情已经发生了, 剩下的世界和平什么的都交给你了 ;)
注1: 我的环境是 Ubuntu 14.04 x64 + gcc version 4.8.4, 不同环境过程可能会稍有不同
注2: 实际上, 整个过程都是基于这篇帖子, 最近在看一本讲操作系统的书
Operating Systems: Three Easy Pieces, 想用 XINU 来对照实验, 不过 XINU 提供的 server/client 虚拟机的方式感觉还是不方便, 于是找到了 SO 的这篇帖子, 中间碰到了一些小问题, 所以把解决的过程记录一下, 方便其他想折腾的朋友
相关文章推荐
- CentOS7+Tomcat 生产系统部署
- 虚拟机和windows主机中的文件共享
- QT线程2
- 我常用的pom.xml配置文件
- HDU 5071 Chat
- QT线程
- Android的事件分发源码分析,告别事件冲突。
- 解决android api23无Apache HttpClient包问题
- ABP理论学习之异常处理
- Android仿微信语音聊天
- 企业培训的三个关键点
- 怒水一记 GSS
- DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案
- NSFileManager的使用
- BZOJ 4104 [Thu Summer Camp 2015]解密运算
- MarkDown基本语法
- [DataStructure]多项式加法与乘法--B.链表存储(适用于零元系数多的多项式)
- web.xml中Filter,Listener,Servlet的区别
- Nginx 设置临时维护页面
- 仿按键抓抓