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>
    阅读(385) | 评论(0) | 转发(4) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    Linux文件属性
    [Oracle] Listener的动态注册
    jQuery easyUI Pagination控件自定义div分页(不用datagrid)
    桂林电子科技大学出校流量控制器Android版1.0.0
    php使用check box
    Python windows ping
    Python selenium chrome 环境配置
    Linux wget auto login and backup database
    PyQt4 ShowHMDB show sqlite3 with QTableWidget summary
    PyQt4 py2exe 打包 HardwareManager
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648195.html
Copyright © 2011-2022 走看看