码迷,mamicode.com
首页 > 其他好文 > 详细

安装nachos3.4遇到的问题

时间:2020-03-17 08:32:51      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:upd   elf   cat   def   拆分   注意   argument   rar   style   

win10优先使用Vagrant+VirtualBox搭建环境,因为采用的是nachos集成开发镜像,所以遇到的基本上都是外部的安装问题。

我此前尝试过使用WSL(ubuntu-64bit)、VMware(ubuntu-32bit),都遇到了相当大的麻烦,而且耗费了很长时间也没搞定,结果花费了不到1/10的时间就搞定了Vagrant版本(绝大部分还都用在下载上了),故在此强烈推荐Vagrant版。

 

一、Vagrant版(视频教程:https://www.bilibili.com/video/av2929294/ 与本文叙述的步骤略微差异)

1.下载修改好的nachos源码及开发镜像:http://pan.baidu.com/s/1jGpO1me(密码:8oz1)

2.安装vagrant1.7.3,virtualbox4.3,vagrant和virtualbox之间的版本相互对应,不要将其中任何一方版本安装过高或者过低。

最好安装virtualbox4.3.12,如果安装成4.3.40版本,可能出现兼容性问题导致vagrant up失败:

==> default: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below.
Command: ["startvm", "********", "--type", "headless"]
Stderr: VBoxManage.exe: error: The virtual machine ‘devdir_default_1584360377659_12426‘ has terminated unexpectedly during startup with exit code 1 (0x1).  More details may be available in ‘...\VBoxHardening.log‘

试图用virtualbox直接打开的话会显示:

The virtual machine ‘Master‘ has terminated unexpectedly during startup with exit code 1 (0x1). More details may be available in ‘C:\Users\***\VirtualBox VMs\devdir_default_1584360377659_12426\Logs\VBoxHardening.log‘.
    返回 代码: E_FAIL (0x80004005)
    组件: MachineWrap
    界面: IMachine {f30138d4-e5ea-4b3a-8858-a059de4c93fd}

3.安装Git,保守一点安装Git-2.5.2.2-64-bit。

安装时,在界面“Adjusting Your environment PATH"勾选最下面一项:

Use Git and optional Unix tools from the Windows Command Prompt

之所以不像视频里那样勾选第一、第二项,是因为我在选择第一、第二项后,如果只添加环境变量PATH$“C:\Program Files\Git\usr\bin”,发现vagrant ssh依然无法正常运行,提示我安装Git,而且连"ls"这种指令也无法使用(由此感受到了来自个人电脑深深的恶意)。其实这里就相当于多添加了“C:\Program Files\Git\mingw64\bin”。

4.修改/QLWH/devdir/.vagrant/machines/default/virtualbox/creator_uid,从501变为0,501是mac默认,0是windows默认。

5.在devdir目录下先后运行指令vagrant up和vagrant ssh,成功后进入Linux环境,并显示版本号等相关信息。

6.顺利执行以下指令(可能还需要install gcc,g++,make)

  1. cd /vagrant/nachos/nachos-3.4/code
  2. make
  3. cd threads
  4. ./nachos

 

 

------------------------分割线------------------------

以下为未整理内容,全是坑,中途崩溃若干次:

安装gcc-3.4(i386)缺少依赖:binutils (>= 2.16.1-2ubuntu3)

安装低版本binutils,如:binutils_2.18-0ubuntu3_i386.deb,error:libc6-dev:amd64 (2.23-0ubuntu11) breaks binutils (<< 2.20.1-1) and is installed.

安装高版本binutils,如:binutils_2.25.1-6ubuntu2_i386.deb,error: binutils:i386 depends on zlib1g (>= 1:1.2.0)

安装zlib1g:i386

加载动态库libz.so.1出现ELFCLASS32问题  #64位系统不能使用32位的库

用ldd命令查询执行程序

删除zlib1g

缺少动态库libz.so.1

网络解决方案1:使用apt-get指令  #然而此时dpkg和apt-get等指令均失效

网络解决方案2:安装共享库

(1)/lib或/usr/lib目录下,在/etc/ld.so.conf中加路径

(2)非/lib或/usr/lib目录下,export一个全局变量LD_LIBRARY_PATH

 

zlib-1.2.3为测试版,没有libz.so.1库

查看动态库链接,一般动态库都在这里

ls /usr/lib

ls /usr/local/lib

 

结果根本就都不顶用好吗???百度给的结果属实垃圾,google了一下libz.so.1,第一条即为正解:

1.访问packages.ubuntu.com(这个网站比墙内的镜像好使多了)

2.搜索包内容(contents):libz.so.1

3.下载zlib1g_1.2.8.dfsg-1ubuntu3.deb

4.由于无法使用dpkg或者apt-get安装,通过第三方软件(如好压)直接解压deb文件,得到data.tar.xz,继续解压

5.通过cp命令复制libz.so.1.2.11到/usr/lib或者/usr/local/lib(libz.so.1为动态库链接,libz.so.1.2.11才是动态库)

6.$ls /usr/local/lib可以看到绿色的libz.so.1.2.11,接着$sudo ldconfig,再$ls /usr/local/lib,可以看到新生成的青色的libz.so.1,至此大功告成

 

wtm,zlib1g:amd64对binutils:i386不管用,安装不了binutils:i386,也就安装不了gcc-3.4,zlib1g:i386就报ELFCLASS32问题

 

2011年的CSDN文章,默认32位操作系统,64位操作系统不可能安装gcc-3.4:i386

 

emm,最后切换版本的时候还遇到个小问题,自带的gcc-5.6修改优先度时路径错误,于是只调整了gcc-3.6的优先度为100

 

nb,最后放弃了,装了VMware,还专门挑了个低版本的32位的ubuntu(12.04),结果就因为这个版本问题在后面又为此忙活了半天

装个ubuntu装了一晚上没装好,然后才知道可以跳过语言包

ubuntu12.04自带的gcc版本是4.6,好嘛之前有经验了速度装了3.4,没出什么问题

尝试make了一下,出现一堆no such file or directory,诸如:

bits/types.h:No such file or directory

bits/stdio_lim.h:No such file or directory

bits/sys_errlist.h:No such file or directory

gnu/stubs.h:No such file or directory

gnu/stubs-32.h:No such file or directory

查阅了一下资料,说是需要apt-get install gcc-multilib安装32位的共享库

但问题是上面指令会安装一大堆64位的包,这让我犹豫起来,32位系统还能装64位的包?

又搜了一下,似乎也可以直接装需要的32位的包

看到一篇文章:https://blog.csdn.net/yanbixing123/article/details/52300900

ia32-libs,或者lib32z1、lib32ncurses5、lib32bz2-1.0,可惜这4个包都提示虽然被引用,但已经被废弃

https://www.cnblogs.com/jikexianfeng/articles/5654571.html这篇文章提到了两种方法,

其一是安装g++-multilib,其二是添加源sudo add-apt-repository ppa:ubuntu-x-swat/x-updates,我尝试了一下方法二,抓取链接似乎失效或者被墙了

说到源,也是个坑,之前安装各种包的速度实在不敢恭维,被迫换了好几个国内的源,电子科大的和163的都不行,最后选了阿里云。

修改操作是(需要root权限):

gedit /etc/apt/sources.list

然后将其中全部内容用阿里云的源替换。

结果搞来搞去还是没有搞定,有的说要安装libc6-dev,但安装后依然没有解决问题,直到又看到了一篇英文文章:

http://www.it1352.com/783760.html

提问者遇到了与我一样的问题,他是ubuntu11.04安装nachos,遇到了gnu/stubs.h:No such file or directory

粗略地扫了一眼,On Ubuntu it‘s called libc6-dev-i386 - do sudo apt-get install libc6-dev-i386. See below for extra instructions for Ubuntu 12.04.

后半段话我最开始并没有在意,dpkg -l libc6-dev发现libc6-dev已经被安装过了,不过我当时的指令是apt-get install libc6-dev,而不是apt-get install libc6-dev:i386。这让我不禁但尤起是否会和gcc-multilib一样安装上amd64版本的,但转念一想,现在是32位系统,根本无法运行64位的包,自动安装总至于给自己找麻烦吧。

问题绕了半天还是没有解决,这时候却又看到另一篇有意思的提问:https://stackoverflow.com/questions/12591629/gcc-cannot-find-bits-predefs-h-on-i686

这名提问者同样遇到了bits/types:No such files or directory,他从64位的ubuntu12.04切换到32位环境,经过查阅发现还是需要安装gcc-multilib,因为Debian使用mutiarch系统分离了库,但他不能理解为什么他正在使用i686(32位),却需要安装64位的库。

下面的回答者依然建议他安装gcc-multilib,因为他认为安装32位系统不会改变计算机的体系结构,使用者的计算机将永远是64位计算机。安装64位版本的ubuntu应该只能提供更好的多核性能。由于计算机仍然是64位计算机,因此可能需要C编译器,该编译器将在64位计算机上进行编译。

(嗯,说的不错,那么虚拟机和这是大同小异吗?……我打算未来花点时间总结一下)

下面的评论也很有趣:

从32位到64位的主要变化是系统可以使用多少内存,而不是多处理。32位系统支持约2GB的内存,而64位系统最多可以支持16艾字节(尽管从技术上讲,64位Intel和AMD计算机仅寻址48位,最大256 TB,这仍然足够。 。 目前)。——Dan Albert

@DanAlbert:32位系统支持基于内核内定义的PAGE_OFFSET宏值的VM模型(仅可在内核构建时配置(通常通过CONFIG_VM_SPLIT))。Linux上32位系统的典型默认设置是“ 3:1” VM拆分,这意味着3GB用户模式虚拟内存和1GB内核模式VM。可能是2:2,可能是1:3。——kaiwan

还有人提到这并不是一个32、64bit的问题。

暂不做进一步讨论,无论如何,在我尝试安装了gcc-multilib和g++-multilib后,发现居然解决了……一半的问题。

只剩下一种no such file or directory,出在gnu/stubs-32.h上。

另一篇文章(https://blog.csdn.net/meilinghu/article/details/52855046)又启发了我一下:既然提示缺少文件,那为何不去该目录下看一下呢?

果然,我在/usr/include/gnu下没有找到stubs-32.h,却在/usr/include/i386-linux-gnu/gnu下找到了stubs-32.h

我回过头又翻到之前粗略扫过的英文文章,注意到ubuntu12.04需要进行额外操作:

export LIBRARY_PATH=/usr/lib/$(gcc -print-multiarch)

export C_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)

export CPLUS_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)

