64位系统下编译linux0.00内核

这里的0.00版的内核指的是赵炯博士在《Linux内核完全剖析-基于0.12内核》第四章中给出的一个简单的多任务内核源码。

在64位系统下编译此内核会遇到很多问题,而网络上的参考资料多有不实之处,这里列出了本人具体的实践过程,以作备忘,也希望能帮到大家。

实验环境:

主机系统:MacOS:10.14

虚拟机:Oracle VirtualBox:6.0

虚拟操作系统:Ubuntu:18.04  X86-64

as:2.30  ld:2.30  as86:0.16.17  ld86:0.16.17

实验过程

下载http://oldlinux.org/Linux.old/bochs/linux-0.00-050613.zip,解压tar包,进入linux-0.00目录。

针对当前的环境,需要对Makefile、head.s做如下几点修改。

对Makefile的修改

1.更改gas,gld名称,如图1

2.更改as、ld编译链接选项,如图1

3.更改将head写入软盘映像时的dd命令,如图1

图1 修改Makefile

对head .s的修改

1.在汇编代码起始处添加 .code32,如图2.1

2.在startup_32上面添加伪指令 .globl startup_32 ,如图2.1 

3.修改 .align伪指令,将.align 2改为 .align 4,将.align 3改为 .align 8,如图2.2

4.修改其它控制指令,如图2.3、图2.4

图2.1 添加伪指令

 

图2.2 修改.align伪指令

 

图2.3 %bx改为%ebx

图2.4 修改mov指令

编译

执行make命令,如图3.1所示

图3 .1 执行make命令,编译

写入至软盘映像

将生成的Image(引导块和内核映像)写入软盘映像文件中,如图4.1所示

图4.1 将Image写入软盘映像

在VirtualBox中启动内核

在VirtualBox中新建虚拟机,在【存储】项指定软驱加载上面生成的软盘映像文件my.img,启动虚拟机,运行结果如图5.1

图5.1 运行结果(本例中将字符改为了a和d)

实验总结

实验过程中遇到的问题主要是因为我们在64位环境下编译32位汇编程序,因此编译和链接过程需要进行针对性的调整,此外编译器和连接器版本的差异的也会导致不同,关于将内核镜像写入软盘镜像文件时为什么skip=8,可以在参考链接【1】中找到详细的说明。

参考链接

【1】https://blog.csdn.net/wangnanjun/article/details/7080318

  编译Linux0.00内核(《Linux内核完全剖析-基于0.12内核》)linux-0.00-041217和linux-0.00-050613

【2】https://www.cnblogs.com/gccbuaa/p/7008129.html

  《linux 内核全然剖析》编译linux 0.12 内核 Ubuntu 64bits 环境

猜你喜欢

转载自www.cnblogs.com/ecjtusbs/p/13385049.html