閱讀源代碼之前首先需要搭建實驗環境,由于Linux 0.11的代碼是二十年前編寫的,當前版本的gcc編譯器無法正常編譯通過,因此需要首先將Linux 0.11源代碼移植到gcc 4.3.4+,并在bochs虛擬機上搭建起了實驗環境。
一、Linux 0.11內核編譯
1、編譯環境設置
我的操作系統是:Tp-Link
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、程序變量在匯編語句中的引用表示
將所有變量前的下劃線去掉:average salary的英文翻譯,average salary的造句
.globl _idt, _gdt
修改為:
.globl idt, gdt
6、修改copy_process函數
在kernel子目錄下的fork.c文件中,修改如下:
C代碼

- *p = *current; /* NOTE! this doesn't copy the supervisor stack */
改為:
C代碼

- 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
編譯完成之后會生成Linux kernel的image文件:linux-kernel-image-0.11,至此就完成了Linux 0.11的移植和編譯工作。
二、bochs上實驗環境的搭建
1、bochs的安裝
下載bochs 2.2.1的源碼包,地址是:http://sourceforge.net/projects/bochs/files/bochs/2.2.1.tar.gz/download
執行如下命令:
tar xvfz bochs-2.2.1.tar.gz
cd bochs-2.2.1
./configure
編譯bochs之前需要對源文件進行一點修改,不然會編譯錯誤:
刪除iodev子目錄下harddrv.h文件290行和295行的sparse_image_t::
make
make install
2、bochs的設置
我的bochs配置文件如下:
Js代碼

- #gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
- romimage: file=/usr/local/share/bochs/BIOS-bochs-latest, address=0xf0000
- megs: 16
- vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest
- floppya: 1_44="linux-kernel-image-0.11", status=inserted
- ata0-master: type=disk, path="hdc-0.11-new.img", mode=flat, cylinders=410, heads=16, spt=38
- boot: a
- log: bochsout.txt
- vga_update_interval: 300000
- keyboard_serial_delay: 200
- keyboard_paste_delay: 100000
- private_colormap: enabled=0
- fullscreen: enabled=0
- screenmode: name="sample"
- i440fxsupport: enabled=0
其中第一句是bochs調試選項,不進行內核調試時可以注釋掉這一行。
此外,hdc-0.11-new.img這個文件是系統啟動后加載的根文件系統。
這本書是趙炯博士編寫的《Linux內核完全注釋》一書所附帶的。
你可以從這里下載到該書:http://oldlinux.org/download/clk011c-2.0.1.pdf
這里可以下載到已經編譯好的kernel image和disk文件:http://www.oldlinux.org/Linux.old/bochs/
3、運行bochs
啟動bochs虛擬機的命令是:bochs -f bochsrc-gdb.bxrc,其中-f選項用來指定配置文件。
成功啟動虛擬機的截圖如下:

posted on 2011-06-22 16:29
墻頭草 閱讀(754)
評論(0) 編輯 收藏