文档章节

Linux 0.11内核编译和bochs上的实验环境的搭建

刘十立
 刘十立
发布于 2015/01/01 10:35
字数 1065
阅读 179
收藏 1

最近决定开始阅读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选项用来指定配置文件。


错误:

如果出现error: X11/extensions/Xrandr.h: No such file or directory就

sudo apt-get install xorg-dev


本文转载自:http://www.2cto.com/os/201108/98651.html

刘十立
粉丝 0
博文 11
码字总数 1045
作品 0
广州
私信 提问
基于 Docker/Qemu 的极速 Linux 0.11 内核学习和开发环境 - Linux 0.11 Lab

Linux 0.11 Lab, 基于 Docker/Qemu 的极速 Linux 0.11 内核学习和开发环境。 该项目致力于快速构建一个 Linux 0.11 实验环境,可配合《Linux内核完全注释》 一书使用。 1. 项目简介 使用文档...

lzufalcon
07/04
989
0
Ubuntu 12.10安装Bochs 2.6, 调试linux-0.11内核

http://blog.csdn.net/sinzou1/article/details/5903968 Linux(ubuntu)安装bochs http://wenku.baidu.com/view/f968e23b0912a21614792914.html ubuntu下安装bochs http://www.linuxidc.com/L......

xwisen
2014/07/22
591
0
安装bochs并配置linux0.11

一、安装bochs 在bochs.sourceforge.net下载bochs源代码包并解压缩 ./configure --enable-debugger --enable-disasm 出现错误一: ERROR: pkg-config was not found, or unable to access t......

acmfly
2012/05/26
770
0
使用bochs运行Linux Kernel-2.4.0

上一篇博文讲了如何制作bochs硬盘镜像并且将grub装进去,这样我们可以在启动bochs后进入到grub界面。 这篇博文我们将2.4内核写入硬盘镜像,这就可以使用bochs直接启动内核了。 我的实验系统是...

Kernel开发者
2018/06/26
0
0
Linux Lab 发布 v0.2-rc2,支持实时 Linux v5.2 开发

Linux Lab 是一套用于 Linux 内核学习、开发和测试的即时实验室,可以极速搭建和使用,功能强大,用法简单! 可以用它来高效地学习处理器架构、Linux 内核、嵌入式 Linux 系统、C 语言编程、...

lzufalcon
08/16
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

高速PCB设计软件allegro中与网络有关的约束规则设置

在allegro pcb的设计过程中,设计约束规则包括时序规则、间距规则、信号完整性规则以及物理规则等,本期主要详细讲解与物理、间距与电气约束中的线宽、线间距物理规则的设置。 一、线宽设置 ...

demyar
11分钟前
1
0
Linux 启动停止SpringBoot jar 程序部署Shell 脚本

#!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=algorithm.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [start|stop|restart|status]...

草庐过客
13分钟前
2
0
mysql-connector-java驱动升级到8.0后数据库保存时间出现时差

1.问题:在一个新项目中用到了新版的mysql jdbc 驱动后,发现保存到数据库的时间出现了时差 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>......

ValSong
14分钟前
2
0
好程序员大数据教程Scala系列之隐式转换和隐式参数

5.1. 概念 隐式转换和隐式参数是Scala中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。 5.2. 作用 隐式的对类的方法进行增强...

好程序员官网
18分钟前
1
0
多线程必备

初次接触线程,可能有很多初学者搞不明白,始终云里雾里,那么本篇文章直接带大家介绍多线程必须知道的几个点 接下来没有多余,直接上干货 1. 进程和线程的区别是什么? 进程是执行着的应用程序,...

理性思考
21分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部