关于初始代码的处理

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

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

(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位的依赖包:

sudo apt-get install lib32ncurses5 lib32z1
sudo apt-get install zlib1g:i386 libstdc++6:i386
sudo apt-get install libc6:i386 libncurses5:i386
sudo apt-get install libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386

继续对初始代码的处理

考虑到一个是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

运行成功。

nachos学习笔记(一)相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. OpenStack文件注入相关分析(转载)
  2. struts2 通配符简化配置
  3. 【转】接口测试Session/Cookie笔记(二)
  4. Linux下通过PXE服务器安装Linux系统
  5. stm32单片机屏幕一直闪_stm32实现LED灯的闪烁
  6. Tcl与Design Compiler (三)——DC综合的流程
  7. python代码模块与模块之间空1行_Day006|Python语法基础
  8. webstorm 设置tslint_webstorm(2019)配置eslint规范
  9. netbeans连接数据库_NetBeans Java EE技巧#1 –数据库中的实体类
  10. Spring RabbitMQ教程
  11. Precedence Problems of C Operators
  12. Java Script之创建对象
  13. 20050909:女乘客钓男司机?
  14. java中遍历Map几种方法
  15. poythoncode-实战5--excel 文件读取,文本文件,csv文件,存到系统中以大列表方式进行存储
  16. DSM到DTM的转换——基于PCI Geomatica
  17. Cocos2d-x 2.0 百例精讲:如何让一个精灵跟随触点移动
  18. 前端 《优化改良》 - VUE高效开发 - div - 自定义div的load事件 - 戴向天
  19. EFPower tool 使用时发生的异常
  20. java根据内容生成二维码并保存到本地

热门文章

  1. 国家自然科学基金 结题项目 查询网站
  2. pytorch——VGG网络搭建
  3. TextToSpeech文字转语音
  4. ios系统邮件怎么绑定QQ邮箱
  5. Android 之路68---动画基础
  6. 使用 scoped-slot 去设置缩略图模版,成功上传图片之后回显,在进行编辑,保存成功,但是报错
  7. 2015年8月之 英雄不老
  8. iOS 二进制文件分析之常用命令
  9. 102-并发编程详解(中篇)
  10. MATLAB中nargin函数的用法nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能。通常可以用它来设定一些默认值。如下例所示: 函数文件 examp.m