Linux 0.11核心編譯和bochs上的實驗環境的搭建

來源:互聯網
上載者:User

 

  最近決定開始閱讀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

     編譯完成之後會產生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設定檔如下:

    #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選項用來指定設定檔。

 

 

    成功啟動虛擬機器的如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.