日期:2014-05-16 浏览次数:20714 次
? ? 最近决定开始阅读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