zoukankan      html  css  js  c++  java
  • Linux 0.11内核编译和bochs上的实验环境的搭建

    http://menglee.iteye.com/blog/1100887

        最近决定开始阅读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文件中,修改如下:

    C代码  收藏代码
    1. *p = *current;  /* NOTE! this doesn't copy the supervisor stack */  

         改为:

    C代码  收藏代码
    1. 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代码  收藏代码
    1. #gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0  
    2. romimage: file=/usr/local/share/bochs/BIOS-bochs-latest, address=0xf0000  
    3. megs: 16  
    4. vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest  
    5. floppya: 1_44="linux-kernel-image-0.11", status=inserted  
    6. ata0-master: type=disk, path="hdc-0.11-new.img", mode=flat, cylinders=410, heads=16, spt=38  
    7. boot: a  
    8. log: bochsout.txt  
    9. vga_update_interval: 300000  
    10. keyboard_serial_delay: 200  
    11. keyboard_paste_delay: 100000  
    12. private_colormap: enabled=0  
    13. fullscreen: enabled=0  
    14. screenmode: name="sample"  
    15. 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选项用来指定配置文件。

        成功启动虚拟机的截图如下:


    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(822) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    oracle10g安装问题
    oracle10g卸载问题
    c编译过程
    根文件系统制作
    Handler消息传递机制
    Glide图片加载库的使用
    关于FragmentPageAdapter
    Android中set标签的使用
    overridependingtransition方法
    关于View
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648140.html
Copyright © 2011-2022 走看看