我不太理解这里的gcc -print-multiarch是什么意思,根据回答中叙述“a known problem that put files in a non standard location”,基本确定就是我遇到的问题——将文件放在了不标准的位置。

上面的链接是国内转载帖,这句话的超链接内容似乎也被替换过,而且还失效了。然后又花了点时间找到这个“known problem”:https://gcc.gnu.org/ml/gcc/2012-02/msg00314.html

实际操作应该是:

export LIBRARY_PATH=/usr/lib/i386-linux-gnu/

export C_INCLUDE_PATH=/usr/include/i386-linux-gnu

export CPLUS_INCLUDE_PATH=/usr/include/i386-linux-gnu

ok,问题解决,下一个处理stdarg.h,很轻松

然后是sysdep.cc的重复定义函数和强制转换问题,注释了全部矛盾函数,并添加了头文件,提示void exit(int exitCode)未声明,这和2011年那篇文章就不一样。

嗯,两种方法暂时先跳过这个问题,①#include <unistd.h>里有void _exit(int)函数,修改EXIT()中关于exit(int)的调用为_exit(int);②添加声明void exit(int exitCode)。实在没理解文章里要注释掉void exit(int exitCode)是闹那样,本来就没有这个函数呀。

不知道是不是某次采用了①的缘故,结束后发现ubuntu系统进不去了,记得百度后的结果是“趁早重装”,呵呵

