MIT-6.828-JOS-环境搭建
MIT 6.828是操作系统中最经典的一门课程。完成所有的lab就相当于完成了一个迷你的操作系统。我跟的是2018年的课程,课程首页在6.828课程官网。当然所有资料都是英文的,所以难度也不低,这里推荐几本非常有用的参考书:《x86汇编语言-从实模式到保护模式》,《程序员的自我修养-链接、装载与库》,《深入理解计算机系统》,很多知识在这些书中都有提到,参考着看会有奇效。
概述
本文主要讲解实验前的环境搭建,主要分为两个部分,一个是x86模拟器QEMU的安装,另一个是编译工具链。参考资料:官方文档
实验环境
我的机子装的win10的系统,现在win10支持WSL,在windows上也能享受到原生linux一样的体验。我一般用Xshell登陆本地WSL,体验很不错。
前期准备
首先从官网clone实验的框架代码到本地:git clone https://pdos.csail.mit.edu/6.828/2018/jos.git lab
编译工具链
编译工具链是一个工具集包括c编译器,汇编编译器,连接器。在命令行下执行gcc -m32 -print-libgcc-file-name,如果输出/usr/lib/gcc/i486-linux-gnu/version/libgcc.a 或 /usr/lib/gcc/x86_64-linux-gnu/version/32/libgcc.a就说明没有问题了。否则执行sudo apt-get install -y build-essential gdb进行安装(Ubuntu系统下)。在64位的机器上还需要安装32位支持库sudo apt-get install gcc-multilib否则后面make的时候可能会出现"__udivdi3 not found"的情况。
QEMU模拟器安装
QEMU是一款模拟器,按照官方文档的提示我们需要从源码安装针对课程定制过的QEMU。步骤如下:
- clone源码:git clone https://github.com/mit-pdos/6.828-qemu.git qemu。这里最好还是老老实实从官方文档提供的地址下载,虽然有点慢。但是这门课程每年都可能修改qemu。
- 执行
./configure --disable-kvm --target-list="i386-softmmu x86_64-softmmu"。这一步可能会报错:- 问题1:
- 出现:
ERROR: Python not found. Use --python=/path/to/python - 解决:添加
--python=python3,还是不行提示Note that Python 3 or later is not yet supported。安装python2.7,然后使用--python=python2.7选项。
- 出现:
- 问题2:
- 出现:
ERROR: pkg-config binary 'pkg-config' not found - 解决:执行
apt-get install -y pkg-config
- 出现:
- 问题3:
- 出现:
ERROR: zlib check failed. Make sure to have the zlib libs and headers installed. - 解决:执行
sudo apt-get install zlib1g-dev
- 出现:
- 问题4:
- 出现:
ERROR: glib-2.12 gthread-2.0 is required to compile QEMU - 解决:
sudo apt-get install libglib2.0-dev
- 出现:
- 问题5:
- 出现:
ERROR: pixman >= 0.21.8 not present. - 解决:
sudo apt-get install libpixman-1-dev
- 出现:
- 问题6:
- 出现:
vl.c: In function ‘main’: vl.c:2778:5: error: ‘g_mem_set_vtable’ is deprecated [-Werror=deprecated-declarations] g_mem_set_vtable(&mem_trace); ^ In file included from /usr/include/glib-2.0/glib/glist.h:32:0, from /usr/include/glib-2.0/glib/ghash.h:33, from /usr/include/glib-2.0/glib.h:50, from vl.c:59: /usr/include/glib-2.0/glib/gmem.h:357:7: note: declared here void g_mem_set_vtable (GMemVTable *vtable); ^ cc1: all warnings being treated as errors rules.mak:57: recipe for target 'vl.o' failed make: *** [vl.o] Error 1 - 解决:QEMU源码根目录下的Makefile文件最后加上一行 QEMU_CFLAGS+=-w
- 出现:
- 问题1:
- 执行
make && make install。至此QEMU安装完毕。
编译执行
在lab源码根目录下执行make,如果看到
就说明编译成功了。然后执行make qume,看到如下信息就说明环境搭建好了。
MIT-6.828-JOS-环境搭建的更多相关文章
- MIT 6.828 JOS学习笔记2. Lab 1 Part 1.2: PC bootstrap
Lab 1 Part 1: PC bootstrap 我们继续~ PC机的物理地址空间 这一节我们将深入的探究到底PC是如何启动的.首先我们看一下通常一个PC的物理地址空间是如何布局的: ...
- MIT 6.828 | JOS | 关于虚拟空间和物理空间的总结
Question: 做lab过程中越来越迷糊,为什么一会儿虚拟地址是4G 物理地址也是4G ,那这有什么作用呢? 解决途径: 停下来,根据当前lab的进展,再回头看上学期操作系统的ppt & ...
- MIT 6.828 JOS学习笔记17. Lab 3.1 Part A User Environments
Introduction 在这个实验中,我们将实现操作系统的一些基本功能,来实现用户环境下的进程的正常运行.你将会加强JOS内核的功能,为它增添一些重要的数据结构,用来记录用户进程环境的一些信息:创建 ...
- MIT 6.828 JOS学习笔记0. 写在前面的话
0. 简介 操作系统是计算机科学中十分重要的一门基础学科,是一名计算机专业毕业生必须要具备的基础知识.但是在学习这门课时,如果仅仅把目光停留在课本上一些关于操作系统概念上的叙述,并不能对操作系统有着深 ...
- JOS环境搭建
想写一个OS很久了,今天开始正式动工了!! 大家都知道操作系统是计算机科学中十分重要的一门基础学科.但是以前在学习这门课时,仅仅只是把目光停留在课本上一些关于操作系统概念上的叙述,并不能对操作系统有着 ...
- MIT 6.828 JOS学习笔记1. Lab 1 Part 1: PC Bootstrap
Lab 1: Booting a PC Part 1: PC Bootstrap 介绍这一部分知识的目的就是让你能够更加熟悉x86汇编语言,以及PC启动的整个过程,而且也会首次学习使用QEMU软件来仿 ...
- MIT 6.828 JOS学习笔记18. Lab 3.2 Part B: Page Faults, Breakpoints Exceptions, and System Calls
现在你的操作系统内核已经具备一定的异常处理能力了,在这部分实验中,我们将会进一步完善它,使它能够处理不同类型的中断/异常. Handling Page Fault 缺页中断是一个非常重要的中断,因为我 ...
- MIT 6.828 JOS学习笔记16. Lab 2.2
Part 3 Kernel Address Space JOS把32位线性地址虚拟空间划分成两个部分.其中用户环境(进程运行环境)通常占据低地址的那部分,叫用户地址空间.而操作系统内核总是占据高地址的 ...
- MIT 6.828 JOS学习笔记7. Lab 1 Part 2.2: The Boot Loader
Lab 1 Part 2 The Boot Loader Loading the Kernel 我们现在可以进一步的讨论一下boot loader中的C语言的部分,即boot/main.c.但是在我们 ...
- MIT 6.828 JOS学习笔记15. Lab 2.1
Lab 2: Memory Management lab2中多出来的几个文件: inc/memlayout.h kern/pmap.c kern/pmap.h kern/kclock.h kern/k ...
随机推荐
- lxml视频讲座
lxml视频讲座 Winfortune 01 - How to create an equivalent of fortune and cowsay for Windows, using Python ...
- Linux学习2-fork
复制进程映像 fork() 要想让进程同时执行多个函数,我们可以使用线程或从源程序中创建一个完全分离的进程,后者就像init的做法一样,而不像exec调用那样用新程序替换当前指向的线程. 我们可以通过 ...
- HDU 2094 产生冠军 dfs加map容器
解题报告:有一群人在打乒乓球比赛,需要在这一群人里面选出一个冠军,现在规定,若a赢了b,b又赢了c那么如果a与c没有比赛的话,就默认a赢了c,而如果c赢了a的话,则这三个人里面选不出冠军,还有就是如果 ...
- 【数据库】SQL经典面试题 - 行列转换二 - 列转行
本帖子是行转列的一个逆向操作——列转行,看下面一个面试题 面试题2: 柠檬班第30期学生要毕业了,他们的Linux.MySQL.Java成绩数据表 tb_lemon_grade_column中, 表中 ...
- Css3帧动画深入探寻,讲点项目中实际会碰到的问题
先加个副标题XD --如何解决background-size为100%下处理@keyframes 正是在项目中遇到副标题,才引起我更深入的探寻 先略带一下基本的css3动画 css3的动画实现是通过属 ...
- [转]Ubuntu下ROS开发环境搭建(QT+ros_qtc_plugin)
ROS与C++入门教程-搭建开发环境(QT+ros_qtc_plugin) PS : 在“安装ros_qtc_plugin插件”这一步中,原文提到“ Ubuntu 14.04使用apt-get方式安装 ...
- 20165230 2017-2018-2 《Java程序设计》第5周学习总结
20165230 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类与外嵌类 可以在类中定义另一个类,即内部类 包含内部类的类为内 ...
- linux环境下mysql默认是区分表名大小写的
在linux环境下,mysql默认表明是区分大小写的,我们可以查看全局变量发现: mysql> show variables like 'lower%'; +------------------ ...
- python基础--shutil模块
shutil模块提供了大量的文件的高级操作. 特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作.对单个文件的操作也可参见os模块. 注意 即便是更高级别的文件复制函数(shutil.cop ...
- 不同意义的new和delete
补充说明: new/delete是运算符而非函数,operator new/delete并非是new/delete的重载.事实上,我们无法自定义new/delete的行为: operator new/ ...