日期:2014-05-16  浏览次数:20714 次

Linux 0.11内核编译和bochs上的实验环境的搭建

? ? 最近决定开始阅读Linux 0.11的源代码。
??? 学习Linux操作系统的核心概念最好的方法莫过于阅读源代码。而Linux当前最新的源代码包已经有70MB左右,代码十分庞大,要想深入阅读十分困难。而Linux早期的0.11版本虽然有诸多局限,但是具备了现代操作系统的完备功能,一些基本概念沿用到了当前版本,并且代码只有300KB,非常适合阅读。
??? 阅读源代码之前首先需要搭建实验环境,由于Linux 0.11的代码是二十年前编写的,当前版本的gcc编译器无法正常编译通过,因此需要首先将Linux 0.11源代码移植到gcc 4.3.4+,并在bochs虚拟机上搭建起了实验环境。

?

? ??一、Linux 0.11内核编译

? ??1、编译环境设置

? ? ?我的操作系统是:

? ? ?Linux ubuntu 2.6.32-32-generic #62-Ubuntu SMP i686 GNU/Linux

? ? ?安装gcc编译器,使用gcc -v确认gcc编译器的版本高于4.3.4

?

? ? ?安装编译工具:

? ? ?apt-get install build-essential

?

? ? ?安装该软件包:

? ? ?apt-get install bin86

?

? ? ?2、修改Makefile文件

? ? ?Linux 0.11内核源代码中基本上每个子目录都包含有一个Makefile,需要对每个Makefile进行如下修改:

? ? ?a)将gas替换为as,将gld替换为ld。现在gas和gld已经直接改名为as和ld了;

? ? ?b)去掉as的-c选项;

? ? ?c)去掉gcc的编译选项:-fcombine-regs和-mstring-insns

? ? ?d)去掉kernel子目录中Makefile的-O选项

?

? ???3、内存位置对齐语句align的修改

? ? ?在boot目录下的三个汇编程序中,align语句的使用方法已经改变。原来align后的数值是内存位置的幂次值,现在则需要直接给出起始地址的整数值,因此

? ? ?align 3

? ? ?要改成

? ? ?align 8

?

? ? ?4、修改嵌入宏汇编程序

? ? ?由于as的不断改进,现在不需要程序员人为指定寄存器了,因此需要把代码中的__asm__("ax")全部去掉。类似:"si", :"di", :"ax", :"cx");

? ? ?修改为

? ? ?:);?

?

? ? ?5、程序变量在汇编语句中的引用表示

? ? ?将所有变量前的下划线去掉:

? ? ?.globl _idt, _gdt

? ? ?修改为:

? ? ?.globl idt, gdt

?

? ? ?6、修改copy_process函数

? ? ?在kernel子目录下的fork.c文件中,修改如下:

*p = *current;	/* NOTE! this doesn't copy the supervisor stack */

? ? ?改为:

memcpy(((struct task_struct *) p), ((struct task_struct *) current), sizeof(struct task_struct));

?

? ? ?也可以从我的github上下载已经修改好的源代码,连接是:https://github.com/mengli/TinyOS

?

? ? ?7、编译内核

? ? ?下载mengli-TinyOS-v0.0.1-0-g182166e.zip,解压,执行如下命令:

? ? ?cd?mengli-TinyOS-v0.0.1-0-g182166e

? ? ?make