Linux内核0.11代码阅读(转)
最近决定开始阅读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代码阅读(转)的更多相关文章
- Linux内核0.11体系结构 ——《Linux内核完全注释》笔记打卡
0 总体介绍 一个完整的操作系统主要由4部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如图0.1所示.操作系统内核程序主要用于对硬件资源的抽象和访问调度. 图0.1 操作系统组成部分 内核 ...
- Linux内核0.11 setup文件说明
一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下setup.s源文件的实现功能的总结说明. setup.s是一个操作系统加载程序,它的主要功能是利用BIOS中断读取机器系 ...
- Linux内核0.11 bootsect文件说明
一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下bootsect.s源文件的说明,其中涉及到了一些基础知识可以参考这两篇文章. 操作系统启动过程 软盘相关知识和通过BIO ...
- Linux内核0.11 makefile文件说明
# # if you want the ram-disk device, define this to be the # size in blocks. # 如果要使用 RAM 就定义块的大小(注释掉 ...
- linux内核中链表代码分析---list.h头文件分析(一)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- Linux内核分析——汇编代码执行及堆栈变化
张潇月<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验步骤 首先借助实验楼这个平台进入Linux ...
- 通过简单的Linux内核启动程序代码窥探操作系统的启动原理
作者:吴乐 山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...
- Linux mysql8.0.11安装
准备:检查是否已安装过mysql,若有便删除(linux系统自带的) rpm -qa | grep mariadb rpm -e nodeps mariadb-libs-5.5.56-2.el7.x8 ...
随机推荐
- djinn:1 Vulnhub Walkthrough
靶机下载链接: https://download.vulnhub.com/djinn/djinn.ova 主机端口扫描: FTP发现一些文件提示 1337端口是一个游戏,去看下 哈哈有点难,暂时放弃, ...
- TortoiseGit 绑定 GitHub/Gitee ssh秘钥
小乌龟生成私钥和公钥 打开PuTTYgen 生成公钥/私钥文件 打开Pageant添加私钥.ppk文件 打开公钥文件获取key 打开GitHub/Gitee添加公钥 Gitee GitHub
- opencv —— boundingRect、minAreaRect 寻找包裹轮廓的最小正矩形、最小斜矩形
寻找包裹轮廓的最小正矩形:boundingRect 函数 返回矩阵应满足:① 轮廓上的点均在矩阵空间内.② 矩阵是正矩阵(矩形的边界与图像边界平行). Rect boundingRect(InputA ...
- 利用Bellman-Ford算法(有向图) 判断负环
// 根据Bellman-Ford算法的原理 // 判断负环(算法的最大更新次数,应该是顶点数-1次) // 而如果存在负环,算法会一直更新下去 // 我们根据循环进行的次数,来判断负环 #inclu ...
- Redis的启动和关闭(前台启动和后台启动)
场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 在上 ...
- app简单压力测试
step1:手机开发者选项中,将USB调试选上 step2:确认手机和电脑已经连接成功:adb devices step3:安装测试app:adb install package.apk (1)cd命 ...
- day9 修改文件
# 修改文件 # 文件是不能修改 with open('小护士班主任', mode='r', encoding='utf-') as f, open('小护士班主任.bak', 'w', encodi ...
- CF #619 div.2
序 希望,不要还有一天像今天一样糟糕. T1 three strings 笔记本的google 炸了,读题可难受了 多组测试数据 我们的想法是,用string存字符串,若 对于任意的i,a[i],b[ ...
- 用友UAP NC 单据节点_打开参照字段的问题_从打不开参照放大镜_到成功打开了但是取不到值_到修复成功
项目的这个功能是17年开发的,但是当时没有测试通过,今年拿出来测试(通过后会上线). 有两个表数据一开始只打算用来计算时查询,没打算放到目标单据中做表体参照字段.后来改细节问题后放到目标单据中做参照字 ...
- 用友UAP NC 开发环境抛出"JDK默认编辑器找不到"
此节点是升级65之前开发的,已经很久不使用,今天在开发环境使用,点查询抛出此异常. 最后问了人解决方法,就是往JRE系统库加入对应的jar包