声明:请看到此文章的朋友不要转载,因为写作才刚刚开始,有很多不成熟甚至错误的地方。等所有文章完成之后,我会细心整理。
相信很多人曾经都有过一种冲动,那就是像linus一样自己写个操作系统。这个系列的文章就是关于这个话题的,但是我并不奢望能开发出一个像当代linux一样的OS,实际上几乎不可能,即使是linus也做不到。linux能发展到现在靠的是互联网上的无数黑客,及各大公司的支持。我的目标只是个multitasking,带有文件系统的简单OS kernel。
要写OS必须要有相应的工具,下面就搭建OS开发环境。
首先要有个linux系统,我用的是Ubuntu。然后再加个虚拟机bochs,这样我们就不必折腾自己的爱机了。
先去
http://sourceforge.net/projects/bochs/files/bochs/2.4.1/ 下载 bochs-2.4.1.tar.gz
bochs虚拟机编译安装:
1. 安装相应的gnu工具,执行下面命令
sudo apt-get install build-essential bison
2. 安装一些图形库
sudo apt-get install libgtk2.0-dev xorg-dev
3. 解压bochs-2.4.1
tar -zxvf bochs-2.4.1.tar.gz
4. 将文件/bochs-2.4.1/cpu/proc_ctrl.cc 的650行到680行换成以下内容:
650行开始
Code
1 #if BX_SUPPORT_VMX
2 VMexit_CR3_Write(i, val_32);
3 if (BX_CPU_THIS_PTR cr0.get_PG() && BX_CPU_THIS_PTR cr4.get_PAE() &&
4 !long_mode()) {
5 if (! CheckPDPTR(val_32)) {
6 BX_ERROR(("SetCR3(): PDPTR check failed !"));
7 exception(BX_GP_EXCEPTION, 0, 0);
8 }
9 }
10 SetCR3(val_32);
11 BX_INSTR_TLB_CNTRL(BX_CPU_ID, BX_INSTR_MOV_CR3, val_32);
12 break;
13 #endif
14 #if BX_CPU_LEVEL > 3
15 case 4: // CR4
16 #if BX_SUPPORT_VMX
17 val_32 = VMexit_CR4_Write(i, val_32);
18 if (BX_CPU_THIS_PTR cr0.get_PG() && (val_32 & (1<<5)) != 0 /* PAE */
19 && !long_mode()) {
20 if (! CheckPDPTR(BX_CPU_THIS_PTR cr3)) {
21 BX_ERROR(("SetCR4(): PDPTR check failed !"));
22 exception(BX_GP_EXCEPTION, 0, 0);
23 }
24 }
25 // Protected mode: #GP(0) if attempt to write a 1 to
26 // any reserved bit of CR4
27 if (! SetCR4(val_32))
28 exception(BX_GP_EXCEPTION, 0, 0);
29 break;
30 #endif
31 #endif
32 default:
33 BX_ERROR(("MOV_CdRd: #UD - control register %d index out of range",
34 i->nnn()));
35 exception(BX_UD_EXCEPTION, 0, 0);
36 }
37 }
680行结束
5. ./configure --enable-debug --enable-disasm
6. make all
7. sudo make install
至此bochs安装完毕,下一节我们写个hello world级的引导代码
参考资料:
1. http://blog.chinaunix.net/u3/95743/showart_2056874.html 这一节的内容基本取自该博客,谢谢该博主。
2. 我的开发环境是 ubuntu8.10 或 ubuntu9.04, 新出的ubuntu9.10我没有实验,不能保证正确性。