nachos学习笔记(一)

关于初始代码的处理

   原始代码很老,所以需要需要用32位系统编译,当然64位系统可以模拟这一过程,gcc与g++ 编译器支持32位程序的方法(以gcc为例) 

(1)确认主机为64位架构的内核,应该输出为adm64,执行: $ dpkg --print-architectur;

(2)确认打开了多支架功能,应该输出为i386,执行: $ dpkg --print-foreign-architectures

(3)如果没有,则需要手动打开,依次执行: $ sudo dpkg --add-architecture i386

  $ sudo apt-get update

  $ sudo apt-get dist-upgrade 

(4)安装 gcc multilab, 执行:

  sudo apt-get install gcc-multilib g++-multilib 

(5)注意:用GCC编译时需要加上 -m32选项 

  引用源:http://blog.csdn.net/chichoxian/article/details/53471591

继续对初始代码的处理

考虑到一个是32位代码的问题,一个是g++ 和gcc编译器等级的问题,我把makefile文件的gcc,g++ 后面都加上-m32后继续运行,发现依然是运行不成功,于是我把精力放在了g++ 和gcc编译器版本的问题上(后来证明是错误的道路),我开始不断的下载编译器的旧版本,更换默认的编译器,一次次的失败,很气人。 我把我的问题向操作系统老师陈述了一下,老师回复邮件说他是Ubuntu14.04,Linux32位的版本,我也用同样的环境运行了一次代码,bingo~运行成功,说明我解决思路是正确的,于是继续回到Ubuntu 18.04 64位开始修改代码,渐渐的我发现编译器的版本与运行结果关系不是很大,那就剩下以32位方式运行了呀,这个我一直认为我已经改过来了呀,继续查看报错内容,发现:

g++ -m32 arch/unknown-i386-linux/objects/main.o arch/unknown-i386-linux/objects/list.o arch/unknown-i386-linux/objects/scheduler.o arch/unknown-i386-linux/objects/synch.o arch/unknown-i386-linux/objects/synchlist.o arch/unknown-i386-linux/objects/system.o arch/unknown-i386-linux/objects/thread.o arch/unknown-i386-linux/objects/utility.o arch/unknown-i386-linux/objects/threadtest.o arch/unknown-i386-linux/objects/synchtest.o arch/unknown-i386-linux/objects/interrupt.o arch/unknown-i386-linux/objects/sysdep.o arch/unknown-i386-linux/objects/stats.o arch/unknown-i386-linux/objects/timer.o arch/unknown-i386-linux/objects/switch-linux.o  -o arch/unknown-i386-linux/bin/nachos		
/usr/bin/x86_64-linux-gnu-ld: i386:x86-64 架构于输入文件 arch/unknown-i386-linux/objects/switch-linux.o 与 i386 输出不兼容

一开始我的关注点在i386:x86-64 架构于输入文件与 i386 输出不兼容这几个关键字上,于是开始走各种弯路,还在指定动态链接文件上思考操作了半天,归根到底没有找到根上,这个关键字的含义在于文件的输入版本为32位,而输出版本为64位,这就导致了不兼容。曲折的探索不去细讲,关键在于arch/unknown-i386-linux/objects/switch-linux.o这句话我没有重点关注,还以为是所有的文件都有不兼容问题(这个思维失误我觉得很尴尬)。 意识到是哪个文件出了问题后我的方向就很清晰了,因为我记得之前为了解决这个问题:

>>> Assembling switch-linux.s <<<
/lib/cpp  -D HOST_i386 -D HOST_LINUX switch-linux.s > arch/unknown-i386-linux/objects/tmp.s
as -o arch/unknown-i386-linux/objects/switch-linux.o arch/unknown-i386-linux/objects/tmp.s
switch-linux.s: Assembler messages:
switch-linux.s:58: 错误: invalid instruction suffix for `push'
switch-linux.s:60: 错误: invalid instruction suffix for `push'
switch-linux.s:61: 错误: operand type mismatch for `call'
switch-linux.s:62: 错误: operand type mismatch for `call'
switch-linux.s:63: 错误: operand type mismatch for `call'
switch-linux.s:67: 错误: invalid instruction suffix for `pop'
../Makefile.common:115: recipe for target 'arch/unknown-i386-linux/objects/switch-linux.o' failed
make: *** [arch/unknown-i386-linux/objects/switch-linux.o] Error 1

因为32位汇编和64位汇编的区别,我在文件里加了一个.code32语句,如下

#ifdef HOST_i386
	    .code32
        .text
        .align  2
        .globl  ThreadRoot

我意识到之前修改代码的问题,开始仔细的看报错内容,as语句是用来编译汇编语言的,明显是以64位的方式编译的,而仅.code32是会造成不兼容的情况,所以正确做法是不用加.code32,而只是用:

 as --32 -o... 

修改makefile文件就可以大功告成了。 让我们看一下运行threads文件的结果:

...
>>> Linking arch/unknown-i386-linux/bin/nachos <<<
g++ -m32 arch/unknown-i386-linux/objects/main.o arch/unknown-i386-linux/objects/list.o arch/unknown-i386-linux/objects/scheduler.o arch/unknown-i386-linux/objects/synch.o arch/unknown-i386-linux/objects/synchlist.o arch/unknown-i386-linux/objects/system.o arch/unknown-i386-linux/objects/thread.o arch/unknown-i386-linux/objects/utility.o arch/unknown-i386-linux/objects/threadtest.o arch/unknown-i386-linux/objects/synchtest.o arch/unknown-i386-linux/objects/interrupt.o arch/unknown-i386-linux/objects/sysdep.o arch/unknown-i386-linux/objects/stats.o arch/unknown-i386-linux/objects/timer.o arch/unknown-i386-linux/objects/switch-linux.o  -o arch/unknown-i386-linux/bin/nachos		
ln -sf arch/unknown-i386-linux/bin/nachos nachos

运行成功。

猜你喜欢

转载自blog.csdn.net/qq_37595769/article/details/81872625