IT技術(shù)小屋

          秋風(fēng)秋雨,皆入我心

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            38 隨筆 :: 1 文章 :: 19 評(píng)論 :: 0 Trackbacks
              最近決定開(kāi)始閱讀Linux 0.11的源代碼。
              學(xué)習(xí)Linux操作系統(tǒng)的核心概念最好的方法莫過(guò)于閱讀源代碼。而Linux當(dāng)前最新的源代碼包已經(jīng)有70MB左右,代碼十分龐大,要想深入閱讀十分困難。而Linux早期的0.11版本雖然有諸多局限,但是具備了現(xiàn)代操作系統(tǒng)的完備功能,一些基本概念沿用到了當(dāng)前版本,并且代碼只有300KB,非常適合閱讀。
              閱讀源代碼之前首先需要搭建實(shí)驗(yàn)環(huán)境,由于Linux 0.11的代碼是二十年前編寫(xiě)的,當(dāng)前版本的gcc編譯器無(wú)法正常編譯通過(guò),因此需要首先將Linux 0.11源代碼移植到gcc 4.3.4+,并在bochs虛擬機(jī)上搭建起了實(shí)驗(yàn)環(huán)境。
              一、Linux 0.11內(nèi)核編譯
              1、編譯環(huán)境設(shè)置
              我的操作系統(tǒng)是:
              Linux ubuntu 2.6.32-32-generic #62-Ubuntu SMP i686 GNU/Linux
              安裝gcc編譯器,使用gcc -v確認(rèn)gcc編譯器的版本高于4.3.4
              安裝編譯工具:
              apt-get install build-essential
              安裝該軟件包:
              apt-get install bin86
              2、修改Makefile文件
              Linux 0.11內(nèi)核源代碼中基本上每個(gè)子目錄都包含有一個(gè)Makefile,需要對(duì)每個(gè)Makefile進(jìn)行如下修改:
              a)將gas替換為as,將gld替換為ld?,F(xiàn)在gas和gld已經(jīng)直接改名為as和ld了;
              b)去掉as的-c選項(xiàng);
              c)去掉gcc的編譯選項(xiàng):-fcombine-regs和-mstring-insns
              d)去掉kernel子目錄中Makefile的-O選項(xiàng)
              3、內(nèi)存位置對(duì)齊語(yǔ)句align的修改
              在boot目錄下的三個(gè)匯編程序中,align語(yǔ)句的使用方法已經(jīng)改變。原來(lái)align后的數(shù)值是內(nèi)存位置的冪次值,現(xiàn)在則需要直接給出起始地址的整數(shù)值,因此
              align 3
              要改成
              align 8
              4、修改嵌入宏匯編程序
              由于as的不斷改進(jìn),現(xiàn)在不需要程序員人為指定寄存器了,因此需要把代碼中的__asm__("ax")全部去掉。類(lèi)似:"si", :"di", :"ax", :"cx");
              修改為
              :);
              5、程序變量在匯編語(yǔ)句中的引用表示
              將所有變量前的下劃線去掉:
              .globl _idt, _gdt
              修改為:
              .globl idt, gdt
               6、修改copy_process函數(shù)
               在kernel子目錄下的fork.c文件中,修改如下:
               *= *current;    /* NOTE! this doesn't copy the supervisor stack */
               改為:
               memcpy(((struct task_struct *) p), ((struct task_struct *) current), sizeof(struct task_struct));
               也可以從我的github上下載已經(jīng)修改好的源代碼,連接是:https://github.com/mengli/TinyOS
               7、編譯內(nèi)核
               下載mengli-TinyOS-v0.0.1-0-g182166e.zip,解壓,執(zhí)行如下命令:
               cd mengli-TinyOS-v0.0.1-0-g182166e
               make
               編譯完成之后會(huì)生成Linux kernel的image文件:linux-kernel-image-0.11,至此就完成了Linux 0.11的移植和編譯工作。
              二、bochs上實(shí)驗(yàn)環(huán)境的搭建
              1、bochs的安裝
              下載bochs 2.2.1的源碼包,地址是:http://sourceforge.net/projects/bochs/files/bochs/2.2.1.tar.gz/download
              執(zhí)行如下命令:
              tar xvfz bochs-2.2.1.tar.gz
              cd bochs-2.2.1
              ./configure
              編譯bochs之前需要對(duì)源文件進(jìn)行一點(diǎn)修改,不然會(huì)編譯錯(cuò)誤:
              刪除iodev子目錄下harddrv.h文件290行和295行的sparse_image_t::
              make
              make install
              2、bochs的設(shè)置
              我的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調(diào)試選項(xiàng),不進(jìn)行內(nèi)核調(diào)試時(shí)可以注釋掉這一行。此外,hdc-0.11-new.img這個(gè)文件是系統(tǒng)啟動(dòng)后加載的根文件系統(tǒng)。
              
              這本書(shū)是趙炯博士編寫(xiě)的《Linux內(nèi)核完全注釋》一書(shū)所附帶的。
              你可以從這里下載到該書(shū):http://oldlinux.org/download/clk011c-2.0.1.pdf
              這里可以下載到已經(jīng)編譯好的kernel image和disk文件:http://www.oldlinux.org/Linux.old/bochs/
              3、運(yùn)行bochs
              啟動(dòng)bochs虛擬機(jī)的命令是:bochs -f bochsrc-gdb.bxrc,其中-f選項(xiàng)用來(lái)指定配置文件。
              成功啟動(dòng)虛擬機(jī)的截圖如下:
              
          posted on 2011-08-02 10:05 Meng Lee 閱讀(3158) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Linux

          評(píng)論

          # re: Linux 0.11內(nèi)核編譯和bochs上的實(shí)驗(yàn)環(huán)境的搭建 2015-05-12 15:48 WW
          你好,請(qǐng)問(wèn)mengli-TinyOS-v0.0.1-0-g182166e.zip這個(gè)是什么  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 科技| 保德县| 玉门市| 林口县| 顺昌县| 云林县| 偃师市| 柞水县| 东港市| 开封市| 华亭县| 务川| 桦南县| 衡阳县| 陆川县| 怀集县| 四川省| 凭祥市| 罗甸县| 八宿县| 武鸣县| 长岛县| 扶余县| 河津市| 白玉县| 夏津县| 昌平区| 盈江县| 休宁县| 拉萨市| 长垣县| 武山县| 泸水县| 通州区| 郸城县| 乡城县| 铜川市| 嘉义县| 区。| 顺义区| 陈巴尔虎旗|