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 环境