最近决定开始阅读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;

改为:

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选项用来指定配置文件。

Linux内核0.11代码阅读(转)的更多相关文章

  1. Linux内核0.11体系结构 ——《Linux内核完全注释》笔记打卡

    0 总体介绍 一个完整的操作系统主要由4部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如图0.1所示.操作系统内核程序主要用于对硬件资源的抽象和访问调度. 图0.1 操作系统组成部分 内核 ...

  2. Linux内核0.11 setup文件说明

    一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下setup.s源文件的实现功能的总结说明. setup.s是一个操作系统加载程序,它的主要功能是利用BIOS中断读取机器系 ...

  3. Linux内核0.11 bootsect文件说明

    一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下bootsect.s源文件的说明,其中涉及到了一些基础知识可以参考这两篇文章. 操作系统启动过程 软盘相关知识和通过BIO ...

  4. Linux内核0.11 makefile文件说明

    # # if you want the ram-disk device, define this to be the # size in blocks. # 如果要使用 RAM 就定义块的大小(注释掉 ...

  5. linux内核中链表代码分析---list.h头文件分析(一)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...

  6. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  7. Linux内核分析——汇编代码执行及堆栈变化

    张潇月<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验步骤 首先借助实验楼这个平台进入Linux ...

  8. 通过简单的Linux内核启动程序代码窥探操作系统的启动原理

    作者:吴乐  山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...

  9. Linux mysql8.0.11安装

    准备:检查是否已安装过mysql,若有便删除(linux系统自带的) rpm -qa | grep mariadb rpm -e nodeps mariadb-libs-5.5.56-2.el7.x8 ...

随机推荐

  1. linux中shell内置命令和外置命令

    shell内置命令 无法通过which或者whereis去查找命令的位置 例如cd,cp这些命令是shell解释器内置的命令 当shell内置命令传入shell解释器,shell解释器通过内核获取相关 ...

  2. IIS网站部署配置

    1.配置Session State

  3. C#中FolderBrowserDialog类打开文件夹使用说明

    C#中FolderBrowserDialog类打开文件夹使用说明   作用:打开文件选择窗口获取文件夹路径.   导入的命名空间为: System.Windows.Forms; 属性:   Descr ...

  4. javaSE学习笔记(17)---锁

    javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读 ...

  5. python3-cookbook笔记:第七章 函数

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

  6. 转载整理:SublimeText3 Emmet失效问题以及win7 pyV8安装问题

    SublimeText3 Emmet安装问题网上已经很多帖子了,这个简单,主要对win7 64位我本人遇到的Emmet好多快捷功能无法用(比如ul>li*4  Tab无法生成)问题做了整理!搜了 ...

  7. C#在屏幕画点

    Graphics类没有提供直接画点的方法,最开始想使用填充圆形区域來实现,结果发现点很大,占据了4个像素.使用起点和终点一样来划线什么也没画出.画矩形,画椭圆都没实现.最后试到填充矩形,这次成功了. ...

  8. Umi 小白纪实(一)—— 创建项目&常用配置

    umi 是一个企业级 react 应用框架,也是蚂蚁金服的底层前端框架 <蚂蚁金服的前端框架和工程化实践> 一.安装脚手架 在创建项目之前,需要保证有 node 8.10 以上的环境 可以 ...

  9. Docker实战部署JavaWeb项目-基于SpringBoot

    最近在滴滴云上看到服务器很便宜,1核2G,1年只需要68块钱.下面是我基于Docker部署Javaweb服务的过程.目前我见过的最便宜的服务器,阿里云打折的时候都没有这么便宜啊,果断入手.有需要的话可 ...

  10. CMake 复制文件方法

    我们经常会遇到将第三方库文件复制到项目运行时文件夹,或者将子项目生成的库文件复制到项目运行时文件夹的情况,本文介绍FILE-COPY.add_custom_command.ADD_CUSTOM_TAR ...