|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
手把手教你用C++搭建操作系统 9 ^2 d: I8 a, k7 m/ x
/ ?/ }4 Q4 T% z0 m
一、如何为开发操作系统做准备?
& q/ v% B$ N! o6 H5 B) A# u: h7 [ v& f' ~% j1 g
首先,必须了解所有编程语言,例如指针,函数(针对C++);其次,必须对汇编语言有所了解。9 s7 N/ C. U8 D+ M/ |* O9 G
: S+ F0 l) w/ \" L1 k4 C5 p
二、开发操作系统需要什么工具?# z/ f, S; H7 N+ l
3 R7 ]3 r. f4 y* W1. 汇编器:
# B7 s/ O3 n$ {
3 @, w7 T \" C( d汇编器获取汇编代码,并为您提供低级输出,例如包含CPU寄存器上的控件的对象。本文要使用的汇编程序是nasm(netwide汇编程序),可以从http://nasm.us下载。: }6 e) Z# Y7 {0 i
" m+ t0 _. K9 i4 _9 K. \; O, Y3 V2.交叉编译器:
9 Z0 l, f0 }! Z C" F2 r% Z* \1 A' E1 _- u& z2 @
为了开发操作系统,必须具有交叉编译器,因为您必须针对其可执行格式来编译内核。在这里用gcc(gnu编译器集合),您可以从http://gcc.gnu.org/下载。( t9 i3 t8 f8 E- s
$ W- Y# j T7 A- G3 K3 A) [0 C3.链接器:
1 V0 c8 p! {5 U4 X o' t" O1 T4 Q$ F! }3 m8 t
链接器获取您的对象并将其链接到getter,在这里用gnu binutils,可以从http://gnu.org/software/binutils下载
8 w" f5 c( c+ Z7 Q% G0 @, @: I/ A
4.虚拟机:
3 z, x2 t( {% q" D" F" N- D% }) G4 c7 x v3 E2 |+ s& u9 `
为了测试操作系统,必须有一个vm(虚拟机),但这不是必需的,在这里使用virtualbox,可以从http://virtualbox.org/下载。 @! Z3 A# Q7 y/ F8 J }
+ N8 H! o' |; k! J8 x0 P三、 开始之前的注意事项! ^8 E! [ b# T, Q5 p9 Q
3 w# y; f# }( J3 r* A- u/ I
1.在开发操作系统时,不能使用<iostream>,<fstream>,<memory>,<cstdio>,<cstdlib>,<windows.h>,<unistd.h>和所有平台API's,必须自己创建所有这些东西。
8 s. J, i+ U: s9 {, k, P% X. Q* O; P4 B5 s* v. @
2.必须非常非常小心
1 E8 f: o( u. y
, t0 P6 w# E' L/ |" _在开发时,您可以掌控一切,因此,您可以销毁一个或一些或所有硬件。在这种情况下,我建议使用虚拟机来测试您的操作系统,而不是多次重新启动。
' h7 `* {5 d2 M! t& c! q
" N& n" c) B6 r( R2 ^. |! }四、 引导程序& R. `, n0 M+ F+ E# c! X
! x" ^+ ^ ~0 I: N# @4 O引导加载程序是一堆用汇编语言编写的代码,必须为512个byets(1个扇区),它加载您的操作系统的内核。我们跳过本节,使用grub作为bootloader,您可以从http://gnu.org/software/grub下载grub源代码。或者实际上,您也许想要编译软盘:在Google中搜索将对您有所帮助。3 e7 V T/ |8 x! J8 \
0 B( N9 C% N& \0 g6 }五、 一个简单的内核
0 A5 |' ^6 g" ~% [- |* |2 e' ~
0 s5 z \( i/ ^+ O; N我们要开发一个操作系统,因此,我们必须自己创建功能。
3 {/ }1 x# A7 X; k6 P1 k+ X% w* S. E4 J! a
首先,我们创建一个包含以下内容的文件boot.asm:
4 E6 w* _4 W' L, U/ N9 H. ? A% `- K- }
代码链接:. I7 w2 M+ i U- `
cpp.sh/6zu
- P+ F% d3 F* M( W: ^4 ~cpp.sh/9uw7 p2 A: ^2 L! x
: p* X9 x) Z+ f六、 链接描述文件9 [) N, C3 v0 d9 S- q" q3 H
) W. n+ ~, g3 G. q创建具有以下内容的文件:linker.ld' T! y: P" v- D/ Z
% W5 P* q/ ~5 @7 ^' n: v" {! z) T4 l5 y0 C1 p
七、 如何编译
/ E; q u7 j& c9 o/ o: O9 q; _: [/ K, O* _2 w# v
转到shell(在Windows上需要cygwin),输入以下命令:; f8 y" z: W, U( N
* p3 X: k7 J7 |1 r4 b8 `& D5 \
恭喜!
) f2 S" {+ l/ ~7 z5 m' e+ t
* {, {$ z! ]+ n+ f您的第一个操作系统已成功编译!- b! P4 u U8 q
/ G! ^$ i% o, r$ n# h( a- q
现在您可以使用grub-mkrescue创建图像:
1 }/ E6 ^3 A; S7 m" B" ^
5 Z; Y* [( |) }3 Y创建目录:iso
% d! J$ f% p0 I# J7 p" S+ ?$ a4 h
2 ]. g$ F2 B7 T3 d+ j. ]在该目录中,创建另一个目录:boot,然后在引导目录中,创建目录:grub,然后在grub目录中创建文件:grub.cfg,其中包含以下内容(不要在新行中添加大括号):
/ |1 M3 D& E1 q8 ?4 m; v3 [- a4 a0 m* G7 d3 `! [& `
然后将您的内核(kern)复制到iso / boot目录并再次运行您的shell:
* F# f/ R$ h6 p. W. {+ x B' A. Z9 [8 G3 g
切换到内核的主目录并输入:9 B7 t9 M1 m P4 ~& w
2 m# ^ {7 J" a' {( N
现在您可以从第一个操作系统启动并享受乐趣:一个没有任何内容的简单内核。 |
|