Hyperkernel验证实验的复现与z3环境初识
Hyperkernel验证实验的复现与z3环境初识
前言
建议顺序阅读本文!禁止转载。--@CarpVexing(https://www.cnblogs.com/CarpVexing/p/15948336.html)
Boss的项目,要求对os验证的典型研究进行一些研究,于是我花费半个礼拜复现了一下Hyperkernel这个实验。关于z3证明器在os验证方面的潜力与前景,本文不做探讨,仅将复现过程简单做个备忘。
笔者之前还想复现中科大μC_OS-Ⅱ验证实验,奈何项目主页给出的验证文件和虚拟机镜像打包文件挂载在“中科大·耶鲁高可信软件联合研究中心”的服务器下,但是这个服务器寄了,东西都down不到了。
论文来源
这是项目主页: UNSAT: Hyperkernel (washington.edu)
这是github地址(基础用法): GitHub - uw-unsat/hyperkernel
这是论文地址:https://unsat.cs.washington.edu/papers/nelson-hyperkernel.pdf
系统选择
我没有完全按照它们给出的配置进行设置,而是尽量靠近他们所要求的版本。实验平台为win10的vmware。
虚拟机环境:VMware Workstation 16 Pro ver.16.1.2 build-17966106
系统:Linux Ubuntu 17.10
镜像:ubuntu-17.10.1-desktop-amd64.iso
分配硬盘20G,内存8G,自动检测光驱。
前置环境配置
首先,我们需要编译器环境。但是在此之前,需要先将apt下载源进行更改。不同版本ubantu有不同的改法,笔者设置如下:
sudo su
vi /etc/apt/sources.list
东西全删了,改为:
deb https://mirrors.cloud.tencent.com/ubuntu/ bionic main universe
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
接下来所有脚本默认管理员权限了,不再sudo。对apt-get进行更新:
apt-get update
如果你在之后的环境配置中遇到依赖包需要降低版本的问题,可以先装一个aptitude工具:
apt-get install aptitude
接着安装编译环境:
apt install build-essential
apt install cmake
apt install lang
build-essential包括了gcc,g++,make等。笔者版本如下:gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3);GNU Make 4.1。
如果发现gcc、g++、make、cmake、clang中的任何一个不能再shell中直接调用,请用apt或aptitude重新单独安装。
由于直接在Ubuntu环境下下载文件可能不太方便,建议利用VMware tools设置一处共享文件夹,方便资源的转移。
配置python
python选的是2.7的默认版本,2.7.6。直接apt下载即可。
apt install python2.7
tar -zxvf pip-9.0.1.tar.gz
cd pip-9.0.1
python2.7 setup.py install
请注意,pip并不是必须安装的,只是怕出现py包依赖出现莫名其妙的问题,可以临时查缺补漏。
请注意,pip和pip2此时都会指向pip-9.0.1。
接下来,由于本项目中用到的不同脚本对py的调用有多种写法,我们需要将python、python2都链接到默认环境变量名python2.7上。建议使用纯净的环境进行配置,倘若存在python3环境可能与2.7产生冲突。设置如下:
echo alias python=python2.7 >> ~/.bashrc
echo alias python2=python2.7 >> ~/.bashrc
source ~/.bashrc
安装Z3
请不要用pip安装z3-solver!这可能导致严重的版本偏差和文件错误依赖。我们需要自己编译并安装z3环境。
操作如下(参考链接):
git clone https://github.com/Z3Prover/z3.git
cd z3
python scripts/mk_make.py
cd build
make
sudo make install
如果这一步出现问题,请重新验证编译器GCC或clang环境是否正常。
另外给出卸载z3的方法:
cd z3/build
sudo make uninstall
笔者的z3版本是Z3 version 4.8.15 - 64 bit。
请注意,此时应该可以直接在脚本中调用Z3,但是在python2.7中无法import z3。因此需要添加py的库依赖路径:
vi /etc/profile
在文本最后添加(注意改成你自己的z3路径):
export PYTHONPATH=$PYTHONPATH:/usr/local/z3/build/python/
保存更改:
source /etc/profile
此时在python2.7中应当可以import z3。出现任何报错,都说明依赖路径没有设置到位。
安装LLVM5.0.0
这是本项目复现最麻烦的一步!请耐心做完,直接apt会导致llvm缺少工具,无法使用!
首先在这里下载llvm5.0.0: LLVM Download Page 下载如下源码包:
假设当前路径为~/llvm/,且下载好的内容都在这里。解压并整理:
tar -xf cfe-5.0.0.src.tar.xz
tar -xf clang-tools-extra-5.0.0.src.tar.xz
tar -xf compiler-rt-5.0.0.src.tar.xz
tar -xf libcxx-5.0.0.src.tar.xz
tar -xf llvm-5.0.0.src.tar.xz
mv cfe-5.0.0.src clang
mv clang/ llvm-5.0.0.src/tools/
mv clang-tools-extra-5.0.0.src extra
mv extra/ llvm-5.0.0.src/tools/clang/
mv compiler-rt-5.0.0.src compiler-rt
mv compiler-rt llvm-5.0.0.src/projects/
整理后路径下应该只剩下libcxx-5.0.0.src和llvm-5.0.0.src了。保持在这个路径,进行操作:回到上一级创建build文件夹
cd ..
mkdir build
cd build
cmake ../llvm -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE=Release -DLLVM_USE_LINKER=gold
../llvm
是你自己的路径。若遇到错误,请检查你的cmake、g++环境是否正常。
接下来进行编译与安装,这一步非常耗时,且容易出错:
make -j4
sudo make install
安装完成后,llvm应当能够在shell中直接调用。
验证Hyperkernel
先把多线程数拉满:
cat /proc/sys/kernel/threads-max
echo 333333 > /proc/sys/kernel/threads-max
cat /proc/sys/kernel/threads-max
下载项目 GitHub - uw-unsat/hyperkernel 。
将工作目录移到项目目录下。
完整的验证,直接输执行:
make hv6-verify
图中.
是验证成功,E
是error,F是failure。需要说明的是,内存错误和线程错误都会带来验证错误。完整验证估计需要耗费20h以上的时间。
单独验证可以执行:
make hv6-verify -- -v --failfast HV6.test_sys_set_runnable
运行 Irpy 测试套件(似乎完整验证完成前无法执行):
make irpy/test
结语
本文由@CarpVexing发布于2022.2。Hyperkernel实际上已然是五年前的项目了,已经有了不少Applications and extensions,值得一看。接下来笔者考虑深入了解一下z3,有机会再作新文。
Hyperkernel验证实验的复现与z3环境初识的更多相关文章
- 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155303 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹): ...
- 【经典漏洞案例】NSA黑客工具包——Windows 0day验证实验
还记得今年4月中旬,Shadow Brokers(影子经纪人)黑客组织发布出一份震惊世界的机密文档,其中包含了多个Windows 远程漏洞利用工具,此工具集覆盖大量的Windows服务 器,可以被任何 ...
- 20155318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155318 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)命令行下Java程序开发 步骤一(新建文件夹): 打开windows下的cmd → ...
- multipath多路径实验01-构建iscsi模拟环境
multipath多路径实验01-构建iscsi模拟环境 前几天跟同事网上闲聊技术,吐槽之前自己没有配置过多路径的经历,虽然多路径的配置过程很简单,职责划分也应是主机或存储工程师来搞定,DBA只需要直 ...
- 20162308 实验一《Java开发环境的熟悉》实验报告
a 20162308 实验一<Java开发环境的熟悉>实验报告 实验内容 使用JDK编译.运行简单的Java程序. 使用IDEA 编辑.编译.运行.调试Java程序. 实验要求 没有Lin ...
- 20162330 实验一 《Java开发环境的熟悉》 实验报告
2016-2017-2 实验报告目录: 1 2 3 4 5 20162330 实验一 <Java开发环境的熟悉> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1623 ...
- 20162302 实验一《Java开发环境的熟悉》实验报告
实 验 报 告 课程:程序设计与数据结构 姓名:杨京典 班级:1623 学号:20162302 实验名称:Java开发环境的熟悉 实验器材:装有Ubuntu的联想拯救者80RQ 实验目的与要求:1.使 ...
- 2018-2019-2 20175306实验一《Java开发环境的熟悉》实验报告
2018-2019-2 20175306实验一<Java开发环境的熟悉>实验报告 一.实验内容及步骤 实验一 Java开发环境的熟悉-1 ·建立有自己学号的实验目录. ·通过vim Hel ...
- #2018-2019-2-20175204 张湲祯 实验一 《Java开发环境的熟悉》实验报告
2018-2019-2-20175204 张湲祯 实验一 <Java开发环境的熟悉>实验报告 一.实验内容及步骤 一.使用JDK编译.运行简单的Java程序 1.输入cd zyz命令进入z ...
- 2018-2019-20175315 实验一 《Java开发环境的熟悉》实验报告
2018-2019-20175315实验一 <Java开发环境的熟悉>实验报告 一.实验内容及步骤 实验1 1.用mkdir建立“20175303exp1”的目录 2.在“20175303 ...
随机推荐
- Java 接口与接口的多继承关系
接口与接口之间是多继承的 注意事项:1. 多个父接口中的抽象方法重复,没关系2. 多个父接口中默认方法重复,子接口必须进行默认方法的覆盖重写 //接口A public interface MyInte ...
- 不安全的权限 0644,建议使用 0600 虚拟机无法分配内存 virtual memory exhausted: Cannot allocate memory
我都不知道我写了啥,自己都很混乱 aoteman@aoteman-virtual-machine:/tmp$ sudo -s #进入root用户模式 [sudo] aoteman 的密码: 12对不起 ...
- 像这个TSC打印机售后维修服务平台网站,是如何做到复制不到网站里面的内容的?
这个条码之家是TSC打印机售后维修服务平台网站 网址是这个,http://www.tiaomazhijia.com 打开网站,复制不了里面的内容,右健也另存不了图片等,是如何做到的. tsc显示错误亮 ...
- 【C++复习】第七章 类的继承(基类、派生类、虚基类)
1.基类与派生类 类的继承:面向对象的程序设计中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体.更详细的定义 用途:代码的重用性(继承)和可扩充性(派生) 例:植物大战僵尸游戏中, ...
- continue练习
using System; namespace continue_的练习 { class Program { static void Main(string[] args) { int sum = 0 ...
- C#连接数据库实现开发图书管理系统操作代码
//客户端登录界面(Form1.cs窗口体系) using System; using System.Collections.Generic; using System.ComponentModel; ...
- LP1-3:一支钢笔的测试
UI: 长.宽 .高 钢笔:笔身.笔尖.笔帽 功能: 写字:出水量比较合适 笔帽能扣上,不容易掉 钢笔笔夹 打水 笔尖的粗细程度 容错性: 不能漏水 易用性: 是否光滑 笔尖是否可以换 笔囊是否可以换 ...
- 11 个Chrome骚技巧让你为所欲为
1.曾经,在线调伪类样式困扰过你? 2.源代码快速定位到某一行 ctrl + p 3.联调接口失败时,后台老哥总管你要 response? 4.你还一层层展开 dom:Alt + Click 5.是不 ...
- git 本地电脑重新装git后 更新github项目报错 fatal: detected dubious ownership in repository at
解决方法参考: fatal: detected dubious ownership in repository at 'D:/'之解决方法 1.今天在学习git的时候出现这个错误: 2.执行下面代码即 ...
- jvm中的年轻代 老年代 持久代 gc ----------转载
jvm中的年轻代 老年代 持久代 gc 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation) ...