|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
手把手教你用C++搭建操作系统
+ L1 Q' \: Q3 n$ T' u
+ P% R7 c) b E- S" O. h l8 v一、如何为开发操作系统做准备?0 N1 ]4 N2 Q1 T6 X7 e/ q4 Z1 x9 B0 e+ t
" E- ~* T9 K: y' L) \- _! ?" p/ I
首先,必须了解所有编程语言,例如指针,函数(针对C++);其次,必须对汇编语言有所了解。4 d1 Z% D( s$ S; u4 V" N
* p! m- ~# q# G1 f% Z1 C二、开发操作系统需要什么工具?
D8 X4 B4 d. q5 T$ @ A1 x* f4 o3 {7 r, e
1. 汇编器:
( i9 m4 [1 m3 ?/ m; c
2 u1 {& ^4 A' _1 f5 J3 ?汇编器获取汇编代码,并为您提供低级输出,例如包含CPU寄存器上的控件的对象。本文要使用的汇编程序是nasm(netwide汇编程序),可以从http://nasm.us下载。
3 Z' r) G& _' W4 q7 \7 g
$ f& E- l Y y- t4 p2.交叉编译器:
% Q4 U1 o4 n/ _' x( ^/ |" b: ^8 |
为了开发操作系统,必须具有交叉编译器,因为您必须针对其可执行格式来编译内核。在这里用gcc(gnu编译器集合),您可以从http://gcc.gnu.org/下载。' y, M% D, P9 N% Z& G
( B7 Y7 h) r4 ~0 G5 T3.链接器:
* r2 C) J# d9 C9 p% J( r, K
( r( f6 p" |- r+ @1 U链接器获取您的对象并将其链接到getter,在这里用gnu binutils,可以从http://gnu.org/software/binutils下载
# C, _! D# m& S& L Q/ _3 W( x7 |0 W0 g) V: g
4.虚拟机:
4 Q; t6 {$ w5 Q; B2 S3 `
+ O7 z( V/ c% b A h$ ]7 B: H9 @为了测试操作系统,必须有一个vm(虚拟机),但这不是必需的,在这里使用virtualbox,可以从http://virtualbox.org/下载。2 ?$ i$ w2 _. l7 {
+ N# P: ~; c( c6 K4 d: g三、 开始之前的注意事项; a* C" r" n: M, P. t
. z, @/ S. F( U# ?1 E1.在开发操作系统时,不能使用<iostream>,<fstream>,<memory>,<cstdio>,<cstdlib>,<windows.h>,<unistd.h>和所有平台API's,必须自己创建所有这些东西。& O8 T0 j" T- X `5 H
8 b* f2 V4 l* K5 C# B( F% ~# d2.必须非常非常小心
( z; F" X! W: J( t0 Z
: N( c9 E [8 _9 A! M9 o在开发时,您可以掌控一切,因此,您可以销毁一个或一些或所有硬件。在这种情况下,我建议使用虚拟机来测试您的操作系统,而不是多次重新启动。( b: b3 h, S1 O5 d+ U& E
% q" ?* x N+ j0 B" a! ]: Y3 V R四、 引导程序( ^1 w3 T$ @* Z1 ]; u
" m/ m+ b! j8 U3 ^+ j引导加载程序是一堆用汇编语言编写的代码,必须为512个byets(1个扇区),它加载您的操作系统的内核。我们跳过本节,使用grub作为bootloader,您可以从http://gnu.org/software/grub下载grub源代码。或者实际上,您也许想要编译软盘:在Google中搜索将对您有所帮助。
' g& r P5 v7 J6 ~- l, q1 u5 C+ U! h4 f& j) `1 K
五、 一个简单的内核
5 z' Q8 t/ e0 {9 L' X$ n9 A s7 e% T, Y& M
我们要开发一个操作系统,因此,我们必须自己创建功能。
, p' f1 f9 M( C" {5 P& I" ]8 Z8 I y4 S( D
首先,我们创建一个包含以下内容的文件boot.asm:
6 Y5 l! }* m# i3 \1 p+ w
6 p4 x# b6 n) t+ g代码链接:8 D) L6 j" A7 ?% ]1 P3 e
cpp.sh/6zu2 a0 U8 {: R) }
cpp.sh/9uw
1 _$ l6 L2 l6 u9 J3 f' l, U# w! j: n+ q% N+ I/ [
六、 链接描述文件
; C) t1 z! \# O( b+ q2 ], N2 H0 D9 b% |' c1 }& c. F9 T, q- X
创建具有以下内容的文件:linker.ld
4 r" a, w) F& B- a
5 G6 B' K4 f7 n& _
" x. O7 S6 w; n七、 如何编译
1 h. {; Q/ H+ L. S- X3 B9 R5 A. t1 I) ?7 f
转到shell(在Windows上需要cygwin),输入以下命令:
2 D% P6 o- E3 T. J/ r+ \9 `2 Y- Q9 L& V
恭喜!( S& W0 H2 C/ u6 S
$ r! E" D, p, \( g6 F7 m5 R0 R+ c3 A
您的第一个操作系统已成功编译! {; C$ ? n' u
. g5 j# q; L3 y7 z% K4 `
现在您可以使用grub-mkrescue创建图像:
}* e% k- m8 t
( E' M2 N% U/ P6 n创建目录:iso
7 i6 a, l$ s+ K/ }6 u
: K& ^' V/ P9 n5 Y- A9 E& _在该目录中,创建另一个目录:boot,然后在引导目录中,创建目录:grub,然后在grub目录中创建文件:grub.cfg,其中包含以下内容(不要在新行中添加大括号):* T, x1 Q9 c. G- \0 F) ~9 \9 o. k
: E0 A# G% `7 \- M+ V然后将您的内核(kern)复制到iso / boot目录并再次运行您的shell:
/ e' k0 @4 w. k1 M2 O
' n, A6 q# d: Z' `切换到内核的主目录并输入:
0 s' W) u6 f, t! l1 {2 w
" {( \ Q1 E* J. g; e4 O现在您可以从第一个操作系统启动并享受乐趣:一个没有任何内容的简单内核。 |
|