强制转换有两个error,ReadFromSocket和SendToSocket,其他的都是些warning,记得有一个是format ‘%x’ expects type ‘unsigned int’, but argument 2 has type ‘int *’,实在是太多,百度起来一个个解决也费劲。

然后是switch.s,这里提示我#endif XXXX是错误的,必须用#endif,也不知是哪门子版本的gcc,然后是修改HOST_i386块的_Threadroot和_SWITCH为Threadroot和SWITCH

到此,还以为总算结束了,结果砰的一下warning和error刷屏了,全是没见过的问题……

问了几个人说是应该是gcc版本的问题,好的

此后又尝试了14.04,重复上面的步骤,没安装gcc3.4,用的默认版本,搞完switch.s后提示我有几个.o文件出错,错误是Threadroot和SWITCH未定义,完全懵圈,因为这些不都是在switch.s中解决了的吗?好的已经彻底解决不了了,我认栽

对,VMware这里也有一些小问题,除了一定要换源外,还有apt-get remove vim-common,apt-get install vim。

为了使用共享文件夹和复制粘贴方便,还需要安装VMware Tools,有几次明明安装VMware Tools成功后却依然无法在主机和虚拟机之间复制粘贴,而且VMware Tools光碟有时候加载的巨慢,莫名其妙!

安装相互依赖包的方法:sudo dpkg -i a.deb b.deb c.deb

安装nachos3.4遇到的问题

标签:upd   elf   cat   def   拆分   注意   argument   rar   style   

原文地址:https://www.cnblogs.com/victorique-de-blois/p/12405656.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!