-
虚拟机(VMware workstation)
-
Linux操作系统(Ubuntu 20.04 LTS)
-
qemu
模拟器(在qemu模拟器上面运行kernel和compiler toolchain)
操作系统是用的是Ubuntu 20.04版本,默认此时你已经在虚拟机中装好了Linux操作系统。
$ cd ~ 进入当前用户目录。
$ objdump -i 第二行或第三行出现elf32-i386。
$ gcc -m32 -print-libgcc-file-name
控制台出现/usr/lib/gcc/i486-linux-gnu/version/libgcc.a or /usr/lib/gcc/x86_64-linux-gnu/version/32/libgcc.a
如果控制台出现以上输出,那么当前工具链是没有问题的。如果没有这样的输出,输入下面一下指令:
$ sudo apt-get install -y build-essential gdb
然后再分别输入objdump -i和 gcc -m32 -print-libgcc-file-name指令,观察控制台是否出现相同的结果。 出现如期的结果表示你的工具链已经编译完成。
$ sudo git clone https://pdos.csail.mit.edu/6.828/2018/jos.git lab #拉取jos
$ sudo git clone https://github.com/mit-pdos/6.828-qemu.git qemu #拉取qemu
//将qemu移至lab目录下
$ cd lab
$ sudo mkdir qemu
$ cd ..
$ sudo mv qemu/* lab/qemu
//进入lab目录下的qemu目录
$ cd lab
$ cd qemu
//安装qemu需要的包。
$ sudo apt-get install libsdl1.2-dev
$ sudo apt-get install libglib2.0-dev
$ sudo apt-get install libz-dev
$ sudo apt-get install libpixman-1-dev
$ sudo apt-get install libtool*
//如果创建虚拟机时,安装的是64位系统,系统自带的是64位的gcc,但是开发环境需要32位的gcc。
使用以下命令提供32位的gcc, 当前操作在qemu文件夹中
$ sudo apt-get install gcc-10-multilib//必须安装对应版本
//进入qemu,再进入qga文件夹,为commands-posix.c添加头文件<sys/sysmacros.h>
$ cd qga
$ sudo vim commands-posix.c # 加上头文件
//在文件底部添加QEMU_CFLAG+=-w
//避免[-Werror=deprecated-declarations]等待各式错误,踩坑很久。 还有在下面./configure的时候加上一句"CFLAGS=-Wno-error"才行!!!
$ cd qemu
$ sudo vim Makefile
$ CFLAGS=-Wno-error ./configure --disable-kvm --target-list="i386-softmmu x86_64-softmmu"
//使用make 和make install
$ sudo make -j8
$ sudo make install
$ sudo make qemu-nox # 加上"-nox"是不要图形化界面
使用命令:qemu-system-i386 ,出现qemu界面
问题1:如果出现 error: undefined reference to __udivdi3
解决办法:没有支持32位gcc环境,==因为我是gcc10.3.0,所以scc-10-multilib,使版本匹配==使用命令:sudo apt-get install gcc-10-multilib
问题2:如果出现:undefined reference to major 和 undefined reference to minor
解决办法:在/qemu/qga/commands-posix.c 中加上头文件 <sys/sysmacros.h>
问题3:如果出现error : Could not initialize sdl
解决办法:在最后一步,在lab目录中使用sudo make-nox来编译