TestEnvironment

简介

在研究linux 0.11此类old linux时,因为历史原因过于久远,最新ubuntu 20.04的gcc版本过于高,很难编译通过,所以为了减少不必要的编译麻烦,需要用老ubuntu对应的老gcc版本来编译old linux源码,于是此处采用docker安装ubuntu 12.04环境。

因为当初linus是基于80386 CPU编写的old linux,所以我们需要一个仿真平台摸拟80386,是此处采用bochs来摸拟80386。

环境

此实验在docker ubuntu 12.04中编译old linux源码,在ubuntu 20.04利用bochs运行old linux

  • docker

  • bochs

安装docker

在ubuntu 20.04中安装docker,请看官网说明

$ docker -v
Docker version 19.03.10, build 9424aeaee9

下载ubuntu 12.04的docker镜像

$ docker pull vernon2dh/oldlinux

编译old linux

在ubuntu 20.04启动docker运行ubuntu 12.04,并将ubuntu 20.04 ~/workplaces目录挂载ubuntu 12.04 /mnt目录

在docker ubuntu 12.04运行如下命令,编译old linux

运行old linux

在ubuntu 20.04中安装bochs,如下命令:

在bochs运行old linux,如下命令:

分析编译过程 (可选)

-0 表示生成 8086 的 16 位目标程序

-a 表示生成与 GNU as 和 ld 部分兼容的代码

-s 告诉链接器 ld86 去除最后生成的可执行文件中的符号信息

注意 bootsect 是 544 字节,而引导程序必须要正好占用一个磁盘扇区,即 512 个字节。

多了 32 个字节是 ld86 产生 Minix 可执行文件格式,所以bootsect除了文本段、数据段等以外,还包括一个 Minix 可执行文件头部,如下:

执行如下命令,去掉可执行文件头部,即前32 个字节(tools/build.c 的功能之一)

生成的 Image 就是去掉可执行文件头部的 bootsect

Last updated

Was this helpful?